Dcoker配置Rabbitmq集群
三台服务器
服务器 | 主机名称 |
---|---|
192.168.206.212 | node1 |
192.168.206.213 | node2 |
192.168.206.214 | node3 |
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