Cassandra并发写道

use*_*415 3 eventual-consistency cassandra nosql

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

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

协调器节点将请求分发给副本节点,例如NodeA NodeB和NodeC.

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

Rus*_*ssS 6

卡桑德拉遵循"最后写赢"政策.使用的时间戳可以手动设置,但默认情况下由请求者设置客户端,请参阅Datastax Java Driver docs.写入的顺序无关紧要.如果写入A具有比写入B更早的时间戳,那么它将始终被写入B覆盖.唯一不明确的情况是时间戳完全匹配.在这种情况下,更大的价值获胜.

最终一致的部分是:

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

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