首页 > 解决方案 > 我的大量表(2k+)会导致我的写入超时异常吗?

问题描述

我正在使用 Datastax Java Driver 3.8.0 运行 OS Cassandra 3.11.9。我有一个 Cassandra 键空间,它有多个用作查找表/搜索索引的表。每当我收到对端点的新 POST 请求时,我都会解析对象并将其插入相应的 Cassandra 表中。我还将插入插入到每个相应的查找表中。(每个对象 10-20 个)

在将大量数据摄取到系统中时,我一直在驱动程序中遇到 WriteTimeoutExceptions。

我尝试通过引入 Apache Camel 并将所有语句放入 Session 可以处理的队列中,将插入请求序列化到查找表中,但这没有帮助。使用 Camel,由于异常现在发生在 Camel 线程中,因此测试继续运行,而不是在第一个异常上失败。最终,测试似乎让 Cassandra 崩溃了。(但 Cassandra 日志中没有任何内容)

我还尝试关闭我的查找表,而是将每个对象插入主表 15 次(以模拟类似数量的写入,就好像我打开了查找表一样)。这个测试无一例外地通过了,这让我认为大量的表是问题所在。

大量(2k+)的 Cassandra 表是代码异味吗?我们应该重新架构还是只投入更多资源?日志中没有显示任何指示性内容,主要是关于表格数量等的一些状态 - 没有例外)

Datastax Java 驱动程序可以像这样多线程使用吗?它说它是线程安全的。

标签: cassandradatastax-java-driver

解决方案


大量表对性能有直接影响 - 请参阅此文档整个系列都是很好的信息来源)和此博客文章以获取更多详细信息。基本上,使用约 1000 个表,性能会下降约 20-25%。

这可能是一个原因,不是完全直接的,而是相关的。对于每个表,Cassandra 需要分配内存,在 memtable 中为其分配一部分,保留有关它的信息等。这个特定问题可能来自阻塞的 memtable 刷新,或类似的东西。检查nodetool tpstatsnodetool tablestats是否有阻塞或挂起的内存表刷新。最好设置一些持续监控解决方案,例如Apache Cassandra 的指标收集器,并在一段时间内监视包含该信息的重要指标。


推荐阅读