Quorum NWR 算法
[TOC]
Quorum NWR,可以灵活地自定义一致性,当 W + R > N 时,就可以实现强一致性了。
Quorum NWR 是非常实用的一个算法,能有效弥补 AP 型系统缺乏强一致性的不足,给业务提供了按需调整一致性级别的灵活度。
NWR 的三要素
N 表示集群中同一份数据有多少个副本,又叫做复制因子(Replication Factor)。副本数可以不等于节点数,不同的数据可以有不同的副本数。
W,写一致性级别(Write Consistency Level),表示成功完成 W 个副本更新,才完成写操作。
R,读一致性级别(Read Consistency Level),表示读取一个数据对象时需要读 R 个副本,读取指定数据时,要返回 R 个副本中最新的那份数据。
N、W、R 值的不同组合,会产生不同的一致性效果,
- 当 W + R > N 的时候,对于客户端来讲,整个系统能保证强一致性,一定能返回更新后的那份数据。
- 当 W + R <= N 的时候,对于客户端来讲,整个系统只能保证最终一致性,可能会返回旧数据。
当 W + R > N 时,可以实现强一致性。通过读取多副本,比较得到最新的数据。
N 决定了副本的冗余备份能力;
- 如果设置 W = N,读性能比较好;
- 如果设置 R = N,写性能比较好;
- 如果设置 W = (N + 1) / 2、R = (N + 1) / 2,容错能力比较好,能容忍少数节点(也就是 (N - 1) / 2)的故障。
InfluxDB 企业版
InfluxDB 副本数不能超过节点数据,因为在一个节点存在多个副本没有多大意义。
InfluxDB 企业版,支持“any、one、quorum、all”4 种写一致性级别
- any:任何一个节点写入成功后,或者接收节点已将数据写入 Hinted-handoff 缓存(也就是写其他节点失败后,本地节点上缓存写失败数据的队列)后,就会返回成功给客户端。
-
one:任何一个节点写入成功后,立即返回成功给客户端,不包括成功写入到 Hinted-handoff 缓存。
- quorum:当大多数节点写入成功后,就会返回成功给客户端。此选项仅在副本数大于 2 时才有意义,否则等效于 all。
- all:仅在所有节点都写入成功后,返回成功。
对时序数据库而言,读操作常会拉取大量数据,查询性能是挑战,是必须要考虑优化的,因此,在 InfluxDB 企业版中,不支持读一致性级别,只支持写一致性级别。另外,我们可以通过设置写一致性级别为 all,来实现强一致性。
实现
副本数 N 不要超过节点数。
在写W个副本是,为了防止写入失败的情况,需要保持写操作的幂等性。方便重试。
实际中,一般2副本或3副本可能满足需求了。太多副本,影响性能。
在 KV数据 存储场景,需要给副本生成版本号,方便比较。而时序数据不需要,因为一条时序数据记录是没有“新旧”之说的。