如果在使用 QUORUM CL 时在 cassandra 集群中写入失败会发生什么情况



>假设我有 3 个节点,RF 是 3,并且使用 QUORUM CL。当我将数据记录写入集群时,如果一个节点成功,则一个节点失败。那么整个写入请求失败了,成功节点会发生什么?它会自动回滚吗?或者会通过八卦传播到其他节点。最后,即使原始请求失败,3 个节点也会都有记录?

Shutty的回答在微妙的方式上是错误的,尽管所引用的文章是正确的,是一个很好的来源。 前三点似乎是正确的:

  • 查询协调器将尝试根据 RF=3 在所有节点上持久保存您的写入。如果其中 2 个失败,则 CL=QUORUM 写入被视为失败。
  • 接受失败写入的单个节点不会回滚它。它会将其保留在内存表/磁盘上,因为没有发生任何可疑的事情。
  • Cassandra 是一个最终一致的数据库,所以它在一段时间内处于不一致状态,但在将来的某个时间收敛到一致状态是绝对没问题的。

但是,最后两个似乎是错误的,这是更正后的版本:

  • 下次读取 (CL=QUORUM) 之前未能写入的密钥时,如果仍然没有足够的联机节点,则读取失败。如果之前写入失败的两个节点处于联机状态(而不是成功写入的节点),您将收到以前的值,不受写入失败的影响。
  • 如果成功写入的节点也处于联机状态,则 QUORUM 读取将导致读取修复,从而导致未能写入较新值的节点更新为新值,然后将返回该值。 (注意:"newer"一词是时间戳意义上的,因此即使数据是最近写入的,也可能具有较旧的时间戳 ->此集群以不一致的状态启动。

有一篇关于它的文章。TL&DR版本:

  • 查询协调器将尝试根据 RF=3 在所有节点上持久保存您的写入。如果其中 2 个失败,则 CL=QUORUM 写入被视为失败。
  • 接受失败写入的单个节点不会回滚它。它会将其保留在内存表/磁盘上,因为没有发生任何可疑的事情。
  • Cassandra 是一个最终一致的数据库,所以它在一段时间内处于不一致状态,但在将来的某个时间收敛到一致状态是绝对没问题的。
  • 下次读取 (CL=QUORUM) 之前未能写入的密钥时,如果仍然没有足够的联机节点,则读取失败。如果其他 2 个节点将恢复正常,它们将具有读取仲裁(即使该键的第三个节点数据不同),并且你将收到以前的值,不受写入失败的影响。
  • 如果 Cassandra 检测到单个密钥的此类冲突,它将执行读取修复过程,此时冲突的少数节点数据将被仲裁多数节点的数据覆盖。因此,接受失败写入的节点将在下次成功仲裁读取时自行修复不一致的行。

相关内容

最新更新