-- docker搭建跨主机rabbitmq镜像集群 --
1. 前言
在不同主机上使用docker搭建rabbitmq镜像集群
1.1 相关软件及版本
rabbitmq 镜像版本:3.8.9-management, 3.8-management, 3-management, management
宿主机 3台
- 192.168.8.192
- 192.168.8.193
- 192.168.8.194
docker 版本:19.03.12
为了让不同宿主机里的rabbitmq互相访问,需要搭建docker swarm集群。
三台宿主机docker版本相同,组成docker swarm集群,且均为管理节点。如何创建集群可以看本人上一篇博客:docker跨主机网络互通。
2. 安装
2.1 创建跨主机互通网络
在docker任意一个管理节点上创建一个跨主机互通overlay网络,网络名称为rabbit
docker network create -d overlay --subnet=10.12.0.0/16 --gateway=10.12.0.254 --attachable=true rabbit
这样,在不同宿主机上,使用rabbit
这个网络的容器就可以互相通信了。
2.2 创建rabbitmq容器
在192节点上创建rabbitmq容器:
docker run -d \
--name rabbit2 \
-e RABBITMQ_NODENAME=rabbit@rabbit2 \
--network=rabbit \
--ip=10.12.192.1 \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
-e RABBITMQ_ERLANG_COOKIE='OIYADJKSIYGNMZPQLNIW' \
-p 15672:15672 \
-p 5672:5672 \
--restart=always \
rabbitmq:management
-e RABBITMQ_NODENAME
设置节点名称,集群需要用到
--network
指定要使用的网络名称
--ip
设置ip地址,需要与使用的网络为同一网段
-e RABBITMQ_DEFAULT_USER
默认账号 不设置的话为guest/guest
-e RABBITMQ_DEFAULT_PASS
默认密码
-e RABBITMQ_ERLANG_COOKIE
集群需要用到,三台机器cookie需要一致
-p
添加端口映射
--restart=always
在容器退出时总是重启容器,实现开机自启容器
193节点上执行:
docker run -d \
--name rabbit3 \
-e RABBITMQ_NODENAME=rabbit@rabbit3 \
--network=rabbit \
--ip=10.12.193.1 \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
-e RABBITMQ_ERLANG_COOKIE='OIYADJKSIYGNMZPQLNIW' \
-p 15672:15672 \
-p 5672:5672 \
--restart=always \
rabbitmq:management
194节点上执行:
docker run -d \
--name rabbit4 \
-e RABBITMQ_NODENAME=rabbit@rabbit4 \
--network=rabbit \
--ip=10.12.194.1 \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
-e RABBITMQ_ERLANG_COOKIE='OIYADJKSIYGNMZPQLNIW' \
-p 15672:15672 \
-p 5672:5672 \
--restart=always \
rabbitmq:management
访问http://192.168.8.192:15672/ http://192.168.8.193:15672/ http://192.168.8.194:15672/ 查看刚刚搭建好的3个rabbitmq单机环境。
2.3 创建rabbitmq普通集群
在193和194节点上分别执行以下命令,加入192的节点。
[root@datasource4 ~]# docker exec -it rabbit3 /bin/bash
root@06522b0e647b:/# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit4 ...
root@06522b0e647b:/# rabbitmqctl reset
Resetting node rabbit@rabbit4 ...
root@06522b0e647b:/# rabbitmqctl join_cluster rabbit@rabbit2
Clustering node rabbit@rabbit4 with rabbit@rabbit2
root@06522b0e647b:/# rabbitmqctl start_app
Starting node rabbit@rabbit4 ...
执行完毕之后,查看目前的普通集群:
此时搭建的普通集群中,并没有高可用。
这里举个例子验证下。创建一个队列work
,所属节点为192(rabbit2)。
如果192节点正常提供服务,用户可以从任意节点发送/接收work
节点的消息
如果192节点宕机的话:
队列显示下线:
此时从任意节点访问时会报错,并没有做到高可用。
下面就设置策略让3台节点作为镜像节点。
2.4. 镜像集群设置
镜像集群,就是让3台或多台节点的数据互相复制,在他们之间设置主从关系。当一台节点宕机时,其他节点可以继续提供服务。
类似于redis集群的哨兵模式。
配置:
2.4.1 策略说明
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的优先级
2.4.2 查看当前策略
rabbitmqctl list_policies
2.4.3 添加策略
rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all","ha-sync-mode":"automatic"}' -p /parent
说明:策略正则表达式为 “^” 表示所有匹配所有队列名称 ^work:匹配hello开头队列
或者,在网页管理端进行设置
2.4.4 删除策略
rabbitmqctl clear_policy ha-all
设置之后,查看队列状态:
配置完成。任意节点宕机,其他节点仍然可以对外提供访问。
3. 其他
3.1 springboot设置多节点
spring:
rabbitmq:
# 单机配置
# host: 192.168.8.192
# port: 5672
# 单机或集群配置
addresses: 192.168.8.192:5672,192.168.8.193:5672,192.168.8.194:5672
username: root
password: root
# 虚拟主机
virtual-host: /parent