RabbitMQ在Ubuntu上的高可用性方案
RabbitMQ的高可用性(HA)核心是通过集群部署实现节点冗余,结合镜像队列(或Quorum Queue)确保消息不丢失。以下是Ubuntu环境下的具体实施方案:
环境要求
ntp或chrony,误差≤1秒);/etc/hosts解析(如rabbit1、rabbit2、rabbit3)。安装Erlang与RabbitMQ
# 添加官方源 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash # 安装Erlang(官方源会自动处理依赖)和RabbitMQ sudo apt update && sudo apt install -y erlang rabbitmq-server sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server 启用管理插件
为方便监控,启用Web管理界面(默认端口15672):
sudo rabbitmq-plugins enable rabbitmq_management 访问http://<节点IP>:15672(默认账号guest/guest,仅限本地访问),建议创建管理员账号:
sudo rabbitmqctl add_user admin <密码> sudo rabbitmqctl set_user_tags admin administrator sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" RabbitMQ节点通过Erlang Cookie(位于/var/lib/rabbitmq/.erlang.cookie)认证,所有节点的Cookie内容必须完全一致(权限为400,属主为rabbitmq)。
rabbit1),复制其Cookie内容:cat /var/lib/rabbitmq/.erlang.cookie rabbit2、rabbit3):scp /var/lib/rabbitmq/.erlang.cookie rabbit2:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie rabbit3:/var/lib/rabbitmq/ sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie 启动所有节点的RabbitMQ服务
确保所有节点的服务状态为active (running):
sudo systemctl start rabbitmq-server sudo systemctl status rabbitmq-server 将节点加入集群
rabbit1),重置其集群状态(首次配置无需此步,后续添加节点需执行):sudo rabbitmqctl stop_app sudo rabbitmqctl reset sudo rabbitmqctl start_app rabbit2、rabbit3)上执行:sudo rabbitmqctl stop_app sudo rabbitmqctl join_cluster rabbit@rabbit1 # rabbit1为主节点主机名 sudo rabbitmqctl start_app sudo rabbitmqctl cluster_status 输出应显示所有节点(disc为磁盘节点,ram为内存节点)均已加入。镜像队列(Mirror Queue)会将队列及其消息复制到多个节点,确保节点故障时消息不丢失。
ha-all模式,所有节点同步):sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode":"automatic"}' 参数说明: ha-mode="all":队列复制到所有节点;ha-sync-mode="automatic":自动同步消息(避免手动同步延迟)。http://<节点IP>:15672)的“Queues”标签页,查看队列的“Mirrored”状态(显示“Mirrored”即表示镜像成功)。RabbitMQ 3.8+推荐使用Quorum Queue替代传统镜像队列,其基于Raft协议,具备更高的可靠性和故障恢复能力。
x-queue-type=quorum:import pika connection = pika.BlockingConnection(pika.ConnectionParameters('rabbit1')) channel = connection.channel() channel.queue_declare(queue='my_queue', durable=True, arguments={'x-queue-type': 'quorum'}) 或通过管理界面创建队列时选择“Quorum Queue”类型。rabbit2):sudo systemctl stop rabbitmq-server rabbit2服务,它会自动同步其他节点的消息并重新加入集群:sudo systemctl start rabbitmq-server disc),用于持久化集群状态(如队列定义、交换机配置);内存节点(ram)用于提升性能,但不持久化状态。rabbitmq_prometheus插件监控集群状态(如队列积压、节点内存使用)。