我已经建立了一个3节点集群(Cassandra 1.2.1)和一个复制因子为3的列族。
Column系列称为metric_hour,保持15秒的平均值一小时 列名:
我在并行运行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设置了一致性级别,这使得群集保持活动状态的时间更长。 一分钟左右。
使用Datastax java-driver和CQL3将所有CQL查询发送到Cassandra集群。 我试过打开和关闭row_cache。
在Riak集群上运行精确相同的设置在相对较长的时间内没有问题 一段的时间。所以我想知道在Cassandra设置上可以改进什么,或者可能会有什么改进 可能是错的。
答案 0 :(得分:2)
我们每个节点有10亿行,并且在后面解释的10亿行计数中遇到RAM问题(使用PlayOrm for cassandra)。
50批次都很好。我不敢相信你的内存不足只有8500个插件。这是没有意义的。你在哪个版本? RAM问题与bloomfilters和索引采样有关,你需要使用8G RAM来达到10亿才能出现问题。
要获得更多行,就像我们要做的那样尝试1.2.2使用Leveled Compaction STrategy。索引采样(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亿行时间序列数据,我们将采用平衡压缩策略,默认情况下不再使用bloomfilter(bloomfilters占用RAM,更多行=使用更多RAM)。
迪安