持久化機制
RabbitMQ的持久化分爲消息持久化、隊列持久化、交換器持久化。無論是持久化消息還是非持久化消息都可以被寫入磁盤。
當RabbitMQ收到消息時,如果是持久化消息,則會儲存在內存中,同時也會寫入磁盤;如果是非持久化消息,則只會存在內存中。當內存使用達到RabbitMQ的臨界值時,內存中的數據會被交換到磁盤,持久化消息由於本就存在於磁盤中,不會被重複寫入。
消息的持久化是在發消息時,通過deliveryMode設置,隊列、交換器也可以通過參數持久化,非持久化的消息、隊列、交換器在rabbitmq-server重啓後會消失,即使已經被寫入磁盤。
內存告警
RabbitMQ中通過內存閾值參數控制內存的使用量,當內存使用超過配置的閾值時,RabbitMQ會阻塞客戶端的連接並停止接收從客戶端發來的消息,以免服務崩潰,同時客戶端於與服務端的心跳檢測也會失效。
內存控制
當出現內存告警時,可以通過管理命令臨時調整。
rabbitmqctl set_vm_memory_high_watermark <fraction>
fraction爲內存閾值,默認是0.4,表示RabbitMQ使用的內存超過系統內存的40%時,會產生內存告警,通過此命令修改的閾值在重啓後會失效。可以通過修改配置文件的方式,使之永久生效,但是需要重啓服務。
# rabbitmq.conf
vm_memory_high_watermark.relative=0.4
#vm_memory_high_watermark.absolute=1GB
RabbitMQ提供relative與absolute兩種配置方式
- relative:相對值,也就是前面的fraction參數,建議0.4~0.66,不能太大
- absolute:絕對值,固定大小,單位爲KB、MB、GB
rabbitmqctl set_vm_memory_high_watermark absolute <value>
內存換頁
在RabbitMQ達到內存閾值並阻塞生產者之前,會嘗試將內存中的消息換頁到磁盤,以釋放內存空間。內存換頁由換頁參數控制,默認爲0.5,表示當內存使用量達到內存閾值的50%時會進行換頁,也就是0.4*0.5=0.2。
vm_memory_high_watermark_paging_ratio=0.5
當換頁閾值大於1時,相當於禁用了換頁功能
磁盤控制
RabbitMQ通過磁盤閾值參數控制磁盤的使用量,當磁盤剩餘空間小於磁盤閾值時,RabbitMQ同樣會阻塞生產者,避免磁盤空間耗盡。
磁盤閾值默認50M,由於是定時檢測磁盤空間,不能完全消除因磁盤耗盡而導致崩潰的可能性,比如在兩次檢測之間,磁盤空間從大於50M變爲0M。
一種相對謹慎的做法是將磁盤閾值大小設置與內存相等
rabbitmqctl set_disk_free_limit <limit>
rabbitmqctl set_disk_free_limit mem_relative <fraction>
# limit爲絕對值,KB、MB、GB
# fraction爲相對值,建議1.0~2.0之間
# rabbitmq.conf
disk_free_limit.relative=1.5
# disk_free_limit.absolute=50MB