0

我们有一个场景,每个id_2给定的插入发生id_1在 Cassandra 中,对于下面的模式:

CREATE      TABLE  IF    NOT    EXISTS my_table (
  id_1                   UUID,
  id_2                   UUID,
  textDetails            TEXT,
  PRIMARY KEY (id_1, id_2)
);

单个 POST 请求正文具有多个值的详细信息id_2。这会在单个表上触发每个 POST 请求的多个插入。

每个 INSERT 查询执行如下所示:

insertQueryString = "INSERT INTO my_table (id_1, id_2, textDetails) " + "VALUES (?, ?, ?) IF NOT EXISTS"
    cassandra.Session.Query(insertQueryString, 
    id1,                            
    id2,        
    myTextDetails).Exec();

1

Cassandra 是否确保每个 POST 请求在单个表上多次插入的数据一致性?每个 POST 请求都在 Go-routine(线程)上处理。后续的 GET 请求应确保检索到一致的数据(通过 POST 插入)

使用 BATCH 语句在暂存和生产中存在“批量太大”的问题。https://github.com/RBMHTechnology/eventuate/issues/166

2

我们有两个数据中心(用于 Cassandra),每个数据中心有 3 个副本节点。

写查询操作(POST请求)和就绪查询操作(GET请求)需要设置什么一致性级别,才能保证完全一致

4

1 回答 1

2

这里有多个问题:

  • 在 Cassandra 中应该非常小心地使用批处理- 仅当您将数据插入同一个分区时。如果您将数据插入多个分区,那么最好使用并行执行的单独查询(但您可以为每个分区键收集多个条目并对其进行批处理)。
  • 您正在使用IF NOT EXISTS并且它是针对同一个分区完成的 - 结果它会导致多个节点之间的冲突(请参阅有关轻量事务的文档)加上它需要从磁盘读取数据,因此它会大大增加节点上的负载。但是你真的需要在行不存在时才插入数据吗?如果行已经存在,有什么问题?在进行 INSERT 时覆盖 Cassandra 中的数据更容易,因为它不需要从磁盘读取数据。

关于一致性级别 - QUORUM(或 LWT 的 SERIAL)将为您提供强一致性,但以增加延迟为代价(因为您需要等待另一个 DC 的回答),并且缺乏容错性 - 如果您失去另一个 DC,那么您的所有查询都将失败。在大多数情况下,LOCAL_QUORUM 就足够了(LWT 的情况下是 LOCAL_SERIAL),它会提供容错。我建议阅读这份白皮书,了解在 Cassandra 之上构建容错应用程序的最佳实践。

于 2021-05-01T10:02:34.887 回答