Quorum NWR 自定义一致性
问题
我们已经有一个 AP 型的 KV 系统了,现在要求数据具有强一致性,怎么办?重新实现吗?成本太高了,不划算。能不能自定义一致性,使得系统在 AP 和 CP 之间切换?
原理
Quorum NWR 是一种实现一致性的方法,更重要的是,它可以根据业务的特点,灵活地自定义一致性级别。Quorum NWR 包括三要素:
- N:复制因子,表示集群中同一份数据有多少份副本。实现时要注意,用户可以自定义副本的数量。
- W:写一致性级别,表示写操作更新完多少个副本后才算完成。
- R:读一致性级别,表示读取某个数据时,需要同时读取多少个副本,并返回其中最新的数据。
N、W、R 值的不同组合,会产生不同的一致性结果:
- 当 W + R > N 时,对于客户端来讲,系统能保证强一致性,更新数据后,后续的访问一定能读到更新后的值。
- 当 W + R <= N 时,对于客户端来讲,系统只能保证最终一致性,更新数据后,可能读到旧的值,但是最终一定会读到更新后的值。
实现
W 表示写操作要更新完 W 个副本才算完成。这个写操作需要用来类似二阶段提交协议来保证事务性。
R 表示需要读取 R 个副本,并返回其中最新的数据。这里如何判断哪个数据是最新的呢?通常写入数据时会加上版本号。一般不选择时间戳,因为分布式系统里时间同步是个难题。
应用
一般而言,不推荐副本数超过节点数。副本的意义在于冗余备份。如果副本数超过了节点数,说明一个节点上有多个副本。当这个节点故障时,节点上的所有副本都会受到影响。
当 W + R > N 时,系统就能实现强一致性。W、R、N 值的选择取决于你想优化哪方面的性能,
- N 决定了备份能力。
- 如果 W == N,那么 R = 1 即可,也就是读取速度快。
- 如果 R == N,那么 W = 1 即可,也就是写入速度快。
- 如果 W = (N + 1) / 2,R = (N + 1) / 2,表示系统容错性高。只要不超过半数节点故障,都能保证一致性。