ubuntu

RabbitMQ在Ubuntu上的高可用性方案

小樊
43
2025-10-02 04:03:23
栏目: 智能运维

RabbitMQ在Ubuntu上的高可用性方案
RabbitMQ的高可用性(HA)核心是通过集群部署实现节点冗余,结合镜像队列(或Quorum Queue)确保消息不丢失。以下是Ubuntu环境下的具体实施方案:

一、前置准备

  1. 环境要求

    • 所有节点运行相同版本的Ubuntu(如22.04 LTS)和Erlang(RabbitMQ依赖,版本需匹配,如Erlang 25.x);
    • 节点间时间同步(使用ntpchrony,误差≤1秒);
    • 主机名唯一且可通过DNS或/etc/hosts解析(如rabbit1rabbit2rabbit3)。
  2. 安装Erlang与RabbitMQ

    • 推荐使用RabbitMQ官方APT源安装最新稳定版(避免Ubuntu源版本滞后):
      # 添加官方源
      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
      
  3. 启用管理插件
    为方便监控,启用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 ".*" ".*" ".*"
    

二、配置Erlang Cookie(集群通信基础)

RabbitMQ节点通过Erlang Cookie(位于/var/lib/rabbitmq/.erlang.cookie)认证,所有节点的Cookie内容必须完全一致(权限为400,属主为rabbitmq)。

三、组建RabbitMQ集群

  1. 启动所有节点的RabbitMQ服务
    确保所有节点的服务状态为active (running)

    sudo systemctl start rabbitmq-server
    sudo systemctl status rabbitmq-server
    
  2. 将节点加入集群

    • 选择主节点(如rabbit1),重置其集群状态(首次配置无需此步,后续添加节点需执行):
      sudo rabbitmqctl stop_app
      sudo rabbitmqctl reset
      sudo rabbitmqctl start_app
      
    • 从节点(如rabbit2rabbit3)上执行:
      sudo rabbitmqctl stop_app
      sudo rabbitmqctl join_cluster rabbit@rabbit1  # rabbit1为主节点主机名
      sudo rabbitmqctl start_app
      
    • 验证集群状态(任一节点执行):
      sudo rabbitmqctl cluster_status
      
      输出应显示所有节点(disc为磁盘节点,ram为内存节点)均已加入。

四、配置镜像队列(高可用核心)

镜像队列(Mirror Queue)会将队列及其消息复制到多个节点,确保节点故障时消息不丢失。

五、可选优化:Quorum Queue(推荐)

RabbitMQ 3.8+推荐使用Quorum Queue替代传统镜像队列,其基于Raft协议,具备更高的可靠性和故障恢复能力。

六、验证高可用性

  1. 模拟节点故障
    停止某个节点的服务(如rabbit2):
    sudo systemctl stop rabbitmq-server
    
  2. 检查消息发送与消费
    在生产者端发送消息,消费者端仍能正常接收(消息会自动路由到其他镜像节点)。
  3. 恢复故障节点
    启动rabbit2服务,它会自动同步其他节点的消息并重新加入集群:
    sudo systemctl start rabbitmq-server
    

注意事项

0
看了该问题的人还看了