如何防止 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。
我是 运行 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。