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