1. 官网地址
rabbitmq官网:https://www.rabbitmq.com/download.html
Elang官网:http://www.erlang.org/downloads
我用的是 erlang-21.3-1.el7.x86_64.rpm 和 rabbitmq-server-3.8.8-1.el7.noarch.rpm,下载好后上传服务器

首先准备5台服务器,其中,node1、node2、node3三台服务器安装RabbitMQ服务,node4和node5安装HA-proxy和Keepalived。

192.168.110.100  node1
192.168.110.101  node2
192.168.110.102  node3
192.168.110.103  node4
192.168.110.104  node5

2. 安装文件(分别按照以下顺序安装)

rpm -ivh erlang-21.3-1.el7.x86_64.rpm 
 yum install socat -y 
 rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm3. 常用命令(按照以下顺序执行) 
 添加开机启动 RabbitMQ 服务 
 chkconfig rabbitmq-server on 
 启动服务
 /sbin/service rabbitmq-server start 
 查看服务状态 
 /sbin/service rabbitmq-server status
 停止服务(选择执行) 
 /sbin/service rabbitmq-server stop 
 开启 web 管理插件 
 rabbitmq-plugins enable rabbitmq_management 
 用默认账号密码(guest)访问地址 http://19.168.110.126:15672/出现权限问题

rabbit 废弃镜像集群_java

4. 添加一个新的用户 
创建账号 

rabbitmqctl add_user chengzl 123456
 设置用户角色 
 rabbitmqctl set_user_tags chengzl administrator 
 设置用户权限 
 set_permissions [-p <vhostpath>] <user> <conf> <write> <read> 
 rabbitmqctl set_permissions -p "/" chengzl ".*" ".*" ".*" 
 用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限 
 当前用户和角色
 rabbitmqctl list_users

rabbit 废弃镜像集群_rabbit 废弃镜像集群_02

 5. 再次登陆chengzl用户

rabbit 废弃镜像集群_rabbitmq_03

重置命令:

关闭应用的命令为 
rabbitmqctl stop_app 
清除的命令为
rabbitmqctl reset 
重新启动命令为 
rabbitmqctl start_app

 三台服务器:100、101、103分别按以上步骤安装。

6. RabbitMQ集群配置

这里以node1为master节点,node2和node3为slave节点。

A》首先配置5个服务器hosts文件:
192.168.110.100  node1
192.168.110.101  node2
192.168.110.102  node3
192.168.110.103  node4
192.168.110.104  node5

B》修改5台服务器的主机名(node1 ~ node5)

        vim /etc/hostname

C》停止MQ服务
        rabbimqctl stop

以确保各个节点的 cookie 文件使用的是同一个值 
在 node1 上执行远程操作命令 

scp /root/.erlang.cookie root@node2:/root/.erlang.cookie
 scp /root/.erlang.cookie root@node3:/root/.erlang.cookie

7. 启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以下命令) 
rabbitmq-server -detached 

8. slave加入集群,对node2和node3分别执行下面操作

rabbitmqctl stop_app 
 (rabbitmqctl stop 会将 Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务) 
 rabbitmqctl join_cluster rabbit@node1 
 rabbitmqctl start_app(只启动应用服务) A> 如果需要移除集群节点,执行下面命令:
rabbitmqctl forget_cluster_node rabbit@node2(具体节点)
 B> 修改集群名称(任意一个节点操作,默认为master node名称)
rabbitmqctl set_cluster_name rabbitmq_cluster1
 C> 查看集群状态(任意一个节点操作)
rabbitmqctl cluster_status
D> 设置镜像队列策略(任意一个节点操作)
 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

ha-mode:指明镜像队列的模式,有效值为all、exactly、nodes,默认为all。all表示在集群中所有的节点上进行镜像;exactly表示在指定个数的节点上进行镜像,节点个数由ha-params指定;nodes表示在指定节点上进行镜像,节点名称通过ha-params指定,节点的名称通常类似于rabbit@hostname
ha-params:不同的ha-mode配置中需要用到的参数
ha-sync-mode:队列中消息的同步方式,有效值为automatic和manual

rabbit 废弃镜像集群_java_04

E> 将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致。
此时看rabbitmq管控台,Nodes会有三个节点:

rabbit 废弃镜像集群_服务器_05

9. 安装 Haproxy(node4和node5)
 

A》下载haproxy
        yum install haproxy -y

B》编辑 haproxy 配置文件
        vi /etc/haproxy/haproxy.cfg

新增listen内容,根据实际情况,修改default内容:
#logging options
 global
     log 127.0.0.1 local0 info
     maxconn 5120
     chroot /usr/local/haproxy
     uid 99
     gid 99
     daemon
     quiet
     nbproc 20
     pidfile /var/run/haproxy.pid
     
 defaults
     log global
     # 使用四层代理模式,"mode http" 为7层代理模式
     mode tcp
     # if you set mode to tcp,then you must change tcplog into httplog
     option tcplog
     option dontlognull
     retries 3
     option redispatch
     maxconn 2000
     contimeout 5s
     # 客户端空闲超时时间为60秒,过了该时间,HA发起重连机制
     clitimeout 60s
     # 服务端连接超时时间为15秒,过了该时间,HA发起重连机制
     srvtimeout 15slisten rabbitmq_cluster
     # 定义监听地址和端口,本机的5672端口
     bind 0.0.0.0:5672
     # 配置 tcp 模式
     mode tcp
     # balance url_param userid
     # balance url_param session_id check_post 64
     # 简单的轮询
     balance roundrobin
     #rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查,2次正确证明服务器可用,
     #2次失败证明服务器不可用,并且配置主备机制
     server node1 192.168.110.100:5672 check inter 5000 rise 2 fall 2
     server node2 192.168.110.101:5672 check inter 5000 rise 2 fall 2
     server node3 192.168.110.102:5672 check inter 5000 rise 2 fall 2
         
# 配置 haproxy web 监控,查看统计信息
 listen stats
     bind *:8100
     mode http
     option httplog
     stats enable
     # 设置 haproxy 监控地址为:http://localhost:8100/rabbitmq-stats
     stats uri /rabbitmq-stats
     stats refresh 5s10. 启动haproxy
         haproxy -f /etc/haproxy/haproxy.cfg        重启haproxy:service haproxy restart
         至此,haproxy配置成功,可以访问:http://192.168.174.13:8100/rabbitmq-stats11. 安装 Keepalived(node4和node5)
 我这里将node4作为keepalived的主节点,node5为备用节点。 A、安装所需软件包
 yum install -y openssl openssl-develB、下载 keepalived
 wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gzC、解压、编译、安装
 tar -xvf keepalived-1.2.18.tar.gz
 cd keepalived-1.2.18
 ./configure --prefix=/usr/local/keepalived
 make && make installD、创建文件夹,将keepalived配置文件进行复制
 mkdir /etc/keepalived
 cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
 cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfigE、创建软连接,如果存在则进行删除
 ln -s /usr/local/sbin/keepalived /usr/sbin
 ln -s /usr/local/keepalived/sbin/keepalived /sbinF、设置开机启动
 chkconfig keepalived onG、编辑 keepalived 配置文件(编辑node4和node5)
 vi /etc/keepalived/keepalived.conf! Configuration File for keepalived
 global defs {
     router_id node4 ##标识节点的字符串,通常为hostname
 }
 vrrp_script chk_haproxy{
     script "/etc/keepalived/haproxy_check.sh"   ## 执行脚本位置
     interval 2  ##检查时间间隔
     weight -20 ##如果条件成立则权重减20
 }
 vrrp_instance VI_1 {
     state MASTER##主节点为MASTER,备份节点为BACKUP
     interface ens33 ##绑定虚拟ip的网络接口(网卡)
     virtual_router_id 13    ##虚拟路由id号,主备节点相同
     mcast_src_ip 192.168.174.13 ##本机ip地址
     priority 100    ##优先级(0-254)
     nopreempt
     advert_int 1    ##组播信息发送间隔,两个节点必须一致,默认1s
     authentication {    ##认证匹配
         auth_type PASS
         auth_pass bhz
     }
     track_script {
         chk_haproxy
     }
     virtual_ipaddress {
         192.168.174.70 ##虚拟ip,可以指定多个
     }
 }! Configuration File for keepalived
 global defs {
     router_id node5 ##标识节点的字符串,通常为hostname
 }
 vrrp_script chk_haproxy{
     script "/etc/keepalived/haproxy_check.sh"   ## 执行脚本位置
     interval 2  ##检查时间间隔
     weight -20 ##如果条件成立则权重减20
 }
 vrrp_instance VI_1 {
     state BACKUP ##主节点为MASTER,备份节点为BACKUP
     interface ens33 ##绑定虚拟ip的网络接口(网卡)
     virtual_router_id 13    ##虚拟路由id号,主备节点相同
     mcast_src_ip 192.168.174.14 ##本机ip地址
     priority 90 ##优先级(0-254)
     nopreempt
     advert_int 1    ##组播信息发送间隔,两个节点必须一致,默认1s
     authentication {    ##认证匹配
         auth_type PASS
         auth_pass bhz
     }
     track_script {
         chk_haproxy
     }
     virtual_ipaddress {
         192.168.174.70 ##虚拟ip,可以指定多个
     }
 }vrrp_instance 的 interface 为VIP需要挂载的网卡上,我这里都放在虚拟机的ens33上。 node4 的 state 为 MASTER,node5 为 BACKUP ,priority 要保证node4大于node5,这样就能实现node4宕机之后恢复服务,能够从node5抢回VIP;如果需要实现不抢回VIP,则node4和node5的state都设置为BACKUP,并且vrrp_instance 都添加nopreempt,表示不抢夺VIP(实际上已经加了)。
12. 添加执行脚本 haproxy_check.sh
vi /etc/keepalived/haproxy_check.sh
内容如下(node4和node5一样):
#!/bin/bash
 COUNT = `ps -C haproxy --no-header | wc -l`
 if [$COUNT -eq 0];then
     /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
     sleep 2
     if[`ps -C haproxy --no-header | wc -l` -eq 0];then
         killall keepalived
     fi
 fi


13、赋予脚本执行权限

        chmod +x haproxy_check.sh

14、启动keepalived

        service keepalived start

至此,基于Keepalived和Haproxy的rabbitmq集群,已经搭接完成。