磁盘剩余空间警报
概述
当剩余磁盘空间低于配置的限制(默认 50 MB)时,将触发警报并阻塞所有生产者。
其目标是避免磁盘空间被完全占满,因为这会导致节点上的所有写操作失败,并可能导致 RabbitMQ 终止。
工作原理
为了降低磁盘空间被占满的风险,所有传入的消息都会被阻塞。瞬态消息(通常不会持久化)在内存压力过大时仍会被换出到磁盘,并会占用本已有限的磁盘空间。
如果磁盘警报设置得过低且消息换出速度过快,则有可能在两次磁盘空间检查之间(至少间隔 10 秒)耗尽磁盘空间并导致 RabbitMQ 崩溃。一种更保守的方法是将该限制设置为与系统安装的内存大小相等(参见下方的配置部分)。
如果剩余磁盘空间量低于配置的限制,则会触发警报。
代理数据库所使用的驱动器或分区的剩余空间将至少每 10 秒监测一次,以确定是否应触发或清除磁盘警报。
监测将在节点启动时开始。它会留下一条如下所示的日志条目
2019-04-01 12:02:11.564 [info] <0.329.0> Enabling free disk space monitoring
2019-04-01 12:02:11.564 [info] <0.329.0> Disk free limit set to 950MB
在无法识别的平台上,磁盘剩余空间监测将被停用,并导致类似如下的条目
2019-04-01 11:04:54.002 [info] <0.329.0> Disabling disk free space monitoring
在集群中运行 RabbitMQ 时,磁盘警报是集群范围内的;如果一个节点低于限制,则所有节点都会阻塞传入的消息。
RabbitMQ 会定期检查剩余磁盘空间量。磁盘空间检查的频率与上次检查时的剩余空间量有关。这是为了确保在空间耗尽时能及时触发磁盘警报。通常情况下,磁盘空间每 10 秒检查一次,但随着接近限制,检查频率会增加。当非常接近限制时,RabbitMQ 的检查频率最高可达每秒 10 次。这可能会对系统负载产生一定影响。
当剩余磁盘空间低于配置的限制时,RabbitMQ 将阻塞生产者并防止基于内存的消息被换出到磁盘。这将降低因磁盘空间耗尽而导致崩溃的可能性,但不能完全消除。特别是,如果消息换出速度很快,则可能在两次磁盘空间监测运行之间的时间内耗尽磁盘空间并导致崩溃。一种更保守的方法是将该限制设置为与系统安装的内存大小相等(参见下方的配置部分)。
配置磁盘剩余空间限制
磁盘剩余空间限制通过 disk_free_limit 设置进行配置。默认情况下,数据库分区上需要有 50MB 的剩余空间(有关默认数据库位置,请参阅文件位置说明)。此配置文件将磁盘剩余空间限制设置为 1GB
disk_free_limit.absolute = 1000000000
该值也可以使用内存单位(KB、MB、GB 等)进行设置,如下所示
disk_free_limit.absolute = 1GB
该限制可以在代理运行时使用 rabbitmqctl set_disk_free_limit 命令进行更改。此命令的效果将持续到节点下次重启。
如果希望配置效果在节点重启后依然有效,也应更改相应的配置文件。
绝对值与相对值磁盘剩余空间低水位线
在所有受支持的 RabbitMQ 版本中,如果同时设置了 disk_free_limit.absolute 和 disk_free_limit.relative 值,前者将优先生效。
disk_free_limit.absolute 是这两种选项中推荐的方案,因为它更容易理解。