CAPTheoremCAP定理的发展1985年,Lynch证明了在异步通信中不存在一致的分布式算法(FLPImpossibility)。2000年,EricBrewer在PODC研讨会上提出了一个猜想(CAP理论猜想):一致性、可用性和分区容错性在分布式系统中不能同时满足,最多只能同时满足其中的两个!2002年,林奇和吉尔伯特证明了布鲁尔的猜想,论文链接(可访问)。分布式系统中的CAP定理是什么?CAP定理是一个基本定理,它证明了在分布式系统中不可能同时获得以下三个性质。Consistency,一致性,在分布式系统中,写操作完成后发生的读操作,必须返回这个值或者一个更新的写操作值Availability,可用性,系统中非故障节点收到的每一个请求,都必须产生一个响应。Partitiontolerance,分区容错,一条消息从一个节点发送到另一个节点,允许任意数量的消息由于网络原因丢失。上述定义来源于Lynch和Gilbert在论文中给出的定义。证明论文采用反证法:假设存在同时满足Consistency、Availability、Partitiontolerance的算法A。那么我们来模拟一个反例请求。假设我们有一个包含两个节点的集群。由于算法A满足CAP,根据Partitiontolerance假设两个节点之间的消息丢失。客户端向其中一个节点发起写入请求。请求完成后,数据由V0→V1变化;由于节点之间的消息丢失了,所以对方节点的数据还是V0;客户端向两个节点发送读取请求,根据可用性(Availability),两个节点都会响应请求,一个节点响应数据V1,另一个节点响应数据V0;由于一个节点返回数据V0,这个数据是一次写操作完成后的数据,违反了一致性(Consistency)的定义。这证明在分布式系统中,不能同时满足CAP。权衡由于在分布式系统中不能同时满足CAP,设计者必须根据实际需要进行权衡。让我们来看看常见的模型。CP模型牺牲了一定的可用性来保证一致性和分区容错性。一个简单的中心算法就可以满足CP要求。一个中心节点维护数据,其他节点收到客户端请求后自动将请求重定向到中心节点。得到中心节点的ack后,将数据响应给客户端。结尾。如果系统需要保证强一致性,可以选择CP模型来实现。CA模型没有分区容错,即不存在网络丢失的可能性。在单体应用中,不会因为节点间的数据通信而丢失消息。在分布式系统中,由于节点之间的网络交互,必须考虑分区容错,可以不考虑CA模型。AP模型牺牲了系统的强一致性来保证可用性和分区容错性。在没有一致性约束的情况下,系统中的节点可以用初始值V0响应每个请求,从而满足可用性要求。当然,系统在实际使用中仍然可以提供一定的弱一致性保证。例如,在分布式系统中,可以为节点使用的本地缓存设置一个有效时间,当超过有效时间后,重新加载本地缓存,以保证一定的一致性。生活中的例子:周末去菜市场买酸菜,在家做酸菜鱼。我:我来到酸菜摊,拿起一包酸菜,问:“这酸菜多少钱一包?”老板娘:“7元”;老板:“6块钱”在这个小故事里,我们分别看到了老板娘和老板娘。操作是分布式系统中的两个节点。根据我们上面介绍的可能模型,这是一个AP模型,牺牲了一定的一致性。故事还在继续,当老板说完6块钱的时候,只见老板娘恶狠狠地瞪着老板。那么如果老板不想再出现这种问题,该怎么办呢?见下图。老板接到询价后,可以问老板娘酸菜的价格是多少,然后回复我。在这种场景下,如果老板娘耳聋,迟迟不回复老板的消息,会对整体的可用性造成一定的影响,所以这是一个CP选择。故事的结局:我买了这袋酸菜,给了老板7块钱。我觉得我赚了我的血,你觉得呢?参考[1]https://mwhittaker.github.io/...[2]https://github.com/psyho/dypl...
