原理:
Rabbitmq的镜像集群实际上是在普通集群的基础上增加了策略,它需要先按照普通集群的方式进行部署,部署完成之后再通过创建镜像队列的策略实现主备节点消息同步。也就是说,每个备用节点都有和主节点一样的队列,这个队列是由主节点通过创建镜像队列所产生的,且这些备用节点能及时的同步主节点中队列的入队消息。当消息设置了持久化时,每个节点都有属于自己的本地消息持久化存储机制。当消息入队和出队时,所有关于对主节点的操作都会同步给备用节点用来更新。此集群模式在主节点宕机之后备用节点所保留的消息与主节点完全一致,即可实现高可用。
一、 普通集群 (主从集群)部署
1.修改三台机器主机名和ip映射
更改三台MQ节点的计算机名分别为mq0、mq1 和mq2,然后修改hosts配置文件
vi /etc/hosts
192.168.233.101 mq01
192.168.233.102 mq02
192.168.233.103 mq03
2.安装rabbitmq
命令行安装:
yum install -y rabbitmq-server
3.同步cookie文件
将mq01机器的.erlang.cookie文件复制到mq02和mq03机器(此文件在rabbitmq服务启动时自动生成),因为节点之间需要通过此文件来判断是否允许交流(判断是否属于集群内部节点),如果三台机器的此文件内容不一致则集群无法启动成功。此文件内容一般是由不超过255个数字或字母组成的字符串构成。
在mq01上执行:
scp /var/lib/rabbitmq/.erlang.cookie root@mq02:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@mq03:/var/lib/rabbitmq/
4.启动rabbitmq
在三个节点分别执行rabbitmq启动命令:
systemctl start rabbitmq-server
5.在从节点(mq02和mq03)执行加入集群命令:
在mq02、mq03分别执行命令:
rabbitmqctl stop_app
#先停止服务(注:这里的参数stop_app和stop是不一样的,stop是停掉服务,stop_app是停掉这个节点,但是并没有停止rabbitmq依赖的erlang进程
rabbitmqctl reset
# 重置状态(注:这里重置节点将会把此节点下的所有数据全部清除,包括队列、交换器、虚拟主机和用户等)
rabbitmqctl join_cluster rabbit@mq01
# 节点加入集群, 初次加入集群必须通过这种加入基准节点的方式。
rabbitmqctl start_app
# 启动服务
6.查看集群状态
任一节点执行:
rabbitmqctl cluster_status
# rabbitmqctl cluster_status
Cluster status of node 'rabbit@mq03'
[{nodes,[{disc,['rabbit@mq01','rabbit@mq02','rabbit@mq03']}]},
{running_nodes,['rabbit@mq01','rabbit@mq02','rabbit@mq03']},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{'rabbit@mq01',[]},
{'rabbit@mq02',[]},
{'rabbit@mq03',[]}]}]
看到这些信息,说明集群已成功
7.登录管理页面,查看状态
任一节点ip:15672 如无法访问查看防火墙 ; 默认用户/密码:guest/guest
可以看到三个节点的数据就表示成功了
8.集群命令
# 修改集群的名称为rabbitmq_cluster
rabbitmqctl set_cluster_name rabbitmq_cluster
#停止rabbitmq2 rabbitmq3服务或者rabbitmqctl stop_app停止应用后
#在rabbitmq1上 从集群中 移除节点
rabbitmqctl forget_cluster_node rabbit@mq02
rabbitmqctl forget_cluster_node rabbit@mq03
#重置数据, 用户名密码都会要重新设置
rabbitmqctl stop_app
rabbitmqctl reset
#修改成磁盘(内存)节点
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc(ram)
rabbitmqctl start_app
二、镜像集群部署
镜像集群是基于普通主从集群的,
1.设置策略
在mq01执行:
rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all"}'
说明:策略正则表达式为'^'表示所有匹配所有队列名称 ^hello:匹配hello开头队列
策略说明
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级
1.查看当前策略
rabbitmqctl list_policies
2.添加策略
rabbitmqctl set_policy ha-all '^hei' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
3.删除策略
rabbitmqctl clear_policy ha-all
rabbitmq命令
# 创建账号
$ rabbitmqctl add_user admin admin
# 设置用户角色
$ rabbitmqctl set_user_tags admin administrator
# 设置用户权限
# 该命令使用户 admin 具有 / 这个 virtual host 中所有资源的配置、写、读权限以便管理其中的资源
$ rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
三、配置haproxy
1.安装haproxy
yum install haproxy
2.配置代理负载
# 监听RabbitMQ管理页面
listen rabbitmq_admin
bind 0.0.0.0:15671
server rabbitmq01 192.168.233.101:15672
server rabbitmq02 192.168.233.102:15672
server rabbitmq03 192.168.233.103:15672
# 监听HAProxy的管理页面
listen private_monitoring
bind 0.0.0.0:1080 # 监听端口
mode http
option httplog
stats enable
stats refresh 30s # 统计页面自动刷新时间
stats uri /haproxy?stats # 统计页面url
stats realm Haproxy Manager # 统计页面密码框上提示文本
stats auth admin:passw0rd # 统计页面用户名和密码设置
# states hide-version # 隐藏统计页面上HAProxy的版本信息
# HAProxy监听RabbitMQ集群
listen rabbitmq_cluster
bind 0.0.0.0:5671
mode tcp # 配置TCP模式
timeout client 3h
timeout server 3h
timeout connect 3h
option tcplog
balance roundrobin # 简单轮询
# check inter 5000 是检测心跳,rise 2 是2次正确认为服务器可用,fall 3 是3次失败认为服务器不可用
server rabbitmq01 192.168.233.101:5672 check inter 5000 rise 2 fall 2
server rabbitmq02 192.168.233.102:5672 check inter 5000 rise 2 fall 2
server rabbitmq03 192.168.233.103:5672 check inter 5000 rise 2 fall 2
3.启动haproxy
systemctl start proxy
打完收工!!
2023.7.14补充:
收工太早了。。。
想想 如果haproxy服务挂了 或者所在的服务器断电了怎么搞?
所以需要对ha做些工作,结合KeepAlived,架构图如下:
部署结构:
rabbitmq01 服务器:部署 RabbitMQ + HAProxy + KeepAlived ;
rabbitmq02 服务器:部署 RabbitMQ + HAProxy + KeepAlived ;
rabbitmq03 服务器:部署 RabbitMQ
什么是KeepAlived?
KeepAlived 采用 VRRP (Virtual Router Redundancy Protocol,虚拟路由冗余协议) 来解决单点失效的问题,它通常由一组一备两个节点组成,同一时间内只有主节点会提供对外服务,并同时提供一个虚拟的 IP 地址(Virtual Internet Protocol Address ,简称 VIP) 。 如果主节点故障,那么备份节点会自动接管 VIP 并成为新的主节点 ,直到原有的主节点恢复。
相关配置网上一大堆,自己找吧。