RabbitMQ持久化与内存管理

持久化机制

RabbitMQ的持久化分为消息持久化、队列持久化、交换器持久化。无论是持久化消息还是非持久化消息都可以被写入磁盘。

当RabbitMQ收到消息时,如果是持久化消息,则会储存在内存中,同时也会写入磁盘;如果是非持久化消息,则只会存在内存中。当内存使用达到RabbitMQ的临界值时,内存中的数据会被交换到磁盘,持久化消息由于本就存在于磁盘中,不会被重复写入。

消息的持久化是在发消息时,通过deliveryMode设置,队列、交换器也可以通过参数持久化,非持久化的消息、队列、交换器在rabbitmq-server重启后会消失,即使已经被写入磁盘。

内存告警

RabbitMQ中通过内存阈值参数控制内存的使用量,当内存使用超过配置的阈值时,RabbitMQ会阻塞客户端的连接并停止接收从客户端发来的消息,以免服务崩溃,同时客户端于与服务端的心跳检测也会失效。

内存控制

当出现内存告警时,可以通过管理命令临时调整。

rabbitmqctl set_vm_memory_high_watermark 

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 

内存换页

在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 
rabbitmqctl set_disk_free_limit mem_relative 
# limit为绝对值,KB、MB、GB
# fraction为相对值,建议1.0~2.0之间

# rabbitmq.conf
disk_free_limit.relative=1.5
# disk_free_limit.absolute=50MB

你可能感兴趣的:(消息中间件)