Database cassandra如何处理仲裁读取之间的写入时间戳冲突?

Database cassandra如何处理仲裁读取之间的写入时间戳冲突?,database,cassandra,nosql,consistency,eventual-consistency,Database,Cassandra,Nosql,Consistency,Eventual Consistency,在极不可能的情况下,两个仲裁写入并行发生在同一行上,并导致两个分区副本与同一时间戳不一致: 当在3节点集群中发生CL=QUORUM读取,并且读取中的2个节点报告具有相同时间戳的不同数据时,读取将决定实际记录是什么?还是会出错 接下来的问题是,既然数据具有相同的时间戳,集群如何再次达到一致性 我理解这种情况是极不可能的,但我猜这仍然是可能的 示例图: 以下是我从税务支持中得到的信息: 当然有可能考虑的情况。Cassandra/Astra使用以下优先规则处理此场景,以便客户端的结果始终一致: 比较时

在极不可能的情况下,两个仲裁写入并行发生在同一行上,并导致两个分区副本与同一时间戳不一致:

当在3节点集群中发生CL=QUORUM读取,并且读取中的2个节点报告具有相同时间戳的不同数据时,读取将决定实际记录是什么?还是会出错

接下来的问题是,既然数据具有相同的时间戳,集群如何再次达到一致性

我理解这种情况是极不可能的,但我猜这仍然是可能的

示例图:
以下是我从税务支持中得到的信息:

当然有可能考虑的情况。Cassandra/Astra使用以下优先规则处理此场景,以便客户端的结果始终一致:

比较时间戳,最新时间戳始终获胜 如果正在读取的数据具有相同的时间戳,则删除优先于插入/更新 如果仍有平局需要打破,Cassandra/Astra会为该列选择词汇上更大的值 虽然这些规则当然有点武断,但Cassandra/Astra无法知道哪个值应该具有优先级,而且这些规则的作用是在出现平局时始终为所有客户端提供完全相同的结果

当在3节点集群中发生CL=QUORUM读取,并且读取中的2个节点报告具有相同时间戳的不同数据时,读取将决定实际记录是什么?还是会出错

Cassandra/Astra将在穿越读取路径时在幕后为您处理此问题。如果两个副本返回的数据之间存在差异,则在将数据发送回客户端之前,将在参与读取的这两个节点之间对数据进行比较和同步

关于你的图表,W1和W2都发生在t=1,返回到客户机的数据是data=2,因为2>1。此外,节点1现在将在t=1记录处具有缺失的数据=2。节点2在t=1时仍然只有数据=1,因为它不参与该读取