卡桑德拉(Cassandra):如果所需的节点发生故障,将向哪个节点写入数据?

时间:2020-01-02 11:44:39

标签: cassandra

假设我有一个Cassandra集群,其中有3个节点(节点0,节点1和节点2),复制因子为1。 假设我要向集群中插入新数据,并且分区键将新行定向到节点1。但是,节点1暂时不可用。在这种情况下,新数据是否将插入到节点0或节点2(尽管不应根据分区键将其放置在节点2)?

1 个答案:

答案 0 :(得分:3)

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

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

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

现在...

在RF = 1的情况下,应用程序将在写入时收到错误,因为应接收数据的单个节点(基于哈希算法)已关闭(RF = 1再次表示仅单个副本)的数据将存在,并且该单个副本由哈希算法确定为不可用节点)。这有道理吗?

如果您有一个RF = 2(2个数据副本),则其他两个节点之一将接收数据(同样,哈希算法选择“基本”节点,然后另一个算法将选择cop在哪里) (ies)去),并且当不可用节点变为可用时,它最终将接收数据(通过提示的切换或修复)。如果选择RF = 3(3个副本),则其他2个节点将获取数据,并且一旦不可用节点变为可用,它将最终接收数据(通过提示的切换或修复)。

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