我已经 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 回答
我们每个节点有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) .
院长