RabbitMQ的告警之二:可用磁盘空间告警
总览
当可用磁盘空间,降至配置的限制值时(默认为50MB),将触发告警,并且所有的生产者将会被阻塞。
目的是为了避免填满整个磁盘,这将会导致节点上的所有写操作失败,并且可能会导致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
也可以相对于机器的RAM设置可用空间限制,下面的配置,设置磁盘可用空间与机器上的RAM数量相同。
disk_free_limit.relative = 1.0
在代理正在运行时,可以使用rabbitmqctl set_disk_free_limit或rabbitmqctl set_disk_free_limit mem_relative命令改变限制值。命令将会一直生效,直到下一次节点重启。如果想在节点重启后仍然生效,相关的配置文件也需要修改。