1. The Cap theory of Distributed System
在分布式系统中有个CAP理论,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
对于P(分区容忍性)而言,是实际存在 从而无法避免的。因为,分布系统中的处理不是在本机,而是网络中的许多机器相互通信,故网络分区、网络通信故障问题无法避免。因此,只能尽量地在C 和 A 之间寻求平衡。对于数据存储而言,为了提高可用性(Availability),采用了副本备份,比如对于HDFS,默认每块数据存三份。某数据块所在的机器宕机了,就去该数据块副本所在的机器上读取(从这可以看出,数据分布方式是按“数据块”为单位分布的)
但是,问题来了,当需要修改数据时,就需要更新所有的副本数据,这样才能保证数据的一致性(Consistency)。因此,就需要在 C(Consistency) 和 A(Availability) 之间权衡。C与A之间存在一个Trade-Off。
而Quorum机制,就是这样的一种权衡机制,一种将“读写转化”的模型。
2.WARO(Write All Read one)协议
介绍Quorum之前,先看一个极端的情况:WARO机制。
WARO原理:机制很简单,当Client请求向某副本写数据时(更新数据),只有当所有的副本(所有Replicas)都更新成功之后,这次写操作才算成功,否则视为失败。
我们不难得出以下两种结论:
- 写操作很脆弱,因为只要有一个副本更新失败,此次写操作就视为失败了。
- 读操作很简单,因为,所有的副本更新成功,才视为更新成功,从而保证所有的副本一致。这样,只需要读任何一个副本上的数据即可。
- 假设有N个副本,N-1个都宕机了,剩下的那个副本仍能提供读服务;但是只要有一个副本宕机了,写服务就不会成功。
该协议在W成功的基础上可以进行R操作,R操作很简单。WARO牺牲了更新服务的可用性,最大程度地增强了读服务的可用性。而Quorum就是更新服务和读服务之间进行一个折衷。
3.Quorom算法分析
Quorom机制是对“抽屉原理”的一个应用。
Define:假设有N个副本
- 更新操作wi 在W个副本中更新成功之后,才认为此次更新操作wi 成功。称成功提交的更新操作对应的数据为:“成功提交的数据”。
- 对于读操作而言,至少需要读R个副本才能读到此次更新的数据。
- 其中,W+R>N ,即W和R有重叠。一般,W+R=N+1。
假设系统中有5个副本,W=3,R=3。初始时数据为(V1,V1,V1,V1,V1)--成功提交的版本号为1,当某次更新操作在3个副本上成功后,就认为此次更新操作成功。数据变成:(V2,V2,V2,V1,V1)--成功提交后,版本号变成2,因此,最多只需要读3个副本,一定能够读到V2(此次更新成功的数据)。而在后台,可对剩余的V1 同步到V2,而不需要让Client知道。
3.1 Quorom机制分析
Quorum机制无法保证强一致性。
所谓强一致性就是:任何时刻任何用户或节点都可以读到最近一次成功提交的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。
仅仅通过Quorum机制无法确定最新已经成功提交的版本号。
比如,上面的V2 成功提交后(已经写入W=3份),尽管读取3个副本时一定能读到V2,如果刚好读到的是(V2,V2,V2),则此次读取的数据是最新成功提交的数据,因为W=3,而此时刚好读到了3份V2。如果读到的是(V2,V1,V1),则无法确定是一个成功提交的版本,还需要继续再读,直到读到V2的达到3份为止,这时才能确定V2 就是已经成功提交的最新的数据。
问:如何读取最新的数据?
答:在已经知道最近成功提交的数据版本号的前提下,最多读R个副本就可以读到最新的数据了。
问:如何确定 最高版本号 的数据是一个成功提交的数据?
答:继续读其他的副本,直到读到的 最高版本号副本 出现了W次。
3.2 基于Quorom机制选择primary
中心节点(服务器)读取R个副本,选择R个副本中版本号最高的副本作为新的primary。
新选出的primary不能立即提供服务,还需要与至少与W个副本完成同步后,才能提供服务---为了保证Quorum机制的规则:W+R>N。
至于如何处理同步过程中冲突的数据,则需要视情况而定。
比如,(V2,V2,V1,V1,V1),R=3,如果读取的3个副本是:(V1,V1,V1)则高版本的 V2需要丢弃。
如果读取的3个副本是(V2,V1,V1),则低版本的V1需要同步到V2。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------参考:https://zhuanlan.zhihu.com/p/61896391
标签:副本,Quorom,V2,更新,成功,V1,算法,解析,数据 From: https://www.cnblogs.com/NarutoFly/p/17108196.html