在Kubernetes中使用RabbitMQ 经验分享
在Kubernetes中使用RabbitMQ 经验分享 来源: https://www.ucloud.cn/yun/129560.html 作者: IT那活儿 发布日期: 发布于2023 01 11 13:20 在Kubernetes中使用RabbitMQ 经验分享 点击上方“IT那活儿”,关注后了解更多内容,不管IT
来源: https://www.ucloud.cn/yun/129560.html 作者: IT那活儿 发布日期: 发布于2023-01-11 13:20
在Kubernetes中使用RabbitMQ 经验分享
点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!
在实际工作中我们常常遇见部署各类中间件服务,例如Redis、etcd、memcache、RabbitMQ等,通过Kubernetes部署这些中间件,极大的提高了运维效率,本文是针对RabbitMQ在工作中的小结。
前提条件
要完成本文后续的操作还需要以下条件:
- Kubernetes 1.19+
- Helm 3.2.0+
- PV provisioner support in the underlying infrastructure
安装Chart
helm install ops-test --set auth.username=celery,auth.password=celery,auth.erlangCookie=secretcookie,persistence.storageClass=rook-cephfs-sc,replicaCount=3,persistence.size=1Gi bitnami/rabbitmq
1. 参数说明
- auth.username 设置用户名
- auth.password 设置密码
- auth.erlangCookie 设置erlang cookie
- persistence.storageClass 设置数据存储
- replicaCount 设置副本数
详细参数请访问:
rabbitmq 8.29.0 · bitnami/bitnami (artifacthub.io)
2. 扩容
副本数增加到10个。
helm upgrade ops-test --set auth.username=celery,auth.password=celery,auth.erlangCookie=secretcookie,persistence.storageClass=alicloud-nas-sp,replicaCount=10 bitnami/rabbitmq
3. 缩容
副本数缩减到5个。
helm upgrade ops-test --set auth.username=celery,auth.password=celery,auth.erlangCookie=secretcookie,persistence.storageClass=alicloud-nas-sp,replicaCount=5 bitnami/rabbitmq
注意:当队列(Queues)类型是仲裁队列(Quorum Queues)时,要先删除member。
使用命令:
rabbitmq-queues delete_member [-p ]
注意不要使Member太低,太低可能会导致仲裁队列故障。
4. 检查状态
安装成功后等待集群创建成功,可通过以下两种方式检查运行状态:
方式一:web方式
kubectl port-forward --address 0.0.0.0 --namespace default svc/ops-test-rabbitmq 15672:15672
访问 15672,通过webui访问管理页面。

方式二:命令行方式
kubectl exec -it ops-test-rabbitmq-2 /bin/bashrabbitmqctl cluster_status
配置镜像队列
默认集群中的Queue只存在于它所创建的那个节点上,如果该节点挂了将会造成数据的丢失;使用镜像队列将会在所有其他节点上创建同样的队列,发送数据时所有的队列都会有消息。可以通过设置策略来设置镜像队列。
设置策略时有两个关键参数:ha-mode和ha-params。

1. 设置策略
登录集群中的任意节点,执行以下命令:
rabbitmqctl set_policy ha-all "^" {"ha-mode":"exactly","ha-params":4,"ha-sync-mode":"automatic"}

2. Queues详情
点进一个ops13, 在Detail标签中,Node是当前提供服务的主节点,Mirrors是副本节点,因为"ha-params"参数值为4,所以会有1个主节点,3副本节点。当Node节点出现问题时会从Mirrors中选举一个mirror成为新的Node,提供服务。

3. 故障切换
当Node失效后会从Mirrors中选择一个节点充当Node节点。
配置仲裁队列
仲裁队列(Quorum Queues)是RabbitMQ3.8.0版本的新的队列类型,它基于Raft共识算法实现的持久的FIFO队列。
仲裁队列类型是持久的镜像队列的一种替代方法,主要目标是解决集群中的数据安全。
1. 创建仲裁队列
在3.8.0版本可以使用。声明仲裁队列和声明普通队列方法一样,只需要把x-queue-type设置为quorum即可。
仲裁队列适用数据安全性很高的场景(例如订单系统、选举系统等)。
在创建队列的时候添加以下参数:
"x-queue-type": "quorum", # 声明队列类型为仲裁队列"x-quorum-initial-group-size": 5 # 声明仲裁队列组成员数量,(默认为3,也是最小值),建议成员数量为奇数
添加成员:
rabbitmq-queues add_member [-p ]
删除成员:
rabbitmq-queues delete_member [-p ]
2. Queues详情
登陆管理页面,找到队列类型是quorum的队列,在Detail标签中可以看到当前队列的member成员、Online成员和Leader节点。

3. 故障切换
当Leader 节点出现故障不能提供服务时会从所有Online节点中选择一个成为新的Leader节点。
如果Online节点不多时,可以添加member成员:
rabbitmq-queues add_member [-p ]
当member成员不可用时,可以删除成员:
rabbitmq-queues delete_member [-p ]

本文作者:王玉坤
本文来源:IT那活儿(上海新炬王翦团队)
