RabbitMQ 单节点就是可用性上的单点,这篇把三节点集群、镜像队列和 HAProxy 负载均衡一次搭完。
环境规划与初始化
| 主机名 | 服务器IP | 应用 | 模式 |
| RabbitMQ01 | 192.168.66.140 | RabbitMQ | 磁盘节点、管理节点 |
| RabbitMQ02 | 192.168.66.141 | RabbitMQ | 内存节点 |
| RabbitMQ03 | 192.168.66.142 | RabbitMQ | 内存节点 |
| HAProxy | 192.168.66.143 | HAProxy | 集群负载均衡 |
主机名在三台分别设置,注意别取太长,主机名过长有导致加入集群失败的可能;然后关防火墙、关 SELinux、把主机名解析写进各节点 hosts:
[root@localhost ~]# hostnamectl set-hostname xxxx
systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager && systemctl status NetworkManager
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 && getenforce
cat >> /etc/hosts <<EOF
192.168.66.140 rabbitmq01
192.168.66.141 rabbitmq02
192.168.66.142 rabbitmq03
EOF
集群模式与几个概念
RabbitMQ 集群分两种模式。普通模式是默认行为:队列的消息实体只存在其中一个节点,各节点间只同步队列结构这类元数据;消费者从另一节点进来时,消息会被临时转发。所以消费者要尽量轮询连接每个节点,否则出口总压在同一个节点上;而且存放消息的节点挂了,未消费的消息就拿不到了,做了持久化的要等节点恢复才能消费,没持久化的直接丢。
镜像模式则把队列镜像到多个节点,消息实体主动在镜像节点间同步,实现高可用,代价是集群内部同步通信占用大量网络带宽。
节点分两类:内存节点把队列、交换机、绑定、用户权限、vhost 元数据放内存,声明操作更快;磁盘节点落盘,单节点系统只允许磁盘类型。集群至少要有一个磁盘节点,节点加入/离开都要通知到至少一个磁盘节点;唯一的磁盘节点崩了集群还能跑消息,但增删改查这些管理操作会全部锁死,直到它恢复。节点之间靠 Erlang Cookie 互认,相当于共享密钥,长度不限、全集群一致即可,位置在 /var/lib/rabbitmq/.erlang.cookie 或 /root/.erlang.cookie,为保证一致这里直接从一个节点拷贝。
安装与组建集群
所有节点先装 Erlang(RPM 包)再装 rabbitmq-server:
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.8/erlang-23.3.4.8-1.el7.x86_64.rpm
yum install erlang-23.3.4.8-1.el7.x86_64.rpm -y
#加速下载地址
wget https://github.91chifun.workers.dev/https://github.com//rabbitmq/rabbitmq-server/releases/download/v3.9.8/rabbitmq-server-3.9.8-1.el7.noarch.rpm
#yum安装服务
yum install rabbitmq-server-3.9.8-1.el7.noarch.rpm -y
各节点先把服务启动、生成随机 cookie 文件,再把 rabbitmq01 的 .erlang.cookie 同步到其他节点(拷贝前先停掉 2、3 号节点的服务,同步完检查文件权限):
systemctl start rabbitmq-server.service
#拷贝文件之前,先把节点2和3上的rabbitmq服务停止
systemctl stop rabbitmq-server.service
scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq02:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq03:/var/lib/rabbitmq/
#拷贝过去之后节点2和3一定要重新启动服务,然后再进行加入集群
systemctl restart rabbitmq-server.service
02、03 节点分别执行加入命令,磁盘节点直接加入即可,要做内存节点需加 --ram 参数:
注意:默认是磁盘节点,如果是内存节点的话,需要加--ram参数
rabbitmqctl stop_app
# --ram是以内存方式加入
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app

任意节点验证集群状态:
rabbitmqctl cluster_status

管理界面与账号
所有节点启用 management 插件后通过 IP:15672 访问,默认账号密码都是 guest;新管理账号在任意节点创建即可:
rabbitmq-plugins enable rabbitmq_management

(1)添加一个新的/新用户,比如admin和密码admin
rabbitmqctl add_user admin admin
(2)为新用户授予管理访问权限:
rabbitmqctl set_user_tags admin administrator
(3)为新创建的用户设置权限:
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
(4)再次访问页面,输入上面创建的账号密码就可以正常登入进去了

镜像策略
给所有队列开全量镜像:ha-all 是策略名,^ 是匹配符(单个 ^ 匹配所有队列),ha-mode 三种取值:all(所有节点)、exactly(指定数量)、nodes(指定节点列表):
[root@rabbitmq01 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
HAProxy 负载均衡
HAProxy 单独部署在一台机器上,一条 yum 就装好:
yum install haproxy
配置里把 5672 转发到三个 RabbitMQ 节点、再加一个 80 端口的 stats 页面:
vim /etc/haproxy/haproxy.cfg
我们只需要在文件末尾加上如下配置即可!将默认配置文件中global和defaults保留之外,其他的默认配置删除掉
##监控查看本地状态#####
listen admin_stats
bind *:80
mode http
option httplog
option httpclose
log 127.0.0.1 local0 err
stats uri /haproxy
stats auth admin:admin #登录haproxy的用户名和密码
###反代监控
frontend server
bind *:5670
log global
mode tcp
default_backend rabbitmq
maxconn 3
backend rabbitmq
mode tcp
log global
balance roundrobin
server rabbitmq1 192.168.66.140:5672 check inter 2000s rise 2 fall 3
server rabbitmq2 192.168.66.141:5672 check inter 2000s rise 2 fall 3
server rabbitmq3 192.168.66.142:5672 check inter 2000s rise 2 fall 3
启动服务,浏览器访问 192.168.66.143:80 看集群各节点状态,账号 admin:
#启动服务
systemctl start haproxy
systemctl enable haproxy

收尾提醒
客户端统一连 HAProxy 的地址而不是逐个怼节点;镜像队列的同步吃内网带宽,节点跨机房部署前先测复制延迟;磁盘节点建议至少两个,避免唯一磁盘节点宕机后集群只能消费不能管理。

















暂无评论内容