副本节点发生故障时会发生什么,具有仲裁的一致性级别?

时间:2016-10-30 19:14:11

标签: cassandra datastax datastax-enterprise cassandra-3.0

情境:

  • 总节点:3 [A,B,C]
  • 复制因子:2
  • 写一致性:法定人数(需要2个副本)
  • 读取一致性:Quorum
  • 节点分区范围:

    • A [primary 1-25,replica 26-50]
    • B [primary 26-50,replica 51-75]
    • C [primary 51-75,replica 1-25]

问题:

假设我需要插入数据30并且节点A已关闭。在这种情况下,卡桑德拉的行为是什么? Cassandra是否能够写入数据并将成功报告给驱动程序(即使副本节点已关闭且Cassandra需要2个节点来确认写入)?

3 个答案:

答案 0 :(得分:2)

您只有1个副本可用于写入(B),因此您将在写入时遇到错误(UnavailableException)。

最好设计一致性级别/复制因子,以便您可以容忍节点在令牌范围内的失败(考虑将RF提高到3)。

最好不要尝试通过遵循最终一致性路径(R + W <= N)来解决可用性,例如,在这种情况下,W = 1。我们已经尝试过,在操作上它不值得努力。

答案 1 :(得分:2)

RF = 2背后有充分的理由吗?在给定方案的情况下,Quorum在节点关闭方案中不会满意,并且您的写入将失败。我建议你重温一下你的RF。

答案 2 :(得分:1)

您已经确定了RF = 2不是高可用性Cassandra部署的建议复制因子的一个主要原因。将会发生什么取决于驾驶员的行为(令人敬畏的打开或关闭)。

  1. 将选择节点B或C作为协调员
  2. 协调员将尝试写入B和A,因为法定人数为2
  3. 协调员将注意到节点A未确认写入,因此向客户端报告无法实现仲裁。
  4. 注意,这并不意味着对Node B的写入失败...实际上该值被写入Node B,协调器将为Node A存储一个提示。但是你没有达到你的一致性目标所以它是可能建议您再次尝试写入,直到节点在大多数情况下重新启动。在这种特定情况下,您正在有效地执行ALL,这将无法在节点故障情况下提供预期的行为。

    TLDR,不要使用Quorum,RF = 2