cassandra 当在不同的节点中同时插入具有相同主键的2行时,写入时间会发生什么变化?

dldeef67  于 2023-10-18  发布在  Cassandra
关注(0)|答案(1)|浏览(182)

我想知道cassandra中使用的一致性级别是否对WriteTime(在cassandra中插入/更新单元格的时间)有影响。

上下文

如果你有下表…

CREATE TABLE IF NOT EXISTS table1 (
  field_1        INT,
  field_2        INT,
  field_3        INT,
  PRIMARY KEY (field_1)
);

并且您在具有多个cassandra节点且一致性级别为ONE的环境中插入以下事件(同时)...

INSERT INTO table1(field_1, field_2, field_3) VALUES (1, 1, 1); //A
INSERT INTO table1(field_1, field_2, field_3) VALUES (1, 1, 2); //B

然后,在查询表时(在所有节点的内部更新之后),您期望有{ field_1 = 1,field_2 = 1,field_3 = 2 },因为第二次插入确实覆盖了第一次:

SELECT * FROM table1 WHERE field_1 = 1;

问题

然而,集群中发生了什么?行是否插入(作为A),然后修改(作为B)?还是直接插入行(作为B,而不经过A状态)?
我这么问是因为下面的命令...

SELECT
  WRITETIME(field_2) as unchanged_cell,
  WRITETIME(field_3) as updated_cell 
FROM table1
WHERE field_1 = 1;

为unchanged_cell和updated_cell返回相同的值。我希望unchanged_cell < than updated_cell。事实上,field_1是由A插入的,并且在B中没有改变(因此它应该具有=到WriteTime(A)的创建时间),并且field_2是由A插入的,然后由B更新(因此它应该具有=到WriteTime(B)的创建时间,因此大于WriteTime(A))。
这是正常的情况吗?如果我使用QUORUM或ALL的一致性,它会改变吗?

t40tm48m

t40tm48m1#

根据定义,同时插入的两行将具有相同的WRITETIME()。如果你想一想,它们是同时写的,所以它们的写时间是一样的。
此外,(1)一致性级别和(2)写入请求的协调器都不会对写入时间的值产生任何影响,因为所有变化都被发送到所有数据中心中的所有副本。
协调器仅负责通过向所有副本发送变化并要求来自CL副本的写入确认来“协调”请求,因此哪个节点被选为协调器并不重要。
顺便说一下,除非在应用程序中显式指定与USING TIMESTAMP ...相同的时间戳,否则时间戳绑定很少。在任何情况下,对于具有相同写入时间戳的两个列,较大的值(基于字节)“获胜”。干杯!干杯!

相关问题