【问题标题】:Could my large amount of tables (2k+) be causing my write timeout exceptions?我的大量表(2k+)会导致我的写入超时异常吗?
【发布时间】:2021-05-22 17:06:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: cassandra datastax-java-driver


    【解决方案1】:

    大量表对性能有直接影响 - 请参阅docwhole series 是很好的信息来源)和this blog post 了解更多详细信息。基本上,使用约 1000 个表时,性能会下降约 20-25%。

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

    【讨论】:

    • 嗨,亚历克斯,感谢您的回复。阅读非常有趣,尤其是博客文章!谢谢你。我跑了nodetool tpstatsnodetool tablestats,但都没有引起我的兴趣。我注意到tpstats 表明偶尔会有​​一些丢弃的 MUTATE 请求 - 我猜这些是失败的写入? tablestats 花了很长时间才返回,但所有表的挂起刷新始终为 0
    • 我尝试了 MCAC,但我遇到了this issue 并尝试了this solution,但它还没有开始工作。 (所有字段不适用,并显示 1 个节点已关闭)
    • 所有 nodetool 命令显示信息的“当前”快照,而您需要历史视图 - 这就是我推荐 MCAC 的原因。您可以通过 JMX 设置 Prometheus,并仅启用特定指标,因为如果您允许废弃所有指标,它将给节点带来大量负载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多