一、前言

本文将基于docker-compose部署RabbitMQ集群&配置镜像队列&安装延迟插件

二、docker-compose部署RabbitMQ集群

可参考 https://gitee.com/zhengqingya/docker-compose

# 准备
git clone https://gitee.com/zhengqingya/docker-compose.git
cd docker-compose/Liunx

# 当前目录下所有文件赋予权限(读、写、执行)
chmod -R 777 ./rabbitmq-cluster
# 设置Erlang Cookie文件权限(cookie文件必须只允许拥有者有权操作)
chmod 600 ./rabbitmq-cluster/.erlang.cookie
# 运行 [ 注:如果之前有安装过,需要清除浏览器缓存和删除rabbitmq相关的存储数据(如:这里映射到宿主机的data数据目录),再重装,否则会出现一定问题! ]
docker-compose -f docker-compose-rabbitmq-cluster.yml -p rabbitmq-cluster up -d

# 启用延迟插件(注:如果节点类型为内存节点,则无法启用延迟插件)
docker exec rabbitmq-1 /bin/bash -c 'rabbitmq-plugins enable rabbitmq_delayed_message_exchange'
docker exec rabbitmq-2 /bin/bash -c 'rabbitmq-plugins enable rabbitmq_delayed_message_exchange'

# 执行脚本 => 配置集群
sh ./rabbitmq-cluster/init-rabbitmq.sh

# 配置镜像队列(允许内建双活冗余选项,与普通队列不同,镜像节点在集群中的其他节点拥有从队列拷贝,一旦主节点不可用,最老的从队列将被选举为新的主队列)
docker exec -it rabbitmq-1 /bin/bash
rabbitmqctl set_policy -p my_vhost ha-all "^" '{"ha-mode":"all"}' --apply-to all
# 查看镜像队列`ha-all`
rabbitmqctl list_policies -p my_vhost
# 删除镜像队列`ha-all`
rabbitmqctl clear_policy -p my_vhost ha-all

web管理端:ip地址:15672
登录账号密码:admin/admin

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、其它

这里附上相关部署文件

docker-compose-rabbitmq-cluster.yml
# 环境变量可参考: https://www.rabbitmq.com/configure.html
#               https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbit/docs/rabbitmq.conf.example
#               https://www.rabbitmq.com/clustering.html#erlang-cookie
version: '3'

# 网桥 -> 方便相互通讯
networks:
  rabbitmq:
    driver: bridge

services:
  rabbitmq-1:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/rabbitmq:3.9.1-management        # 镜像`rabbitmq:3.9.1-management` 【 注:该版本包含了web控制页面 】
    container_name: rabbitmq-1            # 容器名为'rabbitmq-1'
    hostname: my-rabbit-1
    restart: unless-stopped             # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
    environment:                        # 设置环境变量,相当于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:                            # 数据卷挂载路径设置,将本机目录映射到容器目录
      - "./rabbitmq-cluster/rabbitmq-1/config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf"
      - "./rabbitmq-cluster/rabbitmq-1/data:/var/lib/rabbitmq"
      - "./rabbitmq-cluster/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez:/opt/rabbitmq/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez"
      - "./rabbitmq-cluster/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie"
    ports:                              # 映射端口
      - "5672:5672"
      - "15672:15672"
    networks:
      - rabbitmq

  rabbitmq-2:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/rabbitmq:3.9.1-management        # 镜像`rabbitmq:3.9.1-management` 【 注:该版本包含了web控制页面 】
    container_name: rabbitmq-2            # 容器名为'rabbitmq-2'
    hostname: my-rabbit-2
    restart: unless-stopped             # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
    environment:                        # 设置环境变量,相当于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:                            # 数据卷挂载路径设置,将本机目录映射到容器目录
      - "./rabbitmq-cluster/rabbitmq-2/config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf"
      - "./rabbitmq-cluster/rabbitmq-2/data:/var/lib/rabbitmq"
      - "./rabbitmq-cluster/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez:/opt/rabbitmq/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez"
      - "./rabbitmq-cluster/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie"
    ports:                              # 映射端口
      - "5673:5672"
    networks:
      - rabbitmq
rabbitmq.conf
# 环境变量可参考 https://www.rabbitmq.com/configure.html
default_vhost = my_vhost
default_user = admin
default_pass = admin
default_user_tags.administrator = true
default_permissions.configure = .*
default_permissions.read = .*
default_permissions.write = .*
.erlang.cookie
rabbit-cookie
init-rabbitmq.sh
#!/bin/bash


####################################
# @description 添加RabbitMQ节点到集群
# 可参考 https://www.rabbitmq.com/clustering.html#creating-ram
# @params $? => 代表上一个命令执行后的退出状态: 0->成功,1->失败
# @example => sh init-rabbitmq.sh
# @author zhengqingya
# @date 2021/11/24 14:24
####################################


# reset first node
echo "Reset first rabbitmq node."
docker exec rabbitmq-1 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq-1 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq-1 /bin/bash -c 'rabbitmqctl start_app'


# build cluster
echo "Starting to build rabbitmq cluster with two ram nodes."
docker exec rabbitmq-2 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq-2 /bin/bash -c 'rabbitmqctl reset'
# 参数“--ram”表示设置为内存节点,忽略此参数默认为磁盘节点
docker exec rabbitmq-2 /bin/bash -c 'rabbitmqctl join_cluster rabbit@my-rabbit-1'
# docker exec rabbitmq-2 /bin/bash -c 'rabbitmqctl join_cluster --ram rabbit@my-rabbit-1'
docker exec rabbitmq-2 /bin/bash -c 'rabbitmqctl start_app'

今日分享语句:
没有一劳永逸的开始;也没有无法拯救的结束。人生中,你需要把握的是:该开始的,要义无反顾地开始;该结束的,就干净利落地结束。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐