Docker 安装 RabbitMQ

1、下载镜像文件

docker pull rabbitmq:management

2、创建实例并启动

创建 Jenkins 工作目录

将容器内目录挂载到此目录上,这样我们可以在宿主机上对文件的修改同步到容器内。

mkdir -p /mydata/rabbitmq/data
mkdir -p /mydata/mydata/conf
mkdir -p /mydata/mydata/logs
chmod 777 /mydata/rabbitmq

创建实例并启动

docker run -d --name rabbitmq \
--privileged=true \
--restart=always \
-m 512m \
--cpus=0.5 \
-v /mydata/rabbitmq/data/:/var/lib/rabbitmq \
-v /mydata/rabbitmq/conf:/etc/rabbitmq \
-v /mydata/rabbitmq/logs:/var/log/rabbitmq \
-e RABBITMQ_MEMORY_HIGH_WATERMARK=0.6 \
-e RABBITMQ_DISK_FREE_LIMIT=50000000 \ 
--publish 5671:5671 \
--publish 5672:5672 \
--publish 4369:4369 \
--publish 25672:25672 \
--publish 15671:15671 \
--publish 15672:15672 \
rabbitmq:management
  • 参数说明
    • -d 后台运行容器;
    • --name 指定容器名;
    • -p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
    • -v 映射目录或文件;
    • --hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
    • -e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
  • 注:
    • 4369, 25672 -- erlang 发现口 & 集群端口
    • 5671, 5672 --client 端通信口(RabbitMq 的编程语言客户端连接端口)(AMOP 端口)
    • 15672 -- 管理界面 ui 端口(RabbitMq 管理界面端口)
    • 25672 -- server 间内部通信口(RabbitMq 集群的端口)
    • 61613, 61614 -- STOMP 协议端口
    • 1883, 8883 -- MQTT 协议端口

3 测试

在web浏览器中输入地址:http://虚拟机ip:15672/
输入默认账号: guest : guest
TMesh : TMesh729

Docker 集群设置

集群形式

RabbiMQ 是用 Erlang 开发的,集群非常方便,因为 Erlang,天生就是一门分布式语言,但其本身并不支持负载均衡。需要 nginx
RabbitMQ 集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有一个 Disk 节点。

  1. 由磁盘节点和内存节点组成
  2. 至少需要一个磁盘节点

1. 普通模式

  1. 普通模式中集群不会同步消息,只会同步 queue、exchange
    demo:3 个节点 A\B\C组成的集群,消费节点 C 上的队列,如果此时消息在节点 A的队列上,集群会将A的信息发送到C的队列上供于消费
    缺点:单点故障无法解决【高可用】
    对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点。对于消费者来说,若消息进入 A 节点的 Queue 中,当从 B 节点拉取时, RabbitMQ 会将消息从 A 中取出,并经过 B 发送给消费者。应用场景:该模式各适合于消息无需持久化的场合,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化.只能等故障节点恢复。

2.镜像模式

与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;该模式下,mirror queue 有一套选举算法,即 1 个 master、n 个 slaver,生产者、消费者的请求都会转至 master。应用场景:可靠性要求较高场合,如下单、库存队列。缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。
优点:解决了高可用,当消息进入节点A的队列,会同步到 B\C。当 master A 节点宕机,B、C 会选择一个主节点

  1. 镜像模式由主节点接收 生产者和消费者的请求【代理】
  2. 镜像模式 依赖于 先搭建一个普通模式,再设置成镜像模式

搭建镜像集群

1. 创建文件夹

mkdir -p /mydata/rabbitmq/{rabbitmq01,rabbitmq02,rabbitmq03}

2. 启动3个 rabbitmq

--hostname 设置容器的主机名
RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时需要同步该值

docker run -d --hostname rabbitmq01  --name rabbitmq01 \
-v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq \
-p 15673:15672 -p 5673:5672  \
--restart=always \
-e RABBITMQ_ERLANG_COOKIE='tmesh' \
--privileged=true \
rabbitmq:management
docker run -d --hostname rabbitmq02  --name rabbitmq02 \
-v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq \
-p 15674:15672 -p 5674:5672  \
--restart=always \
-e RABBITMQ_ERLANG_COOKIE='tmesh' \
--privileged=true \
--link rabbitmq01:rabbitmq01 \
rabbitmq:management
docker run -d --hostname rabbitmq03  --name rabbitmq03 \
-v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq \
-p 15675:15672 -p 5675:5672  \
--restart=always \
-e RABBITMQ_ERLANG_COOKIE='tmesh' \
--privileged=true \
--link rabbitmq01:rabbitmq01 \
--link rabbitmq02:rabbitmq02 \
rabbitmq:management

3. 节点加入集群

1. 进入个节点完成初始化

docker exec -it rabbitmq01 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset  #【恢复出厂设置】
rabbitmqctl start_app
exit

2. 将节点 2 和 3 加入到集群

docker exec -it rabbitmq02 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
docker exec -it rabbitmq03 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

3. 访问 192.168.56.131:15675 查看集群

随便访问一个就可以 15673、15674、15675 都可以

4. 实现镜像集群

1. 随便进入一个容器

docker exec -it rabbitmq01 /bin/bash

设置一个策略,/: 当前主机,策略名字是 ha,^ 指的是当前所有主机都是高可用模式[^hello 指 hello 开头的所有主机],自动同步

rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'     

查看 vhost/ 下面的所有 policy

rabbitmqctl  list_policies -p /

5. 验证集群

  1. 创建一个 queue
  2. 生产一个消息【3 个节点都能看到该消息】
  3. 消费消息【3 个节点的 queue 上消息都不存在了】
posted @   Thousand_Mesh  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示