暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

RabbitMQ连接阻塞问题

ProdanLabs 2020-07-03
3402

RabbitMQ性能虽然比不上Kafka,但可靠性成为金融行业首选的消息队列,最近后端同事反馈过俩次RabbitMQ消息队列阻塞的情况,都是磁盘告警以及内存告警导致的,该项目的mq消息量较大,以前也没遇到过RabbitMQ队列阻塞的情况,便记录下。


当磁盘或内存告警时,服务器就会临时阻塞连接,且连接心跳也会断开,所有生产者连接会被阻塞,出现'blocked'状态,禁止继续发布消息。消费者连接则出现'blocking'状态,能够继续消费消息,告警是集群范围,只要其中一个节点内存或者磁盘达到配置的阙值时,整个集群的所有节点都会阻塞连接。

阻塞状态的表现
  • 日志打印memory/disk resource limit alarm set on node

  • 制台显示连接阻塞


内存告警

vm_memory_high_watermark 默认是0.4,即rabbitmq使用的内存超过40%时,系统会阻塞连接。如设置0.5以上,erlang垃圾回收运行时,会消耗两倍内存。

vm_memory_high_watermark_paging_ratio 在broker达到high watermark阻塞发布者之前,它会尝试通过将队列的内容page到磁盘来释放内存,持久化和瞬时消息都会被page out(即把内存中的消息都输出到磁盘,包括持久化和非持久化的。持久化的消息一进队列就会被写进磁盘).


磁盘警告

disk_free_limit.absolute  磁盘可用空间阈值,当前磁盘可用空间小于这个值则触发告警


最终的配置文件(RabbitMQ集群运行在Kubernetes上)

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-config
data:
  enabled_plugins: |
      [rabbitmq_management,rabbitmq_peer_discovery_k8s,rabbitmq_tracing,rabbitmq_federation,rabbitmq_federation_management,rabbitmq_delayed_message_exchange].
  rabbitmq.conf: |
      cluster_formation.peer_discovery_backend  = rabbit_peer_discovery_k8s
      cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
      cluster_formation.k8s.address_type = hostname
      cluster_formation.node_cleanup.interval = 10
      cluster_formation.node_cleanup.only_log_warning = true
      cluster_partition_handling = autoheal
      queue_master_locator=min-masters
      loopback_users.guest = false
      cluster_formation.randomized_startup_delay_range.min = 0
      cluster_formation.randomized_startup_delay_range.max = 2
      cluster_formation.k8s.service_name = k8smq
      cluster_formation.k8s.hostname_suffix = .k8smq.default.svc.cluster.local
      vm_memory_high_watermark.absolute = 2GB
      disk_free_limit.absolute = 200MB
      #下面的配置会在内存使用到0.4 * 0.75=0.3的时候开始paging,在内存使用到0.4的时候阻塞发布者
      vm_memory_high_watermark.relative = 0.4
      vm_memory_high_watermark_paging_ratio = 0.75

复制


创建RabbitMQ集群时分配的内存较小,编辑RabbitMQ的副本控制集增加内存,修改保存后,Kubernetes会自动滚动重启RabbitMQ集群


RabbitMQ集群重启后检查运行情况



监控和Metrics


生产环境我们应该有完善且合理的监控机制,从而做到防患于未然。可以通过rabbitmq-exporter,把rabbitmq接入prometheus监控



文章转载自ProdanLabs,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论