Dcoker配置Rabbitmq集群

三台服务器

服务器主机名称
192.168.206.212node1
192.168.206.213node2
192.168.206.214node3

1、修改主机名称

# 在三台主机上修改名称 分别为node1 node2 node3
sudo hostnamectl set-hostname node1

2、下载镜像

docker pull rabbitmq:3.7.7-management

3、启动

#第一台服务器
docker run -d --hostname node1 --name myrabbit1 -p 15672:15672 -p 15692:15692  -p 5672:5672 -p 4369:4369 -p 25672:25672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie'  --restart always --add-host=node1:192.168.206.212 --add-host=node2:192.168.206.213 --add-host=node3:192.168.206.214 2888deb59dfc 

#第二台服务器
docker run -d --hostname node2 --name myrabbit2 -p 15672:15672 -p 15692:15692  -p 5672:5672 -p 4369:4369 -p 25672:25672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie'  --restart always --add-host=node1:192.168.206.212 --add-host=node2:192.168.206.213 --add-host=node3:192.168.206.214 2888deb59dfc 

#第三台服务器
docker run -d --hostname node3 --name myrabbit3 -p 15672:15672 -p 15692:15692  -p 5672:5672 -p 4369:4369 -p 25672:25672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie'  --restart always --add-host=node1:192.168.206.212 --add-host=node2:192.168.206.213 --add-host=node3:192.168.206.214 2888deb59dfc 

4、容器内RabbitMQ设置

#进入myrabbit1容器,重新初始化一下
docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

#进入myrabbit2容器,重新初始化一下,将02节点加入到集群中
docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@node1  #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。
rabbitmqctl start_app
exit

#进入myrabbit3容器,重新初始化一下,将03节点加入到集群中
docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@node1 #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。
rabbitmqctl start_app
exit

访问页面如下所示

在这里插入图片描述

# 此外如果想变更节点类型,可以使用change_cluster_node_type命令
# 1.停止服务
rabbitmqctl stop_app
# 2.变更类型 ram disc
rabbitmqctl change_cluster_node_type disc
# 3.重启服务
rabbitmqctl start_app

集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。到此,普通集群配置完毕。

#查看集群的状态:
rabbitmqctl cluster_status

5、普通集群问题

在node1节点上添加一个队列

在这里插入图片描述

分别访问node2和node3节点都可以看见这个添加的队列

在这里插入图片描述在这里插入图片描述

进入node1节点中的simple队列发送一条消息:

在这里插入图片描述
在这里插入图片描述

在node2节点和node3节点也可以看见消息。

在这里插入图片描述

随后让节点node1宕机,分别访问node2和node3,看到simple已不可用。说明node1的数据没有拷贝到node2和node3。

[root@node1 ~]# docker stop myrabbit1

在这里插入图片描述

总结:在普通集群模式下,一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。如果要解决这个问题,必须使用镜像集群方案。

6、配置镜像队列集群

镜像队列是在普通集群搭建后,通过设置同步策略来实现的。在任何一台机子执行下面命令:

#任意节点执行,设置镜像集群模式
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

上面这行命令在vhost名称为 / 创建了一个策略,策略名称为ha,策略模式为all(即复制到所有节点),包含新增节点,策略正则表达式为 ^

-p <vhost>:可选参数,针对指定vhost下的queue进行设置
ha: 策略名称
^: 匹配符 只有一个^代表匹配所有, ^abc为匹配名称为abc开头的queue或者exchange
ha-mode: 为同步模式,一共3种模式:
		1、all:所有的节点都同步消息
		2、exctly:指定节点的数目 (需配置ha-params参数,此参数为int类型 比如2,在集群中随机抽取2个节点同步消息)
		3、nodes:指定具体节点 (需配置ha-params参数,此参数为数组类型比如 ["rabbit@rabbitmq1","rabbit@rabbitmq2"] ,明确指定在这两个节点上同步消息)
ha-sync-mode: 进行队列中消息的同步方式,有效值为 automatic(自动)和manual(手动)

举例:
对队列名称以"queue_"开头的所有队列进行镜像,并在集群的两个节点上完成进行,policy的设置命令为:
rabbitmqctl set_policy ha-queue-two '^queue_' '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

下面是我开启一个SpringBoot项目(项目中写了几个队列,可以自己写一个关于Rabbitmq的简单SpirngBoot项目测试)之后,重新查看页面后的结果。
可以看到队列列表中,在Node列有个+N的标记,表示同步了几个节点。

在这里插入图片描述

发送一条消息,在RabbitMq的web管理端,可以看见三个实例上都会有一条消息,但是实际上消息本身只存在一个Rabbitmq实例。

#查询策略 
#查看vhost下的所有的策略(policies )
rabbitmqctl list_policies -p / 

#删除策略 ha为策略名称
rabbitmqctl clear_policy ha
posted @ 2022-11-07 10:07  云村的王子  阅读(2)  评论(0编辑  收藏  举报  来源