2、RabbitMQ+HA高可用集群搭建
本文介绍HAProxy+Keepalived搭建RabbitMQ高可用集群
RabbitMQ的高可用集群方案有普通的Cluster模式和镜像集群模式,本文重点介绍HAProxy+Keepalived搭建RabbitMQ镜像高可用集群
1、镜像模式
1.1、软件版本
RabbitMQ是版本3.13.6
Erlang采用的匹配版本26.2.5.18
1.2、机器规划
准备三台虚拟机,可以用克隆功能。 192.168.0.61 RabbitMQ内存节点 HAPRoxy Keepalived(master) 192.168.0.62 RabbitMQ内存节点 HAPRoxy Keepalived(backup) 192.168.0.63 RabbitMQ磁盘节点 VIP 192.168.0.60
1.3、网络结构图

1.4、安装Erlang
- 下载
下载地址:https://www.erlang.org/downloads,找到对应的版本(这里用的是版本26.2.5.18)
- 解压
解压下载的文件,并进入到解压后的目录
tar -zxf otp_src_26.2.5.18.tar.gz
cd ./otp_src_26.2.5.18
- 配置并指定安装目录
./configure --prefix=/usr/local/erlang
这个过程中会检查所需的依赖,根据控制台的实际输出提示,如果缺少依赖包的话手动安装以下即可,最后也可能出现下图这种情况,实际上也不影响功能使用

- 编译安装
编译安装之前先把对应的安装目录创建好,避免找不到目录
sudo mkdir /usr/local/erlang
sudo make & sudo make install
看到类似这个界面而且没有报错则说明基本安装成功了

- 配置环境变量
修改/etc/profile文件,在文件最后添加erlang的可执行文件路径到系统path中
vim /etc/profile
# 添加一行内容(路径根据自己的具体情况而定,这里的安装目录是/usr/local/erlang)
export PATH=$PATH:/usr/local/erlang/bin
# 使配置升啸
source /etc/profile
- 验证
执行erl命令验证erlang是否安装成功,如果能够正常进入打erl的命令行控制台,且能正常显示出版本等信息,说明erlang的安装工作顺利完成

1.5、安装RabbitMQ
- 下载
下载对应的版本,这里用的是3.13.6,注意选择rabbitmq-server-generic-unix-3.13.6.tar.xz而不是rabbitmq-server-3.13.6.tar.xz,下载地址为:https://github.com/rabbitmq/rabbitmq-server/releases?page=6#release-v3.13.6
- 解压
# 下载下来的是tar.xz文件,用xz命令解压成tar
xz -d rabbitmq-server-3.13.6.tar.xz
# 再用tar命令解压
tar -xf rabbitmq-server-3.13.6.tar
解压完成后进入到对应的目录,可以看到:

其中sbin目录下就是rabbitmq的命令行工具

- 配置环境变量
修改/etc/profile文件,再文件末尾将sbin目录添加到系统PATH
export PATH=$PATH:/home/ubuntu/tools/rabbitmq_server-3.13.6/sbin
# 使配置生效
source /etc/profile
- 启动rabbitmq
文档来源:
HAProxy+Keepalived搭建RabbitMQ高可用集群
参考资料:
姊妹篇
RabbitMQ安装问题汇总帖Docker安装RabbitMQ集群Windows安装RabbitMQ 3.8.9CentOS7安装RabbitMQ单机版(3.8.4) 虚拟机环境配置参考: VMware+Centos7 静态IP设置方法
1、镜像模式
1.1、软件版本
Erlang是当前最新版本23.1 RabbitMQ是当前最新版本3.8.9
1.2、机器规划
准备三台虚拟机,可以用克隆功能。 192.168.44.156 RabbitMQ内存节点 HAPRoxy Keepalived(master) 192.168.44.157 RabbitMQ内存节点 HAPRoxy Keepalived(backup) 192.168.44.158 RabbitMQ磁盘节点 VIP 192.168.44.159
1.3、网络结构图

1.4、安装Erlang和RabbitMQ
先按这个步骤在三台机器上分别安装好Erlang和RabbitMQ。 软件下载到 cd /usr/local/soft CentOS7安装RabbitMQ单机版
可以用XShell的批量操作功能,同时发送命令到所有窗口,同时安装三台。 用户也要添加,管理插件也要启用。
1.5、配置.erlang.cookie
.erlang.cookie 默认在当前用户根目录下,是隐藏文件,只读文件。 权限要先改成777,改完以后还原成400 将三台机器内容改为一致,或者把第一台机器.erlang.cookie上传到其他两台机器。
cd ~
chmod 777 .erlang.cookie
vim .erlang.cookie
chmod 400 .erlang.cookie
1.6、配置三台机器host
vim /etc/hosts
添加内容:
192.168.44.156 rmq156
192.168.44.157 rmq157
192.168.44.158 rmq158
重启网络
service network restart
相互验证一下,看看能不能ping通:
ping rmq157
1.7、加入集群
在158(磁盘节点)上执行:
cd /usr/local/soft/rabbitmq_server-3.8.9/sbin
./rabbitmq-server -detached >nohup.out&
./rabbitmqctl start_app
在156、157(内存节点)上执行:
cd /usr/local/soft/rabbitmq_server-3.8.9/sbin
./rabbitmq-server -detached >nohup.out&
./rabbitmqctl start_app
./rabbitmqctl stop_app
./rabbitmqctl join_cluster --ram rabbit@rmq158
./rabbitmqctl start_app
查看集群状态
./rabbitmqctl cluster_status
也可以在任何一台机器的管理界面查看:

设置镜像队列,在三台机器上执行:
./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
1.8、安装HAPRoxy
yum install -y haproxy
1.9、配置HAProxy
cd /etc/haproxy/
cp haproxy.cfg haproxy.cfg.bak
配置文件内容全部覆盖
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy # 改变当前工作目录
pidfile /var/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
user root # 默认用户
group root # 默认组
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为daemon
stats socket /var/lib/haproxy/stats # 创建监控所用的套接字目录
#---------------------------------------------------------------------
# defaults settings
#---------------------------------------------------------------------
# 注意:因为要使用tcp的负载,屏蔽掉与http相关的默认配置
defaults
mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global
# option httplog # 采用http日志格式
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
# option http-server-close # 每次请求完毕后主动关闭http通道
# option forwardfor except 127.0.0.0/8 # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 # 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 3000 # 最大连接数
###################### 打开haproxy的监测界面###############################
listen status
bind 0.0.0.0:9188
mode http
stats enable
stats refresh 30s
stats uri /stats #设置haproxy监控地址为http://localhost:9188/stats
stats auth admin:123456 #添加用户名密码认证
stats realm (Haproxy\ statistic)
stats admin if TRUE
######################监听rabbitmq的web操作页面############################
listen rabbitmq_admin
bind 0.0.0.0:15670
server rmq156 192.168.44.156:15672
server rmq157 192.168.44.157:15672
#######################监听rabbimq_cluster #################################
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
#负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
balance roundrobin
#check inter 2000 是检测心跳频率
#rise 2是2次正确认为服务器可用
#fall 2是2次失败认为服务器不可用
server rabbit1 192.168.44.156:5672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.44.157:5672 check inter 5000 rise 2 fall 2
1.10、启动156和157的haproxy
haproxy -f /etc/haproxy/haproxy.cfg
其他命令:
service haproxy restart
service haproxy stop
1.11、浏览器访问:
192.168.44.156:15670 192.168.44.157:15670 这两个都能正常访问RabbitMQ管理界面,用admin/admin登录
192.168.44.156:9188/stats 192.168.44.157:9188/stats 这两个能正常访问HaProxy监控界面,用amdin/123456登录

1.12、安装Keepalived
yum install -y keepalived
1.13、配置Keepalived
cd /etc/keepalived
cp keepalived.conf keepalived.conf.bak
156为master,配置内容
global_defs {
router_id NodeA # 起一个唯一的名字,不能与备机相同
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5
weight 2
}
vrrp_instance VI_1 {
state MASTER # 这里标记为主
interface ens33 # 这里的必须和你的网卡一致,ipconfig获得
virtual_router_id 1 # 这里表示路由的唯一标识与备机一致
priority 100 # 配置优先级
advert_int 1
authentication {
auth_type PASS
auth_pass root # 配置认证密码
}
virtual_ipaddress { # 配置虚拟ip地址,就是开放的地址,与本机ip不同
192.168.44.159
}
track_script {
chk_haproxy
}
}
157为backup,配置内容 router_id、vrrp_instance state、priority要修改
global_defs {
router_id NodeB
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 通过BACKUP表示该机器为备机
interface ens33 # 与网卡一致,ipconfig获得
virtual_router_id 1 # 与主机一致
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass root
}
virtual_ipaddress { # 开放的虚拟地址
192.168.44.159
}
track_script {
chk_haproxy
}
}
编写脚本内容,自动重启HAProxy的服务,如果不成功则关闭Keepalived服务
vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then
haproxy -f /etc/haproxy/haproxy.cfg
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then
service keepalived stop
fi
作用: 如果HAProxy服务挂了,先重启。 如果重启不成功,关闭Keepalived服务,切换倒backup
1.14、启动keepalived
先启动156 master,再启动157 slave
service keepalived start
查看状态
service keepalived status
查看启动日志:
journalctl -xe
查看keepalived日志
tail -f /var/log/messages
访问: 192.168.44.159:15670 admin/admin登录

192.168.44.159:9188/stats amdin/123456登录

应用连接到 192.168.44.159:5670 收发消息
cluster普通模式
Rabbit MQ除了上面采用的镜像模式之外,还提供了一种Cluster普通模式,它的架构图如下图所示:

这种模式的主要特点是每个broker节点上的队列内容并不是完全一样的,每个broker负责自己路由的队列消息内容,各个节点之间通过同步元数据的形式保持数据通信。比如生产者在发送消息的时候,客户端会路由到某一个节点上(比如节点1),如果这个时候要发送的消息路由到的队列不在这个节点上(比如在节点2上),那么客户端会根据当前节点上保存的元数据信息找到节点2及其队列相关的信息,客户端就可以根据这些信息重新路由
元数据里边的内容包括:
队列元数据信息,如队列的名称和属性
交换机元数据信息,如交换机的名称和属性
绑定关系元数据,如交换机和队列的绑定关系或者交换机和交换机之间的绑定关系(比如交换机的
alternate-exchange属性可以指定一个备选交换机,当消息无法在当前交换机进行路由的时候转发到备选交换机上)vhost元数据,为vhost内的队列、交换机和绑定提供命名空间以及安全属性之间的绑定关系
但是这种模式会出现一个问题,假如节点2挂了,消息就无法正确路由打这个节点上,也就是对应节点上的数据就会出现丢失。镜像模式就通过数据冗余解决了这个问题,因为所有数据在所有节点上都会存储一份。也正是因为如此,镜像模式相较于普通集群模式而言消息的效率会低一些。

