【问题标题】:Why is first insert winning over second one in Cassandra?为什么第一个插入在 Cassandra 中胜过第二个?
【发布时间】:2018-11-02 15:35:30
【问题描述】:

有两个数据中心,每个中心有 3 个节点。我正在以本地仲裁的一致性级别对同一个表进行两次简单的插入(非常快地背靠背)。该表有一个分区键,没有聚簇列。

有时第一个插入会胜过第二个插入。第一个插入语句生成的数据是保存在数据库中的数据,即使我在那之后立即进行了插入。

C#代码

var statement = "Insert Into customer (id,name) Values (1, "foo")";
statement.SetConsistencyLevel(ConsistencyLevel.LocalQuorum);
session.Execute(statement);

【问题讨论】:

  • 机器之间的时间是否同步?
  • 这绝对是时间同步问题。您有 2 个选项来解决此问题:1. 使用 Chris 建议的客户端时间戳或 2. 使用 ntp 服务器保持服务器节点之间的时间同步。在第二种情况下,您的 ntp 服务器也需要适当的监控。

标签: c# cassandra


【解决方案1】:

在客户端设置时间戳。在大多数新驱动程序中,这是自动完成的,以更好地确保订单保留。但是较旧的驱动程序或 Cassandra 2.1 之前的版本不受支持,需要进行查询。我不知道您使用的是什么驱动程序或版本,但您也可以将其放在 CQL 中。虽然它在协议级别上受支持,但驱动程序应该有更好的机制。

类似:var statement = "INSERT INTO customer (id,name) VALUES (1, 'foo') USING TIMESTAMP {microsecond timestamp}";

最好的方法是使用单原子时间戳,这样每次调用总是比最后一次高(即使用当前毫秒并添加一个计数器)。我不知道 C# 来告诉你如何最好地解决这个问题。看https://docs.datastax.com/en/developer/csharp-driver/3.3/features/query-timestamps/#using-a-timestamp-generator

如果您没有在突变上设置时间戳,协调器将在解析查询后分配它。由于网络和 netty 队列可以做一些有趣的事情,所以顺序不是确定的,尤其是当它们最终位于可能有一些时钟漂移的不同节点上时。

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多