当副本节点出现故障时会发生什么情况,具有法定人数的一致性级别?
What happens when a replica node goes down, with consistency level of quorum?
场景:
- 节点总数:3 [A、B、C]
- 复制因子:2
- 写入一致性:Quorum(2个副本需要确认)
- 读取一致性:法定人数
节点分区范围:
- A [ 主 1-25,副本 26-50]
- B [ 主 26-50,副本 51-75]
- C [ 主 51-75,副本 1-25]
问题:
假设我需要插入数据30,节点A宕机了。在这种情况下 Cassandra 的行为会是什么? Cassandra 是否能够写入数据并将成功报告回驱动程序(即使副本节点已关闭并且 Cassandra 需要 2 个节点来确认写入)?
您只有 1 个副本可用于写入 (B),因此写入时会出错 (UnavailableException
)。
最好设计您的一致性级别/复制因子,以便您可以容忍令牌范围内的节点故障(考虑将您的 RF 提高到 3)。
另外最好不要尝试按照最终一致性路径(R + W <= N)来解决可用性问题,例如在这种情况下设置 W=1。我们已经尝试过了,但在操作上不值得付出努力。
RF=2 背后有充分的理由吗?在这种情况下,在节点关闭的情况下不会满足 Quorum 并且您的写入将失败。我建议你重新检查一下你的 RF。
您已确定 RF=2 不是高可用性 Cassandra 部署的建议复制因子的关键原因之一。会发生什么取决于驱动程序行为(tokenaware 打开或关闭)。
- 节点 B 或 C 将被选为协调器
- 协调器将尝试写入 B 和 A,因为 2 的法定人数是 2
- 协调器将注意到节点 A 尚未确认写入,因此向客户端报告无法实现法定人数。
注意,这并不意味着写入节点 B 失败...实际上值已写入节点 B,协调器将为节点 A 存储提示。但是您尚未实现一致性目标,因此在大多数情况下,建议您再次尝试写入,直到节点恢复正常。在这种特定情况下,您正在有效地执行所有操作,这不会在节点故障情况下给出预期的行为。
TLDR,不要使用 RF=2 的 Quorum
场景:
- 节点总数:3 [A、B、C]
- 复制因子:2
- 写入一致性:Quorum(2个副本需要确认)
- 读取一致性:法定人数
节点分区范围:
- A [ 主 1-25,副本 26-50]
- B [ 主 26-50,副本 51-75]
- C [ 主 51-75,副本 1-25]
问题:
假设我需要插入数据30,节点A宕机了。在这种情况下 Cassandra 的行为会是什么? Cassandra 是否能够写入数据并将成功报告回驱动程序(即使副本节点已关闭并且 Cassandra 需要 2 个节点来确认写入)?
您只有 1 个副本可用于写入 (B),因此写入时会出错 (UnavailableException
)。
最好设计您的一致性级别/复制因子,以便您可以容忍令牌范围内的节点故障(考虑将您的 RF 提高到 3)。
另外最好不要尝试按照最终一致性路径(R + W <= N)来解决可用性问题,例如在这种情况下设置 W=1。我们已经尝试过了,但在操作上不值得付出努力。
RF=2 背后有充分的理由吗?在这种情况下,在节点关闭的情况下不会满足 Quorum 并且您的写入将失败。我建议你重新检查一下你的 RF。
您已确定 RF=2 不是高可用性 Cassandra 部署的建议复制因子的关键原因之一。会发生什么取决于驱动程序行为(tokenaware 打开或关闭)。
- 节点 B 或 C 将被选为协调器
- 协调器将尝试写入 B 和 A,因为 2 的法定人数是 2
- 协调器将注意到节点 A 尚未确认写入,因此向客户端报告无法实现法定人数。
注意,这并不意味着写入节点 B 失败...实际上值已写入节点 B,协调器将为节点 A 存储提示。但是您尚未实现一致性目标,因此在大多数情况下,建议您再次尝试写入,直到节点恢复正常。在这种特定情况下,您正在有效地执行所有操作,这不会在节点故障情况下给出预期的行为。
TLDR,不要使用 RF=2 的 Quorum