Quorum NWR 意义
Quorum NWR (/ˈkwɔːrəm/)算法提供了一种灵活的方式,使得使用者可以根据业务需求调整参数,以在一致性和可用性之间找到合适的平衡点。同时,能够实现客户端一致性。
客户端一致性:不论存储方是如何存储的,当 W+R>N 的时候,读取的时候一定能读到最新的数据。下面论述中的“强一致性”均表示的是客户端一致性。
Quorum NWR 三要素
- N:副本数量(Number of Replicas),即一个数据项在集群中有多少个副本。
- W:写入确认数量(Write Quorum),表示在一次写操作被认为成功之前,需要有多少个副本确认接收到写操作。
- R:读取确认数量(Read Quorum),表示在一次读操作返回结果之前,需要从多少个副本中获取数据。

- 以上图的三节点集群为例,DATA-1 有 2 个副本,DATA-2 有 3 个副本,DATA-3 有 1 个副本。
- 需要注意的是,实现 Quorum NWR 的时候,需要实现自定义副本的功能。即用户可以自定义指定数据的副本数。
- N、W、R 值的不同组合,会产生不同的一致性效果,具体来说,有这么两种效果:
- 当 W + R > N 的时候,对于客户端来讲,整个系统能保证强一致性,一定能返回更新后的那份数据。
- 当 W + R ⇐ N 的时候,对于客户端来讲,整个系统只能保证最终一致性,可能会返回旧数据。
- 为了明确哪个节点上的数据是最新的,需要引入时间戳或版本号等机制来进行评判。
Quorum NWR 工作原理
- 写操作:
- 当客户端发起一个写请求时,协调者会将这个请求转发给 N 个副本。
- 只有当至少 W 个副本确认接收到写请求后,这次写操作才会被认为是成功的,并向客户端返回确认信息。
- 如果 W > N/2,则可以保证强一致性,因为这确保了任何两个写操作之间有足够的重叠,使得最新的写操作总能覆盖旧的数据。
- 读操作:
- 客户端发起读请求时,协调者会联系 R 个副本以获取数据。
- 只要从 R 个副本中收集到足够的响应,协调者就可以向客户端返回数据。
- 如果 R > N/2 并且 W + R > N+1,那么可以保证读取到的是最新的数据版本,因为这意味着任何一个读集和写集都会有交集,从而避免读取到过期的数据。
扩展问题
- AP 系统基础上实现了 Quorum NWR,岂不是 CAP 都具有了?
- 尽管通过 N、W、R 组合,可以实现不同的一致性级别,但对于同一份数据而言,CP 和 AP 是不可兼得。
- NWR 在 P 不发生的时候,AP 系统实现了客户端侧(注意,仅仅是客户端侧,并不是真实的线性一致性)的 C。
- C 是指系统能被外部访问到的节点都表现出一致性,用了 NWR 后,访问 AP 系统有些节点返回旧的数据,有些又返回新的数据,这其实不满足 C 了,只不过 NWR 多了一层比较操作,使得最终数据对于上层业务来讲是强一致的(也就是文中所讲的“客户端侧的一致性”)
- Raft 协议满足了写超过半数,那我们就让 R 也超过半数以上,就能保证基于 raft 协议还能做出强一致性的需求。
- 作者表示没必要,可以直接读取 Leader 节点就可以有强一致性需求。
- 自己思考,如果 Leader 压力大,就可以通过 R 超过半数来缓解 Leader 压力?但是节点多的情况下,需要访问的节点数目比较多,其他节点压力可能比较大。
- N3W2R2 配置,第一次写入只有一个节点成功,返回客户端错误。此时有个读取操作,读到了成功的那个副本,返回了这份数据,那么不就出现了问题?
- 是存在这个现象。能保证“写成功后,一定能读取到更新后的值”,但是不能保证“写失败,只能读取到之前的值”。对于后者需要实现事务。即,在实现系统时,需要根据场景特点选择适合的技术。