目录
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. 普通模式
- 普通模式中集群不会同步消息,只会同步 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. 创建文件夹
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. 验证集群
- 创建一个 queue
- 生产一个消息【3 个节点都能看到该消息】
- 消费消息【3 个节点的 queue 上消息都不存在了】