Cassandra 并发写入

Cassandra concurrent writes

Cassandra如何保证并发写入时的最终一致性?

比如客户端A写入tableA.rowA.colA,同时客户端B写入tableA.rowA.colA.

协调节点将请求分发给副本节点,比如 NodeA、NodeB 和 NodeC。

在NodeA上,ClientA请求先到。 在 NodeB 上,ClientB 的请求最先到达。 那么,会永远不一致吗?

Cassandra 遵循 "Last Write Wins" 政策。使用的时间戳可以手动设置,但默认情况下由请求者设置客户端 see Datastax Java Driver docs。写入到达的顺序无关紧要。如果写入 A 的时间戳早于写入 B,那么它将始终被写入 B 覆盖。唯一不明确的情况是时间戳完全匹配。在这种情况下, 更大的 值获胜。

最终一致的部分是:

  • 假设 A 的时间戳早于 B
  • 如果A到达Replica 1,B到达Replica 2,正确的状态是B
  • Replica 1 将响应 A,直到它从 Replica 2 收到有关 B 的信息
  • 复制 B 时,副本 1 也会响应 B。

大多数用例涉及不在 Cassandra 中存储状态,因此不会出现此类问题。

每次写入 (insert/update/delete) 到 cassandra,还会插入与每一列关联的时间戳。当您执行读取查询时,时间戳用于在单个列或集合元素

中选择 "winning" 更新

如果我有一个具有相同时间戳的真正并发写入怎么办?在不太可能的情况下,您精确地以微秒为单位匹配两个时间戳,您可能会得到一个错误的版本,但 Cassandra 确保通过比较字节值

所以对于你的情况 "On NodeA the ClientA request arrive first. On NodeB the ClientB request arrive first"

  • 如果 ClientA 的请求时间戳较旧,则 ClientA 将获胜

  • 如果 ClientB 请求时间戳更早,则 ClientB 将获胜。

  • 如果 ClientA 和 ClientB 都具有相同的时间戳,则通过按字节词法比较值来选择获胜者,以便返回的值是确定性的