使用Docker搭建RabbitMQ集群

一、准备工作

1、两台centos服务器
2、两台服务器都安装了docker
3、假设两台虚拟机的ip是192.168.2.128,192.168.2.129

二、搭建RabbitMQ集群

1、两台机子分贝配置host文件

进入到:vim /etc/hosts
添加内容:
192.168.2.128 rabbit1
192.168.2.129 rabbit2

2、运行rabbit容器

在rabbit1机器运行

# docker run -d --hostname rabbit1 --net=host --name myrabbit1 -p 4369:4369 -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8-management

在rabbit2机器运行

# docker run -d --hostname rabbit2 --net=host --name myrabbit2 -p 4369:4369 -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8-management

3、加入集群

在rabbit2机器执行命令

# docker exec -it myrabbit2 bash  #进入容器
# rabbitmqctl stop_app 
# rabbitmqctl reset
# rabbitmqctl join_cluster rabbit@rabbit1  #加入到rabbit1
# rabbitmqctl start_app
# exit #退出

进入 192.168.2.129:15672 查看状态账号密码是admin/admin
默认账号密码是guest/guest,这里我在运行容器的同时设置了user与pass,所以我可以用admin来进行访问。

docker 安装rabbitmq 无图形界面 docker安装rabbitmq集群_可选参数

如果要摘除节点,在rabbit1执行

# docker exec -it myrabbit1 bash
# rabbitmqctl forget_cluster_node rabbit@rabbit3
# exit

这里的rabbit3,是假设有第三个机器,也就是第三个节点。

点击queues,填写队列名,然后新增一个队列

docker 安装rabbitmq 无图形界面 docker安装rabbitmq集群_正则表达式_02

此时如果还没有设置镜像集群,那么这个队列只存在于rabbit1中,如果rabbit1的队列服务挂了,此队列也就不可用了。

可以在rabbit1执行

docker stop myrabbit1

此时rabbit1的管理台是进不去了,要换成rabbit2的

docker 安装rabbitmq 无图形界面 docker安装rabbitmq集群_正则表达式_03

并且进入Queues里的消息也是down状态。

三、创建镜像队列

镜像集群,就是让3台或多台节点的数据互相复制,在他们之间设置主从关系。当一台节点宕机时,其他节点可以继续提供服务。

类似于redis集群的哨兵模式。

重新启动rabbit1
docker start myrabbit1

1、策略说明

指令参数详情
参数名称 描述
-p 可选参数,针对指定 vhost 下的exchange或 queue
--priority 可选参数,policy 的优先级
--apply-to 可选参数,策略适用的对象类型,其值可为 "queues", "exchanges" 或 "all".默认是"all"
name policy 的名称
pattern 匹配模式(正则表达式)
definition 镜像定义,json 格式,包括三部分(ha-mode,ha-params,ha-sync-mode)具体配置见下表
definition参数详情

参数名称 描述
ha-mode 指名镜像队列模式,其值可为"all","exactly"或"nodes",all:表示在集群所有节点上进行镜像;exactly:表示在指定个数的节点上镜像,节点个数由 ha-params 指定;nodes:表示在指定节点上进行镜像,节点名称通过ha-params 指定。
ha-params ha-mode模式需要用到的参数:exactly 模式下为数字表述镜像节点数,nodes 模式下为节点列表表示需要镜像的节点。
ha-sync-mode 镜像队列中消息的同步方式,其值可为"automatic"或"manually".

2、查看当前策略

rabbitmqctl list_policies

3、添加策略

rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
说明:策略正则表达式为 “^” 表示所有匹配所有队列名称  ^work:匹配hello开头队列

4、删除策略

当然也可以进行删除

rabbitmqctl clear_policy ha-all

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