cassandra在启动后几分钟内因内存不足而崩溃

pwuypxnk  于 2021-06-13  发布在  Cassandra
关注(0)|答案(2)|浏览(479)

我们有一个cassandra集群,在aws上使用ec2snitch有3个节点和复制因子3。
示例类型为c5.2xlarge(8核16gb ram)。
集群一直运行良好,但从昨天晚上开始,所有节点上的cassandra进程突然崩溃。它们被设置为自动重新启动,但在启动后的1、2或3分钟内,由于内存堆空间不足而崩溃。
堆配置:

MAX_HEAP_SIZE="4G"
HEAP_NEWSIZE="800M"

在此之后,我们尝试将节点大小增加到r5.4x或128gb内存,并分配64gb堆,但仍然会发生相同的情况,不管所有3个节点是否启动,或者一次只启动一个节点。我们可以注意到,第一次垃圾收集发生在一段时间之后,然后在几秒钟内连续发生,无法释放更多内存,最终崩溃。
我们不确定什么东西在启动后立即被拉到内存中。
其他参数:
Cassandra版本:2.2.13
数据库大小为250gb hinted_handoff_enabled: true commitlog_segment_size_in_mb: 64 memtable_allocation_type: offheap_buffers 如有任何帮助,将不胜感激。
编辑:我们发现在查询时有一个特定的表,它会导致casssandra节点崩溃。

cqlsh:my_keyspace> select count(*) from my_table ;
ReadTimeout: Error from server: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}

所以我们认为,这与这个特定表中的数据被破坏/庞大有关。谢谢。

w7t8yxp5

w7t8yxp51#

除了@aaron的cg和内存调整建议之外,您还应该检查您是否对数据使用了正确的压缩策略。
https://docs.datastax.com/en/dse/5.1/dse-dev/datastax_enterprise/config/configchoosecompactstrategy.html#whichcompactionstrategyisbest
您还应该检查损坏的sstables,因为尝试获取损坏的数据也将以相同的方式显示(例如https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/tools/toolsscrub.html)

rwqw0loc

rwqw0loc2#

一些快速观察:
如果要构建新群集,请使用最新的3.11.x版本。没有必要在2.2上构建新的。
根据您的设置,看起来您正在使用cms gc。如果您不太熟悉gc调优,那么可以通过切换到g1而不指定 HEAP_NEWSIZE (g1自己计算出eden的大小)。
如果你被卡在cms上,设置指南 HEAP_NEWSIZE 在100Mbx核上,这是错误的。要避免新->旧代升级,请设置 HEAP_NEWSIZE 总堆大小的40%-50%并增加 MaxTenuringThreshold 大约6-8岁。
在带有cmsgc的16gbram机器上,我将使用8gbheap,并翻转 memtable_allocation_type: offheap_buffers 回到 heap_buffers .
commitlog_segment_size_in_mb 回到32岁。通常,当人们需要处理这个问题时,就应该降低它,除非你也改变了 max_mutation_size_in_kb .
您还没有提到崩溃发生时应用程序在做什么。我怀疑正在发生写重负载。在这种情况下,您可能需要3个以上的节点,或者在应用程序端查看限制正在进行的写操作数的速率。
帮助您的其他信息:
cassandra-8150—cassandra committer关于良好jvm设置的讨论。
amy的cassandra2.1调优指南-amy tobey的管理指南在集群配置的良好默认设置方面有很多智慧。
编辑
我们使用的是g1 gc。
这是非常非常重要的,你不要设置一个新的堆大小( Xmn )与g1。一定要把它注解掉。
从我的表中选择count(*);
是,未绑定查询(没有 WHERE 从句`)绝对会对节点施加过度的压力。尤其是table很大的时候。这些类型的查询是cassandra不擅长的。想办法使用/需要这个结果。
您可以通过将分页大小设置得更小(驱动端),或者使用类似spark的方法来实现这一点。或者通过令牌范围进行查询,并在应用程序端对结果进行合计。但你最好不要这样做。

相关问题