Cassandra:如果所需节点宕机,数据将写入哪个节点?

Cra*_*hax 2 cassandra

假设我有一个具有 3 个节点(节点 0、节点 1 和节点 2)且复制因子为 1 的 Cassandra 集群。假设我想向集群插入新数据,并且分区键将新行定向到节点 1。但是,节点1暂时不可用。在这种情况下,新数据会插入到节点0还是节点2(尽管根据分区键不应该放在那里)?

Jim*_*ick 5

在 Cassandra 中,复制因子 (RF) 决定最终存在多少数据副本,并在键空间层设置/配置。同样,它的目的是定义如果事物“正常”运行,应该存在多少个节点/副本。他们可以通过多种方式接收数据:

  1. 在写入期间 - 假设一切正常运行并且一切都可用
  2. 使用提示切换 - 如果一个/某些节点在配置的时间(< 3 小时)内不可用,cassandra 将在节点再次可用时自动将数据发送到节点
  3. 使用手动修复 - “nodetool Repair”或者如果您使用 DSE,ops center 可以修复/协调表、键空间或整个集群的数据(nodesync 也是 DSE 的新工具,与修复类似)
  4. 在读取修复期间 - 读取操作根据可配置的客户端一致性级别(如下所述)可以比较来自多个节点的数据以确保准确性/一致性,如果不正确则进行修复。

可配置的客户端一致性级别 (CL) 将确定有多少节点必须确认它们已成功接收到数据,以便客户端满意地继续前进(用于写入),或者在读取数据时要与多少节点进行比较以确保准确性(用于读取)。可用节点的数量必须等于或大于指定的客户端 CL 数量,否则应用程序将出错(例如,如果 QUORUM 数量的节点不可用,则它将无法比较 QUORUM 级别的节点)。此设置并不指示有多少节点将接收数据。同样,这就是 RF 键空间设置。这永远都是正确的。我们在这里指定的是有多少必须确认每次写入或每次读取的比较,以便客户端在那一刻感到高兴。希望这是有道理的。

现在...

在 RF=1 的场景中,应用程序将在写入时收到错误,因为应接收数据的单个节点(基于哈希算法)已关闭(RF=1 再次意味着只有数据的单个副本将存在,并且该单个副本由哈希算法确定为不可用节点)。那有意义吗?

如果 RF=2(2 个数据副本),那么其他两个节点之一将接收数据(同样,哈希算法选择“基本”节点,然后另一个算法将选择副本的位置) go),当不可用的节点变得可用时,它最终会收到数据(通过提示切换或修复)。如果您选择 RF=3(3 个副本),那么其他 2 个节点将获取数据,并且一旦不可用的节点变得可用,它最终将接收数据(通过提示切换或修复)。

仅供参考,如果您想知道一段数据将/确实存在于 Cassandra 集群中的何处,您可以运行“nodetool getendpoints”。输出将是所有副本将/确实驻留的位置。