Cassandra 压缩占用太多 RAM
Cassandra compaction takes too much RAM
运行 一个 8 节点 Cassandra 2.2.5 集群,CF 大约 1TB。
为此 CF 切换到 LeveledCompactionStrategy 会导致数千个压缩作业,这本身似乎不是问题。但是 Cassandra 开始使用不断增加的 RAM,最终被内核杀死。
C* 使用 100G RAM 合并一些已排序文件的原因可能是什么?
最初切换到 LCS 将导致所有数据的大量重新压缩。如果你有一个 TB,那就是很多 SSTable 和很多压缩。当 Cassandra 进行压缩时,它并不像 "merging some sorted files" 那样简单,因为它实际上必须跨 SSTables 合并更新和墓碑,需要比简单比较更多的处理。
压缩将使用 RAM,但是除非您进行了不同的配置,否则默认值应该对堆大小和并发压缩数量有限制。话虽如此,Cassandra 会尽可能地利用缓存内存,但这不会造成问题。
如果你有非常宽的分区,Cassandra 也会在压缩过程中使用更多的堆外内存,但是 100GB 太多了。我建议您将堆大小、压缩吞吐量和 concurrent_compactors 配置得更低,以期避免 oom-killer。
如果集群处于负载状态,您应该使用 JMX 一次切换到一个 node/rack LCS,请查看本指南以获取信息 http://blog.alteroot.org/articles/2015-04-20/change-cassandra-compaction-strategy-on-production-cluster.html
如果集群上没有负载,那么您也可以尝试在 cassandra-env.sh 中使用 disable_stcs_in_l0 参数启动 cassandra,看看是否有帮助。这将禁用 L0 中的 sizetiered 压缩,这应该减少压缩总数以将所有数据重新压缩到 LCS(但是,对于 1TB 的数据,重新压缩仍然需要很长时间)。
-Dcassandra.disable_stcs_in_l0=true
运行 一个 8 节点 Cassandra 2.2.5 集群,CF 大约 1TB。
为此 CF 切换到 LeveledCompactionStrategy 会导致数千个压缩作业,这本身似乎不是问题。但是 Cassandra 开始使用不断增加的 RAM,最终被内核杀死。
C* 使用 100G RAM 合并一些已排序文件的原因可能是什么?
最初切换到 LCS 将导致所有数据的大量重新压缩。如果你有一个 TB,那就是很多 SSTable 和很多压缩。当 Cassandra 进行压缩时,它并不像 "merging some sorted files" 那样简单,因为它实际上必须跨 SSTables 合并更新和墓碑,需要比简单比较更多的处理。
压缩将使用 RAM,但是除非您进行了不同的配置,否则默认值应该对堆大小和并发压缩数量有限制。话虽如此,Cassandra 会尽可能地利用缓存内存,但这不会造成问题。
如果你有非常宽的分区,Cassandra 也会在压缩过程中使用更多的堆外内存,但是 100GB 太多了。我建议您将堆大小、压缩吞吐量和 concurrent_compactors 配置得更低,以期避免 oom-killer。
如果集群处于负载状态,您应该使用 JMX 一次切换到一个 node/rack LCS,请查看本指南以获取信息 http://blog.alteroot.org/articles/2015-04-20/change-cassandra-compaction-strategy-on-production-cluster.html
如果集群上没有负载,那么您也可以尝试在 cassandra-env.sh 中使用 disable_stcs_in_l0 参数启动 cassandra,看看是否有帮助。这将禁用 L0 中的 sizetiered 压缩,这应该减少压缩总数以将所有数据重新压缩到 LCS(但是,对于 1TB 的数据,重新压缩仍然需要很长时间)。
-Dcassandra.disable_stcs_in_l0=true