我在 AWS 上运行一个两节点 Datastax AMI 集群。昨天,Cassandra 开始拒绝一切连接。系统日志什么也没显示。经过大量修改后,我发现提交日志已经填满了分配的挂载上的所有磁盘空间,这似乎导致了连接拒绝(删除了一些提交日志,重新启动并能够连接)。
我正在使用 DataStax AMI 2.5.1 和 Cassandra 2.1.7
如果我决定从头开始擦除并重新启动所有内容,我如何确保不会再次发生这种情况?
我在 AWS 上运行一个两节点 Datastax AMI 集群。昨天,Cassandra 开始拒绝一切连接。系统日志什么也没显示。经过大量修改后,我发现提交日志已经填满了分配的挂载上的所有磁盘空间,这似乎导致了连接拒绝(删除了一些提交日志,重新启动并能够连接)。
我正在使用 DataStax AMI 2.5.1 和 Cassandra 2.1.7
如果我决定从头开始擦除并重新启动所有内容,我如何确保不会再次发生这种情况?
commitlog_total_space_in_mb
您可以尝试降低cassandra.yaml
. 对于 64 位系统,默认值为 8192MB(它应该在您的文件中被注释掉.yaml
……您必须在设置时取消注释它)。在调整磁盘大小时计划好通常是个好主意。
du
您可以通过在您的 commitlog 目录上运行 a 来验证这一点:
$ du -d 1 -h ./commitlog
8.1G ./commitlog
虽然,较小的提交日志空间会导致更频繁的刷新(增加磁盘 I/O),因此您需要密切关注这一点。
编辑 20190318
刚刚有一个相关的想法(关于我 4 岁的答案)。我看到它最近受到了一些关注,并想确保那里有正确的信息。
需要注意的是,有时提交日志会以“失控”的方式增长。本质上,这可能是因为节点上的写入负载超出了 Cassandra 跟上刷新 memtables 的能力(因此,删除了旧的 commitlog 文件)。如果你发现一个节点有几十个 commitlog 文件,而且这个数字似乎在不断增长,这可能是你的问题。
本质上,你的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
...这(我觉得)导致许多人将此值设置得太高。
假设值为 8,memtable_cleanup_threshold
则为.111
。当所有 memtable 的占用量超过可用总内存的比例时,就会发生刷新。太多的刷新(阻塞)写入器可以方便地防止这种情况发生。对于单个/data
目录,我建议将此值设置为2。
除了按照 BryceAtNetwork23 的建议减少提交日志的大小之外,确保不会再次发生的适当解决方案将监视磁盘设置,以便在磁盘已满时收到警报并有时间采取行动/增加磁盘大小。
看到您正在使用 DataStax,您可以在 OpsCenter 中为此设置警报。我自己没有在云中使用过它,但我想它会起作用。可以通过单击顶部横幅中的警报 -> 管理警报 -> 添加警报来设置警报。配置要监视的挂载和要触发的阈值。
或者,我确信有更好的工具来监控磁盘空间。