Cassandra并发写入

4

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

例如,客户端A写入tableA.rowA.colA,同时客户端B也写入tableA.rowA.colA。

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

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

2个回答

9
Cassandra遵循“最后写入胜利”策略。时间戳可以手动设置,但默认情况下由请求方参见Datastax Java Driver文档在客户端设置。写入的顺序是无关紧要的。如果写入A的时间戳早于写入B,则始终会被写入B覆盖。唯一不确定的情况是时间戳完全匹配的情况下,较大的值获胜。
其中最终一致性部分为:
- 假设A的时间戳早于B - 如果A到达副本1,B到达副本2,则正确的状态为B - 副本1将响应A,直到它从副本2接收有关B的信息 - 当B被复制时,副本1也将响应B。
大多数用例不涉及在Cassandra中存储状态,因此不会出现这些问题。

好的,因此时间戳是在到达任何副本机之前设置的。这样可以确保所有更新请求对于同一客户端具有相同的时间戳。 - user1947415
客户端如何同步时间戳?例如,不同的服务器有不同的本地时间。 - user1947415
1
NTP通常用于校准时间,但更重要的是建立一种数据模型,使得不同客户端的异步时间不会破坏数据。 - RussS

1
每次向Cassandra写入(插入/更新/删除)时,与每个列相关联的时间戳也会被插入。当您执行读取查询时,时间戳用于选择单个列或集合元素中的“获胜”更新。
如果我有一个真正并发的写入具有相同的时间戳怎么办?在不太可能出现微秒级别上完全匹配的两个时间戳的情况下,您可能会得到一个错误版本,但是Cassandra确保通过比较字节值来一致地打破平局。
因此,对于您的情况,“在NodeA上,ClientA请求先到达。在NodeB上,ClientB请求先到达。”
- 如果ClientA请求的时间戳更早,则ClientA将获胜。 - 如果ClientB请求的时间戳更早,则ClientB将获胜。 - 如果ClientA和ClientB都具有相同的时间戳,则通过按字节词典顺序比较值来选择获胜者,以便返回的值是确定性的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接