部署环境

  • 系统环境

    172.16.10.10   计算机名:node1.rabbitmq

    172.16.10.11   计算机名:node2.rabbitmq

    172.16.10.12   计算机名:node3.rabbitmq

    所有服务器操作系统为:CentOS Linux release 7.3.1611 (Core)

    hosts文件如下:

    172.16.10.10    node1.rabbitmq node1

    172.16.10.11    node2.rabbitmq node2

    172.16.10.12    node3.rabbitmq node3

  • 软件环境

    rabbitmq部署方法:yum -y install rabbitmq-server

    rabbitmq安装版本:rabbitmq-server-3.3.5-34.el7.noarch

注意:

  部署集群要求所有节点的rabbitmq-server版本需要相同,如果是源码安装的话还要求rabbitmq-server所依赖的软件环境也要相同

集群方案

  因我们要实现集群高可用的功能,所以我们采用镜像模式,此模式下有任何一台服务器宕机不会影响正常的生产和消费,但集群内部的通讯会占用较大的带宽

部署集群

      在部署集群开始前我们还需要再次确保服务器和软件环境正确,接下来按下面步骤部署镜像集群

  1. 将node1节点的/var/lib/rabbitmq/.erlang.cookie复制到其它集群节点,因为各集群节点之间通讯必须共享相同的erlang cookie,这就是rabbitmq底层的工作原理。

    systemctl start rabbitmq-server

    scp /var/lib/rabbitmq/.erlang.cookie 172.16.10.11:/var/lib/rabbitmq/

    scp /var/lib/rabbitmq/.erlang.cookie 172.16.10.12:/var/lib/rabbitmq/

    注意:此文件是在rabbitmq-server服务第一次启动是才会生成的,并且些文件的权限为400,属主和属组为rabbitmq。所以我们需要在node1上面启动一次rabbitmq-server服务,再执行复制

  2. 将node2和node3节点启动,分别在node2和node3执行下面的命令

    chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

    systemctl start rabbitmq-server

  3. 将node2和node3加入到集群环境,分别在node2和node3执行下面命令

    rabbitmqctl stop_app

    rabbitmqctl join_cluster rabbit@node1

    rabbitmqctl start_app

  4. 验证集群配置,在集群中任意一个node上面执行下在命令,查看到的结果一样

    rabbitmqctl cluster_status(结果如下图所示)

    RabbitMQ集群与高可用部署_第1张图片

  5. 在所有节点启用rabbitmq_management插件,在所有节点执行以下命令

    rabbitmq-plugins enable rabbitmq_management

    systemctl restart rabbitmq-server

    将服务加入开机自启动

    systemctl enable rabbitmq-server

  6. 最后在任何一节点执行以下命令

    rabbitmqctl set_policy -p nirvana-device ha-all "^\.*" '{"ha-mode":"all"}'

    配置指定虚拟主机的所有队列为镜像模式,-p指定虚拟主机,不指定默认为 / 这样配置后我们将会有两个镜像节点,只要保障有一台rabbitmq正常工作那么集群就可以提供服务

配置HAProxy+Keepalived

      为了实现我们的RabbitMQ集群高可用,我们需要在前端加一个HAProxy来代理RabbitMQ访问,另外防止HAProxy单节点故障,所以我们使用HAProxy+Keepalived+RabbitMQ的方案来实现整套集群环境

安装HAPoryx和Keepalived

      因测试环境服务器有限,我们将HAProxy和Keepalived部署在node1和node2上面,并使用172.16.10.100为VIP,在node1和node2上面行以下命令安装

yum install haproxy keepalived

Node1的Keepalived配置

! Configuration File for keepalived
 
global_defs {
   router_id node1
}
 
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 20
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        172.16.10.100/24
    }
}

Node2的Keepalived配置

! Configuration File for keepalived
 
global_defs {
   router_id node2
}
 
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 20
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        172.16.10.100/24
    }
}

haproxy_check.sh脚本配置

#!/bin/bash
 
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
    haproxy -f /etc/haproxy/haproxy.cfg
    sleep 2
    if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then
        pkill keepalived
    fi
fi

注意:此脚本需要有执行权限

chmod 755 /etc/keepalived/haproxy_check.sh

HAPorxy配置文件(Node1和Node2相同)

global
     log         127.0.0.1 local2
 
     chroot      /var/lib/haproxy
     pidfile     /var/run/haproxy.pid
     maxconn     4000
     user        haproxy
     group       haproxy
     daemon
 
     stats socket /var/lib/haproxy/stats
 
 defaults
     mode                    http
     log                     global
     option                  httplog
     option                  dontlognull
     option http-server-close
     option forwardfor       except 127.0.0.0/8
     option                  redispatch
     retries                 3
     timeout http-request    10s
     timeout queue           1m
     timeout connect         10s
     timeout client          1m
     timeout server          1m
     timeout http-keep-alive 10s
     timeout check           10s
     maxconn                 4000
 
 listen rabbitmq_cluster
     bind 0.0.0.0:5670
     mode tcp
     option tcplog
     timeout client  3h
     timeout server  3h
     timeout connect 3h
     balance roundrobin
     server node1 172.16.10.10:5672 check inter 5000 rise 2 fall 3  
     server node2 172.16.10.11:5672 check inter 2000 rise 2 fall 3
     server node2 172.16.10.12:5672 check inter 2000 rise 2 fall 3
 
 listen rabbitmq_cluster
     bind 0.0.0.0:15670
     balance roundrobin
     server node1 172.16.10.10:15672 check inter 5000 rise 2 fall 3
     server node2 172.16.10.11:15672 check inter 2000 rise 2 fall 3
     server node2 172.16.10.12:15672 check inter 2000 rise 2 fall 3

开启HAProxy日志Node1Node2相同)

  1. 编辑/etc/rsyslog.conf,打开以下四行注释

    $ModLoad imudp

    $UDPServerRun 514

    $ModLoad imtcp

    $InputTCPServerRun 514

  2. 增加一行配置

    local2.*                                                /var/log/haproxy.log

  3. 重启rsyslog服务

    systemctl restart rsyslog

    到目前为止,RabbitMQ集群部署完毕,最后就是测试集群