【问题标题】:DataStax/Cassandra USING TIMESTAMP behavior is unpredictable when a new timestamp value equals to previous one当新的时间戳值等于前一个时间戳值时,DataStax/Cassandra 使用时间戳的行为是不可预测的
【发布时间】: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


【解决方案1】:

仅供参考,

我打开了一张票以获取您问题的答案。这是其他可能尝试此操作的人的回复。同样,在典型情况下,一个人不会做你正在做的事情。

---- 响应 ----

如您所知,DSE/Cassandra 通过写入时间戳处理冲突,其中最新的总是获胜。如果您的思想实验中详述了平局,实际上有两种情况需要处理。

活细胞与墓碑碰撞 在这种情况下,墓碑将永远获胜。无法知道这是否是客户所期望的,但行为将是一致的。

活细胞与另一个活细胞碰撞 与墓碑情况类似,我们无法知道应该返回哪个单元格。为了提供一致性,当写入时间戳相同时,较大的值获胜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多