miaodi
发布于 2020-12-27 / 1753 阅读
0

docker搭建跨主机rabbitmq镜像集群

-- 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单机环境。

image-20201227005521839

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 ...

执行完毕之后,查看目前的普通集群:

image-20201227005835407

此时搭建的普通集群中,并没有高可用。

这里举个例子验证下。创建一个队列work,所属节点为192(rabbit2)。

image-20201227011034737

如果192节点正常提供服务,用户可以从任意节点发送/接收work节点的消息

如果192节点宕机的话:

image-20201227011201052

队列显示下线:

image-20201227011422759

此时从任意节点访问时会报错,并没有做到高可用。

下面就设置策略让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

设置之后,查看队列状态:

image-20201227013932121

配置完成。任意节点宕机,其他节点仍然可以对外提供访问。

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