阅读这篇文章的前提是你已经实现了单机版RabbitMQ服务的安装配置,并且能够正常访问了。如果还没有准备好?
请参考:
Centos 7+RabbitMQ+镜像集群之基础环境搭建
1、准备几台Centos服务器
我这里演示的是5台centos7虚拟机,如果你有这个条件的话,使用物理机器当然也可以。
- Centos 7 64 130 安装了Rabbitmq服务
- Centos 7 64 131 安装了Rabbitmq服务
- Centos 7 64 132 安装了Rabbitmq服务
- Centos 7 64 133 安装了Haproxy、Keepalived 设置了虚拟ip:172.16.255.135
- Centos 7 64 134 安装了Haproxy、Keepalived 设置了虚拟ip:172.16.255.135
这里先简单的说一下集群实现思路,在多台centos服务器上按照Rabbitmq服务(如果是使用虚拟机的话,可以先安装一台,然后通过镜像的方式再克隆几台出来。),Haproxy用来实现tcp层的负载均衡,而Keepalived用来创建虚拟ip实现负载均衡的高可用。Haproxy、Keepalived、Rabbitmq服务可以在同一台centos虚拟机中。
2、集群环境搭建
2.1、停掉所有机器中的Rabbitmq服务
#方式1
service rabbitmq-server stop
#方式2
rabbitmqctl stop_app
2.2、从安装了Rabbitmq的centos中选择一个作为master节点,并将其/var/lib/rabbitmq/.erlang.cookie 文件拷贝到其他安装了Rabbitmq的centos中。(如果是克隆镜像的话,这步可以省略)
2. 3、启动master节点的Rabbitmq服务
service rabbitmq-server start
2.4、将其他几个安装了rabbitmq的非master节点加入到master节点中
如下命令在非master节点中执行
rabbitmqctl join_cluster rabbit@server130 #server130是我master节点的机器名称,如果你没有设置机器名称的话,这里可以使用master节点的ip地址
2.4.1、如果master节点的防火墙打开了,需要允许4369、25672端口通过
1. 允许通过指定端口:firewall-cmd --zone=public --add-port=4369/tcp --permanent、firewall-cmd --zone=public --add-port=25672/tcp --permanent
2. 重启防火墙:firewall-cmd --reload
3. 查看允许通过防火墙的端口:firewall-cmd --list-ports
2.5、启动非master节点的所有rabbitmq服务
# 方式1
service rabbitmq-server start
# 方式2
rabbitmqctl start_app
2.6、设置集群名称,在任意一个节点上执行即可
rabbitmqctl set_cluster_name pingwazi_rabbitmq_cluster
2.7、设置为镜像队列,在任意一个节点上执行即可
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
3、集群的负载均衡环境搭建
3.1、Haproxy安装配置
3.1.1、下载并安装
#到官网下载Haproxy的合适包(一般选择次新版),文件默认是下载到当前目录的
curl -O https://www.haproxy.org/download/2.0/src/haproxy-2.0.15.tar.gz
#解压文件
tar -zxvf haproxy-2.0.15.tar.gz
#按照依赖
yum install -y openssl openssl-devel systemd-devel.x86_64
#进入haproxy的解压目录
cd haproxy-2.0.15
#执行安装
make TARGET=linux-glibc USE_OPENSSL=1 USE_SYSTEMD=1 USE_PCRE=1 USE_ZLIB=1 && make install
开启https
USE_OPENSSL=1
指定为systemd模式
USE_SYSTEMD=1
可指定安装目录
PREFIX=/usr/local/haproxy
默认为/usr/local/sbin/
3.1.2、配置系统服务
# 1、创建haproxy.service文件
vi /usr/lib/systemd/system/haproxy.service
# 2、haproxy.service 内容如下
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
#3、重载系统服务
systemctl daemon-reload
#4、加入开机自启动
systemctl enable haproxy.service
#5、启动、停止等操作
systemctl start/restart/stop/status haproxy
3.1.3、覆盖Haproxy的配置文件
里面的ip地址要换成自己安装了rabbitmq服务器的centos的机器的ip地址
vi /etc/haproxy/haproxy.cfg
# 在命令行模式下输入d+G,目的是清空当前内容
# 填写以下内容
#绑定配置
listen rabbitmq_cluster
bind 0.0.0.0:5672
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#RabbitMQ集群节点配置
server rmq_node0 172.16.255.130:5672 check inter 5000 rise 2 fall 3 weight 1
server rmq_node1 172.16.255.131:5672 check inter 5000 rise 2 fall 3 weight 1
server rmq_node2 172.16.255.132:5672 check inter 5000 rise 2 fall 3 weight 1
listen rabbitmq_cluster_webmanager
bind 0.0.0.0:15672
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#RabbitMQ集群节点配置
server rmq_node0 172.16.255.130:15672 check inter 5000 rise 2 fall 3 weight 1
server rmq_node1 172.16.255.131:15672 check inter 5000 rise 2 fall 3 weight 1
server rmq_node2 172.16.255.132:15672 check inter 5000 rise 2 fall 3 weight 1
#haproxy监控页面地址
listen monitor
bind 0.0.0.0:8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
如果按照Haproxy机器的防火墙是打开的话,要允许通过5672、15672、8100接口
# 通过指定端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=8100/tcp --permanent
# 重启防火墙
firewall-cmd --reload
# 查看是否添加成功
firewall-cmd --list-ports
浏览器输入http://haproxy的ip:15627/、http://haproxy的ip:8100/stats
3.1.4、另外一台服务器也是同样的步骤(当然也可以克隆镜像的方式再创建一个机器,但是ip地址要记得修改哦)
3.2、keepalived安装配置
3.2.1、下载并安装
#到官网下载合适的安装包(一般选择次新版)
curl -O https://www.keepalived.org/software/keepalived-2.0.20.tar.gz
#解压
tar -zxvf keepalived-2.0.20.tar.gz
#进入解压目录
cd keepalived-2.0.20
#执行配置,指定路径
./configure --prefix=/usr/local/keepalived
# 编译并安装
make && make install
3.2.2、配置系统服务
# 拷贝源码中的keepalived-2.0.20/keepalived/etc/init.d/keepalived 到 /etc/init.d/
cp /usr/local/src/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
# 拷贝编译后的keepalived/etc/sysconfig/keepalived 到 /etc/sysconfig/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# 创建文件夹
mkdir /etc/keepalived
# 把配置文件移到文件夹中
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# 把执行文件移动到/usr/sbin/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#安装系统自动启动
systemctl enable keepalived
3.2.3、覆盖配置文件
vi /etc/keepalived/keepalived.conf
#全局定义
global_defs {
router_id keepalived_133 #唯一的值,也可以改成IP
}
#检测脚本定义
vrrp_script chk_haproxy {
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2 # 检测脚本执行的间隔
}
#虚拟实例定义
vrrp_instance VI_1 {
state MASTER #主机为MASTER,备用机为BACKUP
interface ens33 #网卡名,用ifconfig查看
virtual_router_id 133 #主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #心跳,每隔1秒钟检测一下服务器是否还活着
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.255.135 # 暴露给外界的虚拟IP地址,切记要与实际服务器处于同一网段
}
track_script {
chk_haproxy
}
}
3.2.4、编写检查服务指定服务是否存活的脚本
vi /etc/keepalived/scripts/haproxy_check.sh
#!/bin/bash
num=`ps -C haproxy --no-header |wc -l`
if [ $num -eq 0 ]
then
echo "尝试重启haproxy">>/etc/keepalived/scripts/haproxy_check.log
systemctl restart haproxy
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ]
then
echo "重启haproxy失败,停止keepavlied服务">>/etc/keepalived/scripts/haproxy_check.log
systemctl stop keepalived
fi
fi
3.2.5、配置防火墙(如果防火墙没有打开,可以跳过)
Keepalived是一个轻量级的HA集群解决方案,但开启防火墙后各节点无法感知其它节点的状态,各自都绑定了虚拟IP。网上很多文章讲要配置防火墙放过tcp/112,在CentOS7下是无效的,正确的做法是配置放过vrrp协议,方法如下:
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
Keepalived使用vrrp组播,默认地址是224.0.0.18,因此要配置防火墙放过。 完成后再用ip addr查看,集群已经正常了,只有主节点绑定虚拟IP,备份节点不会绑定了。
3.2.6、另外一台服务器keepalived的安装配置也是同理,只是conf文件中需要将state指定为BACKUP,同时将优先级设置得比MASTER小50
3.2.7、浏览器中输入地址进行测试
http://虚拟ip:15627/、http://虚拟ip:8100/