【发布时间】:2019-12-31 18:01:32
【问题描述】:
Cassandra 中的这种行为似乎没有记录且违反直觉。我想知道为什么会发生这种情况以及如何防止这种情况发生。
创建一个测试表。
CREATE TABLE test_table (id text PRIMARY KEY, foo text);
现在用USING TIMESTAMP在表中创建一行。
INSERT INTO test_table (id, foo)
VALUES ('first', 'hello')
USING TIMESTAMP 1566912993048082;
结果是
id | foo | writetime(foo)
-------+-------+------------------
first | hello | 1566912993048082
现在让我们使用相同的时间戳更新行。
INSERT INTO test_table (id, foo)
VALUES ('first', 'hello2')
USING TIMESTAMP 1566912993048082;
一切正常。
id | foo | writetime(foo)
-------+--------+------------------
first | hello2 | 1566912993048082
让我们使用相同的时间戳再次更新该行。
INSERT INTO test_table (id, foo)
VALUES ('first', 'hello1')
USING TIMESTAMP 1566912993048082;
!!!没有任何改变。
id | foo | writetime(foo)
-------+--------+------------------
first | hello2 | 1566912993048082
再次更新同一行。
INSERT INTO test_table (id, foo)
VALUES ('first', 'hello3')
USING TIMESTAMP 1566912993048082;
!!!再次工作。
id | foo | writetime(foo)
-------+--------+------------------
first | hello3 | 1566912993048082
似乎只有当old.foo < new.foo 使用相同的时间戳时才会发生更新。
预期结果:
- 不会使用相同的时间戳进行更新
- 更新总是使用相同的时间戳进行
实际结果:
- 更新有时使用相同的时间戳发生
【问题讨论】:
-
您的客户端 CF 设置是什么?阅读和写作是同一节课吗?读/写的设置是否相同?您是否可能正在查询未更新的节点?集群中有多少个节点?超过一个?时间同步吗?只是一些想法。
-
我正在使用具有以下配置的 cqlsh。 [cqlsh 5.0.1 | DSE 6.7.4 | CQL 规范 3.4.5 | DSE 协议 v2]。集群有 6 个节点。我不确定集群的问题,因为问题是持续存在的,无论我尝试复制多少次,结果总是相同的。
-
我想我正试图在脑海中思考这甚至会如何工作。实际上,这永远不会发生 - 相同的数据多次使用完全相同的时间戳。如果记录存在于具有相同确切时间戳的多个 sstable 中,我不确定 cassandra 是如何处理的。非常好的问题。我会玩一会儿。一个好的测试是重做你正在做的事情并在每次插入后刷新数据。查看稳定器。数据应该在多个 sstables 中。查看您的查询结果是什么。一遍又一遍地运行它。正如你所说,我猜结果是随机的。
标签: cassandra timestamp datastax cql