RabbitMQ 三节点集群 + 镜像队列 + HAProxy 负载均衡部署

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
rabbitmq01

任意节点验证集群状态:

rabbitmqctl cluster_status
rabbitmq02

管理界面与账号

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

rabbitmq-plugins enable rabbitmq_management
rabbitmq03
(1)添加一个新的/新用户,比如admin和密码admin
rabbitmqctl add_user admin admin

(2)为新用户授予管理访问权限:
rabbitmqctl set_user_tags admin administrator

(3)为新创建的用户设置权限:
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

(4)再次访问页面,输入上面创建的账号密码就可以正常登入进去了
rabbitmq04

镜像策略

给所有队列开全量镜像: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
rabbitmq05

收尾提醒

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

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容