cassandra 如何处理 QUORUM 读取之间的写入时间戳冲突?
How does cassandra handle write timestamp conflicts between QUORUM reads?
在极不可能的情况下,2 个 QUORUM 写入并行发生在同一行,并导致 2 个分区副本与相同的时间戳不一致:
当一个CL=QUORUM READ发生在一个3节点集群中,并且READ中的2个节点报告具有相同时间戳的不同数据时,READ将决定什么是实际记录?还是会报错?
那么下一个问题是,由于数据具有相同的时间戳,集群如何再次达到一致性?
我知道这种情况极不可能发生,但我的猜测是仍有可能。
示例图:
这是我从 Datastax 支持那里得到的:
绝对是一种可能需要考虑的情况。 Cassandra/Astra 使用以下优先规则处理这种情况,以便客户端的结果始终一致:
比较时间戳,总是以最新的时间戳为准
如果正在读取的数据具有相同的时间戳,则删除优先于 inserts/updates
如果仍然存在平局,Cassandra/Astra 选择词法较大的列的值
虽然这些肯定有点武断,但 Cassandra/Astra 不知道应该优先考虑哪个值,并且这些规则的作用是在平局发生时始终为所有客户端提供完全相同的结果。
When a CL=QUORUM READ happens in a 3 node cluster, and the 2 nodes in the READ report different data with the same timestamp, what will the READ decide is the actual record? Or will it error?
Cassandra/Astra 会在遍历读取路径时在幕后为您处理此问题。如果两个副本返回的数据之间存在差异,则在将数据发送回客户端之前,将在参与读取的两个节点之间比较和同步数据。
因此关于您的图表,W1 和 W2 都发生在 t = 1 时,返回到客户端的数据将是数据 = 2,因为 2 > 1。此外,节点 1 现在将具有缺失数据 = 2 在 t = 1 记录。节点 2 在 t = 1 时仍然只有数据 = 1,因为它没有参与该读取。
在极不可能的情况下,2 个 QUORUM 写入并行发生在同一行,并导致 2 个分区副本与相同的时间戳不一致:
当一个CL=QUORUM READ发生在一个3节点集群中,并且READ中的2个节点报告具有相同时间戳的不同数据时,READ将决定什么是实际记录?还是会报错?
那么下一个问题是,由于数据具有相同的时间戳,集群如何再次达到一致性?
我知道这种情况极不可能发生,但我的猜测是仍有可能。
示例图:
这是我从 Datastax 支持那里得到的:
绝对是一种可能需要考虑的情况。 Cassandra/Astra 使用以下优先规则处理这种情况,以便客户端的结果始终一致:
比较时间戳,总是以最新的时间戳为准 如果正在读取的数据具有相同的时间戳,则删除优先于 inserts/updates 如果仍然存在平局,Cassandra/Astra 选择词法较大的列的值 虽然这些肯定有点武断,但 Cassandra/Astra 不知道应该优先考虑哪个值,并且这些规则的作用是在平局发生时始终为所有客户端提供完全相同的结果。
When a CL=QUORUM READ happens in a 3 node cluster, and the 2 nodes in the READ report different data with the same timestamp, what will the READ decide is the actual record? Or will it error?
Cassandra/Astra 会在遍历读取路径时在幕后为您处理此问题。如果两个副本返回的数据之间存在差异,则在将数据发送回客户端之前,将在参与读取的两个节点之间比较和同步数据。
因此关于您的图表,W1 和 W2 都发生在 t = 1 时,返回到客户端的数据将是数据 = 2,因为 2 > 1。此外,节点 1 现在将具有缺失数据 = 2 在 t = 1 记录。节点 2 在 t = 1 时仍然只有数据 = 1,因为它没有参与该读取。