首页 文章

Cassandra 耗尽内存

提问于
浏览
0

我已经 Build 了一个3节点集群(Cassandra 1.2.1)和一个复制因子为3的列族 .

Column系列称为metric_hour,使用列名称保存15秒的平均值一小时:

  • 帐户名称

  • 指标名称

  • 值类型(字符串)

  • 单位类型(字符串)

  • m0

  • m1 ......

  • m239

我在并行运行6个客户端,每个客户端将数据推送到集群,总计210万个度量值(一年中一个度量值的15秒值) . 因为我不想为每个度量值读取和写入数据,所以我正在计算完成的metric_hours列表,并在最后将它们发送到集群,只需8500多个插入 . 插入件以50个为一组进行批量 生产环境 ,使用BEGIN BATCH ... END BATCH;

大约5-6分钟后,Cassandra集群不堪重负,堆满了,节点开始失败(无论是变得反应迟钝还是完全死亡) . 我已经多次运行此设置并获得相同的结果 .

每个cassandra节点都在自己的专用硬件上运行,四核2.3 GHz Intel i7 CPU和16GB物理RAM(这些是Mac Mini Server机器 . 数据持久保存到内部SSD) . 我通过cassandra-env设置-Xmx和-Xmn,范围在2到8 GB之间 . 运行8GB可以使群集运行更长时间,但在短时间后仍然会失败 .

我还为QUORUM设置了一致性级别,这使得集群保持活动状态的时间更长一些 . 一分钟左右 .

所有CQL查询都使用Datastax java-driver和CQL3发送到Cassandra集群 . 我试过开启和关闭row_cache .

在Riak集群上运行精确相同的设置在相当长的一段时间内没有问题 . 所以我想知道在Cassandra设置上可以改进什么,或者可能出错的地方 .

1 回答

  • 2

    我们每个节点有10亿行,并在后面解释的10亿行计数中遇到RAM问题(使用PlayOrm for cassandra) .

    50批次都很好 . 我不敢相信你的内存不足只有8500个插件 . 这是没有意义的 . 你在哪个版本? RAM问题与bloomfilters和索引采样有关,你需要使用8G RAM来达到10亿才能出现问题 .

    要像我们要做的那样拥有更多行,请使用Leveled Compaction STrategy尝试1.2.2 . 索引采样(cassandra.yaml)也可能降低 . Bloomfilters每10亿行占用大约2千兆RAM . 我们每个节点有超过10亿行,因此遇到内存问题 . 我们有32台gig RAM机器,但cassandra自动配置为8G RAM,因为jdk GC在8G以上变坏 . 最近,我们将JVM提升到了12G,直到我们可以到LCS关闭bloomfilters(我们希望这可以帮助我们为每个节点做50亿行) .

    从1.1.4迁移到1.2.2显着减少了RAM的使用(我们今天实际上正在进行升级,但在 生产环境 中的节点5上进行了测试,发现它在相同数量的行中使用的RAM少得多) . 我们希望获得50亿行时间序列数据,我们将采用 balancer 压缩策略,默认情况下不再使用bloomfilter(bloomfilters占用RAM,更多行=使用更多RAM) .

    院长

相关问题