cassandra - 我的大量表(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 驱动程序可以像这样多线程使用吗?它说它是线程安全的。
解决方案
大量表对性能有直接影响 - 请参阅此文档(整个系列都是很好的信息来源)和此博客文章以获取更多详细信息。基本上,使用约 1000 个表,性能会下降约 20-25%。
这可能是一个原因,不是完全直接的,而是相关的。对于每个表,Cassandra 需要分配内存,在 memtable 中为其分配一部分,保留有关它的信息等。这个特定问题可能来自阻塞的 memtable 刷新,或类似的东西。检查nodetool tpstats和nodetool tablestats是否有阻塞或挂起的内存表刷新。最好设置一些持续监控解决方案,例如Apache Cassandra 的指标收集器,并在一段时间内监视包含该信息的重要指标。
推荐阅读
- python - PyCharm 和类型提示警告
- javascript - jQuery动画步骤变换
- c++ - 使用循环(不是迭代器)从向量中删除指针
- java - 使用 Java 在 Google AppEngine 上进行条带化支付 - com.stripe.exception.ApiConnectionException: API 请求 Stripe 期间出现 IOException
- python - 如何编写@overrides allennlp predictor.load_line?
- javascript - 如何从 express.js 发送数据以在没有 API 的情况下做出反应?
- php - 防止会话劫持、固定、注入等
- python - While 循环在 with 块内不起作用
- java - 在 Kruskal 算法的 Java 实现中,我们究竟应该在哪里执行路径压缩?
- django - Django 频道或信号?