datastax—可替代cassandra中的批处理语句进行原子操作,以避免性能影响

oyt4ldly  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(301)

我们有一个使用cassandra作为数据存储的应用程序。为了方便访问,相同的数据需要存储在具有不同分区键的多个表中。为了将数据存储到多个表中,使用了批处理语句。使用batch语句的原因是为了确保数据写入all或none。
通过这种设置,最近我们开始看到由于用户基数的增加而导致的许多写入超时错误。我们看到许多博客和文章提到batchstatements被错误地用于存储多个分区。
参考文献:
https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/usebatchgoodexample.html
Cassandra的批量限制是多少?
cassandra批处理语句多表
https://grokbase.com/t/cassandra/user/153gsmdzs6/writing-to-multiple-tables
其原因似乎是协调器节点上的负载过大,进而导致延迟。在cassandra.yaml中有一个选项可以将write\ u request\ u timeout\ in\ ms增加到比默认值5 s更高的值。我们尝试了此操作,但请求仍然失败。因此,我们将此设置更新为现在使用executeasync。这样,writetimeout异常就完全消失了。
但现在的问题是-我们如何处理原子性?下面是更新后使用executeasync的代码。使用executeasync是否是使用批处理语句的正确替代方法?是否有任何方法可以在异常块中处理回滚?

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

lskq00tm1#

最终,你所要求的是不存在的-通过设计。
对于写入的原子性,您找到了一个批处理的解决方案。对于其他原子性写入,最终没有。
对于数据的硬一致性(包括写入和读取),可以设置写入和读取的一致性级别以确保硬一致性(wc:local\u quorum,rc:local\u quorum)
许多较新的用户/开发团队经常试图在cassandra上强制使用关系类型规则,但经过一段时间后,他们对cassandra的使用通常会带来对其设计的信任,这种设计允许可调一致性、减少停机时间和可伸缩性。

mtb9vblg

mtb9vblg2#

专门为高可用性和分区容限(cap的ap)而设计的nosql数据库并不是为了提供高引用完整性。相反,它们旨在提供高吞吐量和低延迟读写。cassandra本身没有跨表引用完整性的概念。
批量插入和lwt是好的,直到他们没有使用的规模。对于您的用例,您需要重新考虑如何使用cassandra,以及如何设计数据处理管道,以便对所有表进行弹性写操作。
考虑解耦所有这些表写操作,并使用类似kafka的方法使它们并行执行弹性管道,然后将数据持久化到cassandra表。您可以只创建一次数据管道,从而确保引用数据的完整性。Cassandra支持Kafka连接器
https://www.datastax.com/blog/2018/12/introducing-datastax-apache-kafkatm-connector

相关问题