1

设想:

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

    • A [主 1-25,副本 26-50]
    • B [主要 26-50,副本 51-75]
    • C [主 51-75,副本 1-25]

问题:

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

4

3 回答 3

3

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

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

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

于 2016-10-30T20:08:39.797 回答
2

RF=2 背后有强有力的理由吗?在这种情况下,Quorum 在节点关闭的情况下不会得到满足,您的写入将失败。我建议你重新审视你的射频。

于 2016-10-30T20:09:35.220 回答
1

您已经确定了 RF=2 不是高可用 Cassandra 部署的建议复制因素的关键原因之一。会发生什么取决于驱动程序的行为(令牌感知打开或关闭)。

  1. 节点 B 或 C 将被选为协调者
  2. 协调器将尝试同时写入 B 和 A,因为 2 的 Quorum 是 2
  3. 协调器将注意到节点 A 尚未确认写入,因此向客户端报告无法实现仲裁。

请注意,这并不意味着写入节点 B 失败......事实上,该值已写入节点 B,并且协调器将为节点 A 存储提示。但是,您尚未实现一致性目标,因此可能建议您这样做在大多数情况下,您会再次尝试写入,直到节点恢复。在这种特定情况下,您正在有效地执行 ALL,这不会在节点故障情况下给出预期的行为。

TLDR,不要使用 RF=2 的 Quorum

于 2016-10-31T14:35:57.000 回答