如何防止 Cassandra 提交日志填满磁盘 space

How to prevent Cassandra commit logs filling up disk space

我是 运行 AWS 上的一个双节点 Datastax AMI 集群。昨天,Cassandra 开始拒绝所有连接。系统日志什么也没显示。经过 很多 的修补,我发现提交日志已经填满了分配的挂载上的所有磁盘 space,这似乎导致连接被拒绝(删除了一些提交日志,重新启动并能够连接)。

我正在使用 DataStax AMI 2.5.1 和 Cassandra 2.1.7

如果我决定擦除所有内容并从头开始重新启动,我如何确保不再发生这种情况?

您可以尝试降低 cassandra.yaml 中的 commitlog_total_space_in_mb 设置。 64 位系统的默认值为 8192MB(它应该在你的 .yaml 文件中被注释掉......你必须在设置它时取消注释)。在调整磁盘大小时,为此做好计划通常是个好主意。

您可以通过 运行 a du 在您的 commitlog 目录中验证这一点:

$ du -d 1 -h ./commitlog
8.1G    ./commitlog

不过,较小的提交日志 space 会导致更频繁的刷新(增加磁盘 I/O),因此您需要密切关注这一点。

编辑 20190318

刚刚有一个相关的想法(关于我 4 岁的回答)。我看到它最近受到了一些关注,想确保那里有正确的信息。

请务必注意,有时提交日志会以 "out of control" 的方式增长。从本质上讲,这可能会发生,因为节点上的写入负载超出了 Cassandra 跟上刷新内存表(并因此删除旧的提交日志文件)的能力。如果你发现一个节点有几十个提交日志文件,而且这个数字似乎还在不断增加,这可能是你的问题。

本质上,您的 memtable_cleanup_threshold 可能太低了。虽然此 属性 已弃用,但您仍然可以通过减少 memtable_flush_writers.

的数量来控制它的计算方式
memtable_cleanup_threshold = 1 / (memtable_flush_writers + 1)

文档已更新至 3.x,但过去是这样说的:

# memtable_flush_writers defaults to the smaller of (number of disks,
# number of cores), with a minimum of 2 and a maximum of 8.
# 
# If your data directories are backed by SSD, you should increase this
# to the number of cores.
#memtable_flush_writers: 8

...这(我觉得)导致许多人将此值 WAY 设置得太高。

假设值为 8,则 memtable_cleanup_threshold.111。当所有 memtables 的占用空间超过可用总内存的这个比率时,就会发生刷新。过多的刷新(阻塞)编写器可以方便地防止这种情况发生。对于单个 /data 目录,我建议将此值设置为 2.

除了按照 BryceAtNetwork23 的建议减小提交日志的大小,确保它不会再次发生的适当解决方案将监控磁盘设置,以便在它变满时提醒您,并有时间 act/increase 磁盘大小。

鉴于您正在使用 DataStax,您可以在 OpsCenter 中为此设置警报。我自己还没有在云中使用过它,但我想它会起作用。可以通过单击顶部横幅中的警报 -> 管理警报 -> 添加警报来设置警报。配置要监视的挂载和要触发的阈值。

或者,我确信有更好的工具可以监控磁盘 space。