【问题标题】:Does Cassandra write to a node(which is up) even if Consistency cannot be met?即使无法满足​​一致性,Cassandra 是否会写入节点(已启动)?
【发布时间】:2015-08-09 07:06:48
【问题描述】:

Cassandra 文档中的以下声明是我怀疑的原因。

例如,如果使用写入一致性级别 QUORUM 和复制因子 3,Cassandra 会将写入复制到集群中的所有节点并等待来自两个节点的确认。如果在其中一个节点上写入失败但在另一个节点上成功,则 Cassandra 报告无法在该节点上复制写入。但是,在其他节点上成功的复制写入不会自动回滚。

参考:http://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_atomicity_c.html

即使无法满足​​一致性,Cassandra 是否会写入节点(已启动)?

【问题讨论】:

标签: cassandra cassandra-2.0


【解决方案1】:

我明白了。如果 Cassandra 知道无法满足一致性,它甚至不会尝试编写。如果可以满足一致性,但没有足够的副本来满足复制因子,那么 Cassandra 将写入当前可用的副本并给出成功消息。稍后当副本再次启动时,它将写入其他副本。

例如如果复制因子为 3 ,则 3 个节点中的 1 个已关闭,那么如果我以 2 的一致性写入,则写入将成功。但是,如果复制因子为 2 并且 2 个节点中的 1 个已关闭,那么如果我使用 2 的一致性写入,Cassandra 甚至不会写入可用的单个节点。

文档中提到的是在可以满足一致性时启动 while write 的情况。但在这期间,一个节点宕机了,无法完成写入,而另一个节点写入成功。由于无法满足一致性,客户端将收到失败消息。写入单个节点的记录稍后将在节点修复或压缩期间删除。

【讨论】:

  • 如果 Replication Factor = 1 和 CL = 1 用于读写,并且我设置了 3 个节点并且只有 1 个处于 Up 状态,该怎么办?
【解决方案2】:

Cassandra 中的一致性可以(是?)在语句级别定义。这意味着您可以在特定查询中指定所需的一致性级别。

这意味着如果不满足一致性级别,则上面的陈述不满足一致性要求。

Cassandra 中没有回滚。您在 Cassandra 中拥有的是最终一致性。这意味着如果不是立即,您的声明将来可能会成功。当一个副本节点上线时,集群(又名 Cassandra 的容错)将负责写入副本节点。

所以,如果你的陈述失败了,将来它可能会成功。这与 RDBMS 世界相反,未提交的事务被回滚,就好像什么都没发生一样。

更新: 我站得更正。谢谢阿伦。

发件人:

http://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_about_hh_c.html

在写操作期间,当启用提示切换并且可以满足一致性时,协调器在以下任一条件下将有关死副本的提示存储在本地 system.hints 表中:

所以它仍然不是回滚。节点知道当前集群状态,如果无法满足一致性,则不会启动写入。

【讨论】:

  • 我怀疑以后会不会成功,因为客户端已经得到了写失败的响应。所以客户不希望将来再次看到数据。
  • @ArunJoyThekkiniyath 您得到的响应是该特定语句的客户端。例如,如果您读取具有较低一致性级别(例如:一)的同一行,则这是一个成功操作。所以,一致性是你为你的案例定义的。这就是为什么它被称为可调一致性。当死副本节点上线时,数据最终将被写入,最终一致性。阅读stackoverflow.com/questions/24587869/…stackoverflow.com/questions/18160548/…
【解决方案3】:

在驱动程序级别,您会遇到异常。

在写入成功的节点上,数据已经真正写入,最终会被回滚。

在正常情况下,您可以认为数据没有写入任何节点。

From the documentation:

如果在一个节点上写入失败但在另一个节点上成功, Cassandra 报告在该节点上复制写入失败。 但是,在另一个节点上成功的复制写入不是 自动回滚

【讨论】:

  • 您的回答目前似乎自相矛盾 - 您说数据已回滚,然后您引用文档说“自动回滚”?
  • 我修改了答案,试图更好地解释自己。
  • 错误...不会回滚...会在失败节点重试。
  • 假设,我有一个 2 节点集群(node_A 和 node_B)。当 node_B 以一致性 2 关闭时,我进行了插入。正如预期的那样,插入失败。由于 node_A 已启动,插入将转到 node_A。所以我应该能够以一致性 1 从 node_A 读取。我试过这个。但是我没有得到插入的记录。
  • @ArunJoyThekkiniyath 你的复制因子是什么?你怎么说它至少写入了一个节点?您可以使用复制因子定义要写入的节点数量,而不是一致性级别。
猜你喜欢
  • 2019-02-16
  • 2018-06-18
  • 2015-06-02
  • 2018-05-28
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2011-12-10
  • 2014-10-02
相关资源
最近更新 更多