docker 一键部署 RocketMq 集群 | 包含单节点部署 , 单台多Master部署 , 多台部署 ( 同步 / 异步 )

72 阅读10分钟

1. 服务部署

1.1. 单节点

version: '3.8'
services:
  namesrv:
    image: apache/rocketmq:5.3.1
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    networks:
      - rocketmq
    command: sh mqnamesrv
  broker:
    image: apache/rocketmq:5.3.1
    container_name: rmqbroker
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
    depends_on:
      - namesrv
    networks:
      - rocketmq
    command: sh mqbroker
  proxy:
    image: apache/rocketmq:5.3.1
    container_name: rmqproxy
    networks:
      - rocketmq
    depends_on:
      - broker
      - namesrv
    ports:
      - 8080:8080
      - 8081:8081
    restart: on-failure
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
    command: sh mqproxy
networks:
  rocketmq:
    driver: bridge

1.2. 单台多 master 集群

mkdir -p ./rocketmq/logs/nameserver-a
mkdir -p ./rocketmq/logs/nameserver-b

mkdir -p ./rocketmq/logs/broker-a
mkdir -p ./rocketmq/logs/broker-b

mkdir -p ./rocketmq/store/broker-a
mkdir -p ./rocketmq/store/broker-b

mkdir -p ./rocketmq/broker-a/
mkdir -p ./rocketmq/broker-b/
chmod 777 -R ./rocketmq/logs/*
chmod 777 -R ./rocketmq/store/*

修改第一个

nano ./rocketmq/broker-a/broker-a.conf
brokerClusterName = rocketmq-cluster
brokerName = broker-a
brokerId = 0
#这个很有讲究 如果是正式环境 这里一定要填写内网地址(安全)
#如果是用于测试或者本地这里建议要填外网地址,因为你的本地代码是无法连接到阿里云内网,只能连接外网。
brokerIP1 = 192.168.0.106
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 内网的(阿里云有内网IP和外网IP)
namesrvAddr=192.168.0.106:9876;192.168.0.106:9877
autoCreateTopicEnable=true
#Broker 对外服务的监听端口,
listenPort = 10911
#Broker角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

修改第二个

nano ./rocketmq/broker-b/broker-b.conf
brokerClusterName = rocketmq-cluster
brokerName = broker-b
brokerId = 0
#这个很有讲究 如果是正式环境 这里一定要填写内网地址(安全)
#如果是用于测试或者本地这里建议要填外网地址,因为你的本地代码是无法连接到阿里云内网,只能连接外网。
brokerIP1 = 192.168.0.106
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 内网的(阿里云有内网IP和外网IP)
namesrvAddr=192.168.0.106:9876;192.168.0.106:9877
autoCreateTopicEnable=true
#Broker 对外服务的监听端口,
listenPort = 10912
#Broker角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
nano docker-compose.yaml

配置 docker-compose 文件

version: '3.5'
services:
  rmqnamesrv-a:
    image: apache/rocketmq:5.3.1
    container_name: rmqnamesrv-a
    ports:
      - 9876:9876
    volumes:
      #- ./rocketmq/logs/nameserver-a:/home/rocketmq/logs
     # - ./rocketmq/broker-b/broker-b.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf
    command: sh mqnamesrv
    networks:
      rmq:
        aliases:
          - rmqnamesrv-a

  rmqnamesrv-b:
    image: apache/rocketmq:5.3.1
    container_name: rmqnamesrv-b
    ports:
      - 9877:9876
    volumes:
      #- ./rocketmq/logs/nameserver-b:/home/rocketmq/logs
     # - ./rocketmq/broker-b/broker-b.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf
    command: sh mqnamesrv
    networks:
      rmq:
        aliases:
          - rmqnamesrv-b

  rmqbroker-a:
    image: apache/rocketmq:5.3.1
    container_name: rmqbroker-a
    ports:
      - 10911:10911
    volumes:
      #- ./rocketmq/logs/broker-a/logs:/home/rocketmq/logs
      #- ./rocketmq/store/broker-a/store:/home/rocketmq/store
      - ./rocketmq/broker-a/broker-a.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf
    environment:
      TZ: Asia/Shanghai
      NAMESRV_ADDR: "rmqnamesrv-a:9876"
      JAVA_OPTS: " -Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
    command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
    links:
      - rmqnamesrv-a:rmqnamesrv-a
      - rmqnamesrv-b:rmqnamesrv-b
    networks:
      rmq:
        aliases:
          - rmqbroker-a

  rmqbroker-b:
    image: apache/rocketmq:5.3.1
    container_name: rmqbroker-b
    ports:
      - 10912:10912
    volumes:
      #- ./rocketmq/logs/broker-b/logs:/home/rocketmq/logs
      #- ./rocketmq/store/broker-b/store:/home/rocketmq/store
      - ./rocketmq/broker-b/broker-b.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf
    environment:
      TZ: Asia/Shanghai
      NAMESRV_ADDR: "rmqnamesrv-b:9877"
      JAVA_OPTS: " -Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
    command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
    links:
      - rmqnamesrv-a:rmqnamesrv-a
      - rmqnamesrv-b:rmqnamesrv-b
    networks:
      rmq:
        aliases:
          - rmqbroker-b
  rmqconsole:
    image: apacherocketmq/rocketmq-dashboard
    container_name: rmqconsole
    ports:
      - 8087:8080
    environment:
      JAVA_OPTS: -Drocketmq.namesrv.addr=rmqnamesrv-a:9876;rmqnamesrv-b:9877 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.accessKey=rocketmq2 -Drocketmq.config.secretKey=12345678
    volumes:
      - ./rocketmq/console-ng/data:/tmp/rocketmq-console/data
    networks:
      rmq:
        aliases:
          - rmqconsole
networks:
  rmq:
    name: rmq
    driver: bridge

拉镜像

docker pull apache/rocketmq:5.3.1
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apacherocketmq/rocketmq-dashboard:latest
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apacherocketmq/rocketmq-dashboard:latest  apacherocketmq/rocketmq-dashboard 

1.2.1. 数据持久化

复制docker里面的文件

# docker cp rmqnamesrv-a:/home/rocketmq/logs ./rocketmq/logs/nameserver-a
# docker cp rmqnamesrv-b:/home/rocketmq/logs ./rocketmq/logs/nameserver-b
docker cp rmqbroker-a:/home/rocketmq/logs ./rocketmq/logs/broker-a
docker cp rmqbroker-a:/home/rocketmq/store ./rocketmq/store/broker-a
docker cp rmqbroker-b:/home/rocketmq/logs ./rocketmq/logs/broker-b
docker cp rmqbroker-b:/home/rocketmq/store ./rocketmq/store/broker-b

设置权限,否则会写入文件失败,造成启动失败。

chmod 777 -R ./rocketmq/logs/*
chmod 777 -R ./rocketmq/store/*

关闭相关docker进程

docker-compose down

修改docker-compose.yaml 取消注释,开启持久化配置

访问http://192.168.0.106:8087 可视化界面

1.3. 多台集群(同步/异步)

1.3.1. 第一台 (192.168.0.101 服务)

mkdir rmq_sync_clu
cd rmq_sync_clu/
# mkdir -p ./rocketmq/logs/rmqnamesrv-1

mkdir -p ./rocketmq/broker-1-m/conf
mkdir -p ./rocketmq/broker-1-m/logs
mkdir -p ./rocketmq/broker-1-m/store
 
mkdir -p ./rocketmq/broker-2-s/conf
mkdir -p ./rocketmq/broker-2-s/logs
mkdir -p ./rocketmq/broker-2-s/store
# chmod 777 -R ./rocketmq/logs/rmqnamesrv-1
chmod 777 -R ./rocketmq/broker-1-m/*
chmod 777 -R ./rocketmq/broker-2-s/*

修改主配置

nano  ./rocketmq/broker-1-m/conf/broker.conf
#集群名称
brokerClusterName=rocketmq-cluster
#broker名称
brokerName=broker1
#brokerId master用0 slave用其他
brokerId=0
#清理时机
deleteWhen=4
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SYNC_MASTER
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
## 内网的(阿里云有内网IP和外网IP)
namesrvAddr=192.168.0.101:9876;192.168.0.106:9876
#主机ip
brokerIP1=192.168.0.101
#对外服务的监听接口,同一台机器上部署多个broker,端口号要不相同
listenPort=10911
#haService中使用  默认值为:listenPort + 1
#haListenPort=10912
#主要用于slave同步master  listenPort - 2
#fastListenPort=10909
#是否能够自动创建topic,建议线下开启,线上关闭
autoCreateTopicEnable=true

修改从配置

nano  ./rocketmq/broker-2-s/conf/broker.conf
#集群名称
brokerClusterName=rocketmq-cluster
#broker名称
brokerName=broker2
#brokerId master用0 slave用其他
brokerId=1
#清理时机
deleteWhen=4
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SLAVE
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#主机ip
brokerIP1=192.168.0.101
#对外服务的监听接口,同一台机器上部署多个broker,端口号要不相同
listenPort=11911
#haService中使用  默认值为:listenPort + 1
#haListenPort=11912
#主要用于slave同步master  listenPort - 2
#fastListenPort=11909
#是否能够自动创建topic
autoCreateTopicEnable=true
# 内网的(阿里云有内网IP和外网IP)
namesrvAddr=192.168.0.101:9876;192.168.0.106:9876

编写 docker-compose 文件

nano  docker-compose.yaml
version: "3"
services:
  rmqnamesrv-1:
    image: apache/rocketmq:5.3.1
    container_name: rmqnamesrv-1
    ports:
      - 9876:9876
  #  volumes:
      #- ./rocketmq/logs/rmqnamesrv-1:/home/rocketmq/logs
    environment:
      JAVA_OPT_EXT: "-Duser.home=/opt -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m  -XX:MaxMetaspaceSize=320m"
    command: sh mqnamesrv
    networks:
      - rmq

 
  mqbroker-1-m:
    image: apache/rocketmq:5.3.1
    container_name: mqbroker-1-m
    ports:
      - 10911:10911
      - 10909:10909
      - 10912:10912
    volumes:
      - ./rocketmq/broker-1-m/conf/broker.conf:/home/rocketmq/conf/broker.conf
     # - ./rocketmq/broker-1-m/logs:/home/rocketmq/logs
     # - ./rocketmq/broker-1-m/store:/home/rocketmq/store
    environment:
      NAMESRV_ADDR: "rmqnamesrv-1:9876"
      JAVA_OPTS: " -Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m  -XX:MaxMetaspaceSize=320m"
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv-1
    networks:
      - rmq

      
  mqbroker-2-s:
    image: apache/rocketmq:5.3.1
    container_name: mqbroker-2-s
    ports:
      - 11911:11911
      - 11909:11909
      - 11912:11912
    volumes:
      - ./rocketmq/broker-2-s/conf/broker.conf:/home/rocketmq/conf/broker.conf
     # - ./rocketmq/broker-2-s/logs:/home/rocketmq/logs
     # - ./rocketmq/broker-2-s/store:/home/rocketmq/store
    environment:
      NAMESRV_ADDR: "rmqnamesrv-1:9876"
      JAVA_OPTS: " -Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m  -XX:MaxMetaspaceSize=320m"
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv-1
    networks:
      - rmq      

          
  mqconsole:
    image: apacherocketmq/rocketmq-dashboard
    container_name: mqconsole
    ports:
      - 19876:8080
    environment:
      JAVA_OPTS: -Drocketmq.namesrv.addr=rmqnamesrv-1:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
    volumes:
      - ./rocketmq/console-ng/data:/tmp/rocketmq-console/data
    depends_on:
      - rmqnamesrv-1
    networks:
      - rmq   


networks:
  rmq:
    name: rmq
    driver: bridge 

运行

导出挂载数据

# 导出 rmqnamesrv-1 的日志
# docker cp rmqnamesrv-1:/home/rocketmq/logs/rocketmqlogs ./rocketmq/logs/rmqnamesrv-1

# 导出 mqbroker-1-m 的日志和存储数据
docker cp mqbroker-1-m:/home/rocketmq/logs ./rocketmq/broker-1-m/logs
docker cp mqbroker-1-m:/home/rocketmq/store ./rocketmq/broker-1-m/store

# 导出 mqbroker-2-s 的日志和存储数据
docker cp mqbroker-2-s:/home/rocketmq/logs ./rocketmq/broker-2-s/logs
docker cp mqbroker-2-s:/home/rocketmq/store ./rocketmq/broker-2-s/store

1.3.2. 第二台 (192.168.0.106 服务)

mkdir rmq_sync_clu
cd rmq_sync_clu/
mkdir -p ./rocketmq/logs/rmqnamesrv-2

mkdir -p ./rocketmq/broker-1-s/conf
mkdir -p ./rocketmq/broker-1-s/logs
mkdir -p ./rocketmq/broker-1-s/store
 
mkdir -p ./rocketmq/broker-2-m/conf
mkdir -p ./rocketmq/broker-2-m/logs
mkdir -p ./rocketmq/broker-2-m/store
chmod 777 -R ./rocketmq/logs/rmqnamesrv-2
chmod 777 -R ./rocketmq/broker-1-s/*
chmod 777 -R ./rocketmq/broker-2-m/*

修改主配置

nano ./rocketmq/broker-2-m/conf/broker.conf
#集群名称
brokerClusterName=rocketmq-cluster
#broker名称
brokerName=broker2
#brokerId master用0 slave用其他
brokerId=0
#清理时机
deleteWhen=4
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SYNC_MASTER
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#主机ip
brokerIP1=192.168.0.106
#对外服务的监听接口,同一台机器上部署多个broker,端口号要不相同
listenPort=10911
#haService中使用  默认值为:listenPort + 1
#haListenPort=10912
#主要用于slave同步master  listenPort - 2
#fastListenPort=10909
#是否能够自动创建topic
autoCreateTopicEnable=true
# 内网的(阿里云有内网IP和外网IP)
namesrvAddr=192.168.0.101:9876;192.168.0.106:9876

修改从配置

nano  ./rocketmq/broker-1-s/conf/broker.conf
#集群名称
brokerClusterName=rocketmq-cluster
#broker名称
brokerName=broker1
#brokerId master用0 slave用其他
brokerId=1
#清理时机
deleteWhen=4
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SLAVE
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#主机ip
brokerIP1=192.168.0.106
#对外服务的监听接口,同一台机器上部署多个broker,端口号要不相同
listenPort=11911
#haService中使用  默认值为:listenPort + 1
#haListenPort=11912
#主要用于slave同步master  listenPort - 2
#fastListenPort=11909
#是否能够自动创建topic
autoCreateTopicEnable=true
# 内网的(阿里云有内网IP和外网IP)
namesrvAddr=192.168.0.101:9876;192.168.0.106:9876

编写 docker-compose 文件

nano  docker-compose.yaml
version: "3"
services:
  rmqnamesrv-2:
    image: apache/rocketmq:5.3.1
    container_name: rmqnamesrv-2
    ports:
      - 9876:9876
  #  volumes:
     #- ./rocketmq/logs/rmqnamesrv-2:/home/rocketmq/logs
    environment:
      JAVA_OPT_EXT: "-Duser.home=/opt -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m  -XX:MaxMetaspaceSize=320m"
    command: sh mqnamesrv
    networks:
      - rmq    
          
  mqbroker-2-m:
    image: apache/rocketmq:5.3.1
    container_name: mqbroker-2-m
    ports:
      - 10911:10911
      - 10909:10909
      - 10912:10912
    volumes:
      - ./rocketmq/broker-2-m/conf/broker.conf:/home/rocketmq/conf/broker.conf
     # - ./rocketmq/broker-2-m/logs:/home/rocketmq/logs
     # - ./rocketmq/broker-2-m/store:/home/rocketmq/store
    environment:
      NAMESRV_ADDR: "rmqnamesrv-2:9876"
      JAVA_OPTS: " -Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m  -XX:MaxMetaspaceSize=320m"
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv-2
    networks:
      - rmq


  mqbroker-1-s:
    image: apache/rocketmq:5.3.1
    container_name: mqbroker-1-s
    ports:
      - 11911:11911
      - 11909:11909
      - 11912:11912
    volumes:
      - ./rocketmq/broker-1-s/conf/broker.conf:/home/rocketmq/conf/broker.conf
     # - ./rocketmq/broker-1-s/logs:/home/rocketmq/logs
     # - ./rocketmq/broker-1-s/store:/home/rocketmq/store
    environment:
      NAMESRV_ADDR: "rmqnamesrv-2:9876"
      JAVA_OPTS: " -Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m  -XX:MaxMetaspaceSize=320m"
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv-2
    networks:
      - rmq


networks:
  rmq:
    name: rmq
    driver: bridge 

运行

拷贝数据

# docker cp rmqnamesrv-2:/home/rocketmq/logs ./rocketmq/logs/rmqnamesrv-2
docker cp mqbroker-2-m:/home/rocketmq/logs ./rocketmq/broker-2-m/logs
docker cp mqbroker-2-m:/home/rocketmq/store ./rocketmq/broker-2-m/store
docker cp mqbroker-1-s:/home/rocketmq/logs ./rocketmq/broker-1-s/logs
docker cp mqbroker-1-s:/home/rocketmq/store ./rocketmq/broker-1-s/store

1.3.3. 检查与数据持久化

分别在docker-compose.yml文件所在目录运行docker-compose.yml

docker-compose up -d

docker-compose logs | grep error

访问 192.168.0.101:19876

成功展示

最后 , 我们解开 docker-compose 的注释实现数据持久化