Docker 部署 RabbitMQ集群(普通队列、镜像队列、仲裁队列)
一、安装docker(本文不讲,可查看:https://www.cnblogs.com/zhouganqing/p/docker.html)
二、准备工作,准备三台Linux服务器(或者一台也行,记住修改docker端口即可),本文使用三台虚拟机部署集群
三、下载带管理界面的镜像(本文使用3.8.14版本)
#下载镜像
docker pull rabbitmq:3.8.14-management
#查看镜像是否下载成功
docker images rabbitmq
四、运行镜像
#第一台服务器 docker run -d --hostname rabbit1 --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=rabbit1:192.168.79.50 --add-host=rabbit2:192.168.79.51 --add-host=rabbit3:192.168.79.52 rabbitmq:3.8.14-management #第二台服务器 docker run -d --hostname rabbit2 --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=rabbit1:192.168.79.50 --add-host=rabbit2:192.168.79.51 --add-host=rabbit3:192.168.79.52 rabbitmq:3.8.14-management #第三台服务器 docker run -d --hostname rabbit3 --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=rabbit1:192.168.79.50 --add-host=rabbit2:192.168.79.51 --add-host=rabbit3:192.168.79.52 rabbitmq:3.8.14-management
#参数说明
说明:
-d 后台运行容器;
--hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
--name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号;15692:Prometheus指标(需要启用插件)通讯端口;4369:Erlang映射守护程序启动端口;25672:节点之间通讯的端口);(宿主:容器)
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
--restart 出现故障后自动重启方式,no 不自动重启,on-failure:重启次数 指定自动重启的失败次数,到达失败次数后不再重启,always 自动重启
--add-host 添加hosts映射
-v 映射目录或文件;
验证是否安装成功
访问:http://192.168.79.50:15672
用户名密码默认为:guest / guest,登录后今入下图界面即成功
注:记住这个名字,下面创建集群时需要用到
五、集群普通队列
#查询容器ID docker ps #进入容器 docker exec -it [容器ID] /bin/bash #停止MQ服务 rabbitmqctl stop_app #加入rabbit1集群 rabbitmqctl join_cluster rabbit@rabbit1 #启动MQ服务 rabbitmqctl start_app
执行后出现下面结果代表成功
查看mq管理界面的变化
六、集群镜像队列
先部署普通集群,基于普通集群配置镜像队列,有两种配置方式
1、命令行模式
随便进入集群中的一台服务器,执行下面的命令:
#查询容器ID docker ps #进入容器 docker exec -it [容器ID] /bin/bash #-p静默输出,减少信息输出;"ha-mode":"all"代表所有队列;"ha-sync-mode":"automatic"代表自动同步,默认需要手动同步 rabbitmqctl set_policy -p ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' #查看 rabbitmqctl list_policies #清除(需要加上vhost的信息) rabbitmqctl clear_policy -p / ha-all
2、界面操作
参数说明:
Name:为策略名称,可以是任何名称,但建议使用不带空格的基于 ASCII 的名称。
Pattern:与一个或多个 queue(exchange) 名称匹配的正则表达式,可以使用任何正则表达式。只有一个 ^ 代表匹配所有,^test 为匹配名称为 "test" 的 exchanges 或者 queue。
Apply to:Pattern 应用对象。
Priority:配置多个策略时的优先级,值越大,优先级越高。没有指定优先级的消息会以 0 优先级对待,对于超过队列所定最大优先级的消息,优先级以最大优先级对待。
Definition:键/值对,将被插入匹配 queues and exchanges 的可选参数映射中。
ha-mode:策略键,分为 3 种模式:
- all :所有的 queue。
- exctly :部分(需配置 ha-params 参数,此参数为 int 类型。比如 3,众多集群中的随机 3 台机器)。
- nodes :指定(需配置 ha-params 参数,此参数为数组类型。比如 ["rabbit@rabbit2", "rabbit@rabbit3"] 这样指定为 rabbit2 与 rabbit3 这两台机器)。
ha-sync-mode:队列同步:
- manual:手动(默认模式)。新的队列镜像将不会收到现有的消息,它只会接收新的消息。
- automatic:自动同步。当一个新镜像加入时,队列会自动同步。队列同步是一个阻塞操作。
七、仲裁队列
先部署普通集群,基于普通集群配置仲裁队列
界面化配置:
Type选择为Quorum即可