分布式系统知识分享:正确理解帽定理

  

  <强>前言   

  

  帽的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析。因此自己参考部分资料梳理了一篇与大家互相分享一下。   

  

  标题写了正确理解,或许某些点不是百分百正确或者有歧义,但是希望与各位分享讨论后达到最终正确。   

  

  <强>   

  

  帽定理,又被称作布鲁尔定理(布鲁尔定理),是埃里克·布鲁尔教授在2000年提出的一个猜想,它指出对于一个分布式系统来说,不可能同时满足以下三点:   

  

  ·一致性(一致性):所有节点看到相同的数据在同一时间。(所有节点在同一时间具有相同的数据)   

  

  ·可用性(可用性):保证每个请求接收响应是否成功或失败。(保证每个请求不管成功或者失败都有响应)   

  

  ·分区容忍(分隔容忍):系统继续运行,即使系统的任何一个部分丢失或失败。(系统中任意信息的丢失或失败不会影响系统的继续运作)   

  

  很多书籍与文章引用格林尼罗伯特在2014年8月写的一篇博文,。相比与看着布鲁尔教授一脸懵逼的定义,罗伯特·格林尼的更加容易理解。   

  

  <强>   

  

  <强>原文:在一个分布式系统(一组相互连接的节点共享数据。),你只能有两个以下三个担保在一双写/读:一致性、可用性和分区容忍——其中之一必须牺牲。   

  

  <强>翻译:在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(一致性),可用性(可用性),分区容错性(分区容忍)三者中的两个,另外一个必须被牺牲。   

  

  <>强关键字:互连节点(互连节点),共享数据(共享数据),一双写/读(读/写)   

  

  从上面一段话,有几个,也就是说我们聊帽定理的时候,是在具有数据读写,数据共享和节点互连的前提下,对上面三者选其二,也是建议我们不要花费时间与精力同时满足三者。   

  

  举例说明,网页集群,memcached集群不属于讨论对象   

  

  网络集群只是资源复制分配在不同的节点上,然而节点间没有互连,也没有数据共享(sessionid、内存缓存)。   

  

  memcached集群数据存储是通过客户端实现哈希一致性,但是集群节点间不互连的,也没有数据共享。   

  

  总得来说,帽定理讨论的并不是分布式系统所有的功能。   

  

     

  

  <强>原文:读保证返回最近写对于一个给定的客户端。   

  

  <强>翻译:对某个指定的客户端来说,读操作保证能够返回最新的写操作结果   

  

  <>强关键字:一个给定的客户(指定的客户端)。   

  

  这里的一致性与我们平常了酸解的一致性有点偏差,酸的一致性关注的是数据库的数据完整性。   

  

  上面定义没说明是所有节点必须在同一时间数据一致,而关注点在客户端,假如有个场景,您在ATM(客户端)往某张银行卡存500元后,立刻在ATM发起查询余额的时候会显示加了500元后的余额,随后我们也能把这500元取出来。查询余额读操作可以是写后立刻读的主库,也或者写后某个时间段过后(中途无写)读从库。   

  

     

  

  <强>原文:一个非故障节点将返回一个合理的响应在一个合理的时间内(无错误或超时)。   

  

  <强>翻译:非故障节点将在合理的时间内返回合理的响应(不是错误或超时)。   

  

  <>强关键字:非故障节点(非故障节点),合理的响应(合理的响应)   

  

  这里的可用性和我们平常所理解的高可用性有点偏差,高可用性指系统无中断的执行其功能的能力。   

  

  已故障的节点就不具有可用性了,因为请求结果要么错误要么超时。合理的响应没有说明是成功还是失败,但是响应应该具有是否成功的精确描述。例如我们读取sql server集群的某从库,同步需要时间,读取出来可能不是最新的数据,但却是合理的响应。   

  

     

  

  <强>原文强:系统将继续发生函数当网络分区。   

  

分布式系统知识分享:正确理解帽定理