k8s kafka集群 连接不上_RabbitMQ连接阻塞问题
RabbitMQ性能虽然比不上Kafka,但其以可靠性成为金融行业首选的消息队列,最近后端同事反馈过俩次RabbitMQ消息队列阻塞的情况,都是磁盘告警以及内存告警导致的,该项目的mq消息量较大,以前也没遇到过RabbitMQ队列阻塞的情况,便记录下。当磁盘或内存告警时,服务器就会临时阻塞连接,且连接心跳也会断开,所有生产者连接会被阻塞,出现'blocked'状态,禁止继续发布消息。消费...
日志打印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监控
更多推荐
所有评论(0)