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

时间:2015-06-19 09:54:52

标签: cassandra

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

2 个答案:

答案 0 :(得分:8)

虽然文章中提到的是正确的并且是一个很好的来源,但是Shutty的回答是微妙的。前三点似乎是正确的:

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

然而,最后两个看起来是错误的,这是更正后的版本:

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

答案 1 :(得分:3)

有一个article about it。 TL& DR版本:

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