分布式存储|来聊聊Quorum NWR如何自定义一致性
文章目录
- 强一致性和最终一致性
- 什么是Quorum NWR
- Quorum NWR的三要素
- Dynamo的NWR模型
- 如何发现不一致副本
强一致性和最终一致性 ?如果部门想做一个业务数据的实时分析系统,希望数据写入成功后就能马上读取到最新的数据,其实就是要求实现一个强一致性系统,数据更新后能立即查询到。
?那么,在这里面首先要搞清楚强一致性和最终一致性有什么区别。
- 强一致性:保证写操作完成后,任何后续访问都能读取到最近更新成功后的数据
- 最终一致性:如果对某个对象没有新的写操作了,最终所有后续访问经过一段时间后都能读到相同的最近更新的值。也就是说,写操作完成后,后续访问可能会读到旧的数据。
? 在AP型分布式系统中(比如Dynamo、cassandra、InfluxDB的集群),Quorum NWR通常都是会实现的一个功能。这样,用户可以根据业务的特点,灵活地指定一致性级别。
? 下面我们首先来了解下NWR的原理。
? Quorum NWR的核心内容就是N,W,R。一般就是通过组合这三个要素来实现自定义一致性级别的。
Quorum NWR的三要素
- N表示副本数,又叫做复制因子。所以N用来描述同一份数据有多少个副本。
- W表示一次写操作入至少写入W份数据才算写入成功。
- R表示一次读操作至少读到R份数据才算读取成功。
?配置的时候要求W+R>N,因为W+R>N,所以R>N-W表示读取的副本份数一定要比总份数减去确保写成功的份数要大。也就是说,每次读取都能至少读取到一份最新的数据。
? 下面举个例子,如下图所示
文章图片
?从图中你可以看到,DATA-3的读副本数为2。也就是说,客户端读取DATA-3的数据时,需要读取2个副本的数据,然后返回最新的那份数据。
? 无论客户端如何执行读操作,哪怕它读取的是写操作未强制更新副本数据的节点(比如节点N1),但因为W(2)+R(2)>N(3),意思就是访问节点N1执行读操作时,,因为要读2份数据副本,所以除了节点N1上的DATA-3,还会读取节点N2或N3上的DATA-3。而节点N2和N3的DATA-3副本是强制更新成功的。这个时候,返回给客户端肯定是最新的那份数据。
? 所以, 通过设置R为2,即使读到前面问题中的未更新副本数据,也能返回更新后的那份数据从而实现强一致性。
? 除此之外,N、W、R的不同组合,会产生不同的一致性效果。具体如下:
- 当W+R>N的时候,整个系统保持强一致性,一定能返回最新的数据
- 当W+R<=N的时候,对于客户端来讲,整个系统只能保证最终一致性,可能会读取到旧数据。
- 优化写性能(AP)
- 优化读性能(CP)
? 当我们优化读性能(读多写少的场景),可以配置W=N,表示写完所有的副本才算成功,所有只能同步复制。根据公式W+R>N的时候,则R=1,表示只需要读取一个副本即可。这种情况任何一个节点读取成功就成功,但是写的时候必须写所有节点。 - 平衡读写
?当我们的数据不多,单台机器能搞定的时候,可以配置N=2,根据公式W+R>N,则W=2,R=2
? 如果D3数据还没有异步复制到节点C,C处理了一个新的写请求,此时节点C上的数据D4(A,2; C,1)。
? 这个时候,一个收到一个读请求,因为R=N=3,所以要读取3个节点的版本。
- 节点A:(A,2)
- 节点B:(A,2; B,1)
- 节点C:(A,2;
C,1)
? 这个时候可以看到节点A的版本最老被舍弃,但是节点B和C存在版本冲突得交给用户自己做版本冲突管理。dynamo做版本并发控制类似SVN提交代码冲突的原理类似
推荐阅读
- 9班|9班 刘志雪
- 一个人的碎碎念
- 第326天
- 猎杀IP
- 我从来不做坏事
- 年味真的是越来越淡了么
- 感恩之旅第75天
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- 雅集
- 我执意要等,是因为我相信你一定会来