【问题标题】:Alternative to Batch Statements in Cassandra for atomic operation to avoid performance impact替代 Cassandra 中的批处理语句以进行原子操作以避免性能影响
【发布时间】:2020-06-07 04:43:43
【问题描述】:

我们有一个使用 Cassandra 作为数据存储的应用程序。为了方便访问,需要将相同的数据存储在具有不同分区键的多个表中。为了将数据存储到多个表中,使用了 BatchStatements。使用批处理语句的原因是确保数据写入全部或不写入。

通过此设置,最近我们开始看到由于用户群增加而导致的大量写入超时错误。我们遇到了许多博客和文章,其中提到 BatchStatements 被错误地用于存储多个分区。

参考文献:

原因似乎是协调节点上的负载过大,进而导致延迟。可以选择将 cassandra.yaml 中的 write_request_timeout_in_ms 增加到比默认 5 s 更高的值。我们尝试了这个,但仍然请求失败。因此,我们更新了这个设置,现在使用 executeAsync。这样,WriteTimeout 异常就完全消失了。

但现在的问题是 - 我们如何处理原子性?下面是更新为使用 executeAsync 的代码。使用 executeAsync 是使用批处理语句的正确替代方法吗?有什么办法可以在异常块中处理回滚?

try {
    for (ListenableFuture<ResultSet> futureItem : futureItems) {
        futureItem.get();
    }
} catch (Exception e) {
    // need to handle rollback ?
}

【问题讨论】:

    标签: cassandra datastax


    【解决方案1】:

    最终,您所要求的不存在 - 设计使然。

    • 对于写入的原子性,您找到了批处理的解决方案。对于写入的替代原子性,最终没有。

    • 对于数据的硬一致性 - 包括写入和读取,您可以设置写入和读取的一致性级别以确保硬一致性(WC:Local_Quorum,RC:Local_Quorum)

    许多新用户/开发团队经常尝试在 Cassandra 上强制执行关系类型规则,但经过一段时间后,他们对 Cassandra 的使用通常会对其设计产生信心,从而实现可调一致性、减少停机时间和可扩展性。

    【讨论】:

    • 一致性是每张桌子的权利吗?我可以使用它来确保将事务写入 Quorum 吗?
    【解决方案2】:

    专为高可用性和分区容错(CAP 的 AP)而设计的 NoSQL 数据库不提供高引用完整性。相反,它们旨在提供高吞吐量和低延迟的读写。 Cassandra 本身没有跨表引用完整性的概念。

    批量插入和 LWT 在未大规模使用之前都很好。对于您的用例,您需要重新审视您将如何使用 Cassandra,以及如何设计数据处理管道来为所有表提供弹性写入。

    考虑解耦所有这些表写入,并使用 kafka 之类的东西使它们成为并行的弹性管道,然后将数据持久化到 Cassandra 表。您可以只创建一次数据管道,从而确保引用数据的完整性。 Cassandra 确实支持 Kafka 连接器

    https://www.datastax.com/blog/2018/12/introducing-datastax-apache-kafkatm-connector

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2014-05-05
      • 2021-06-10
      • 1970-01-01
      • 2015-07-30
      • 2016-08-11
      • 2013-06-16
      • 2018-09-02
      相关资源
      最近更新 更多