docker-compose部署rocketmq 5.x

63 阅读11分钟

单节点部署

目录结构

请按照如下结构新建好目录和文件

/rmq
├── docker-compose.yml
├── dashboard/
├── logs/
├── store/
└── conf/                         # 配置文件目录
  ├── broker.conf                 # broker配置文件
  └─- rmq-proxy.json              # rmq-proxy 配置文件

为docker添加logsstore两个目录的读写权限

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

如果未添加目录权限,启动的时候,broker会报错:

java.lang.NullPointerException
        at org.apache.rocketmq.broker.schedule.ScheduleMessageService.configFilePath(ScheduleMessageService.java:273)

docker-compose.yml

执行之前,先执行命令 docker network create dev_net创建网络

services:
  namesrv:
    image: apache/rocketmq:5.3.2
    container_name: rmqnamesrv
    restart: always
    ports:
      - 9876:9876
    networks:
      - dev_net
    command: sh mqnamesrv

  # Local 模式下 Proxy 和 Broker 是同进程部署
  broker:
    image: apache/rocketmq:5.3.2
    container_name: rmqbroker
    restart: always
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
      - 8080:8080
      - 8081:8081
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
      - ./conf/broker.conf:/home/rocketmq/conf/broker.conf
      - ./store:/home/rocketmq/store
      - ./logs:/home/rocketmq/logs
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - JAVA_OPT_EXT=-Xms1g -Xmx1g -Xmn512m
    depends_on:
      - namesrv
    networks:
      - dev_net
    command: sh mqbroker --enable-proxy -c /home/rocketmq/conf/broker.conf
    
  rmqdashboard:
    image: apacherocketmq/rocketmq-dashboard:2.0.1
    container_name: rmqdashboard
    restart: on-failure
    networks:
      - dev_net
    depends_on:
      - namesrv
    volumes: # 如果想保存仪表盘的数据,可以把这个目录也挂载出来
      - ./dashboard:/tmp/rocketmq-console/data
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
    ports:
      - 18090:8080
    environment:
      - JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876

networks:
  dev_net:
    external: true

broker.conf

注意,配置中的brokerIP1要改为自己的宿主机IP

#集群名称
brokerClusterName=rocketmq-cluster
#broker名称,注意rocketmq的cluster模式下,每个Master配置一个Slave,所以每对主从的brokerName要相同
brokerName=broker1
#brokerId master用0 slave用其他
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SYNC_MASTER
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
# namesrv地址,多个地址用;分隔
namesrvAddr=rmqnamesrv:9876
# broker IP地址,单节点模式部署,由于broker和proxy部署在同一个容器里,这里需要写宿主机的IP地址
# 如果这里不写,注册到NameServer的地址就是容器的ip地址,开发阶段,代码里是连接不上的
brokerIP1=192.168.1.126
#是否能够自动创建topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
# defaultTopicQueueNums=4
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
# autoCreateSubscriptionGroup=true
#commitLog每个文件的大小默认1G
# mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
# mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
# diskMaxUsedSpaceRatio=88
#存储路径(可以自己修改)
# storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径(可以自己修改)
# storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
# storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
# storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
# storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
# abortFile=/usr/local/rocketmq/store/abort

rmq-proxy.json

{
    "rocketMQClusterName": "rocketmq-cluster",
    "namesrvAddr": "rmqnamesrv:9876"
}

集群部署

目录结构

1、请按照如下结构新建好目录和文件

/rmq
├── docker-compose.yml
├── dashboard
├── logs/                         # 日志目录
  ├── m1/                         # master_1 的日志目录
  ├── s1/                         # slave_1 的日志目录
  ├── m2/                         # master_2 的日志目录
  └── s2/                         # slave_2 的日志目录
├── store/                        # 消息存储目录
  ├── m1/                         # master_1 的存储目录
  ├── s1/                         # slave_1 的存储目录
  ├── m2/                         # master_2 的存储目录
  └── s2/                         # slave_2 的存储目录
└── conf/                         # 配置文件目录
  ├── broker-m1.conf              # master_1 配置文件
  ├── broker-s1.conf              # slave_1 配置文件
  ├── broker-m2.conf              # master_2 配置文件
  ├── broker-s2.conf              # slave_2 配置文件
  └── rmq-proxy.json              # rmq-proxy 配置文件

2、为docker添加logsstore两个目录的读写权限

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

如果未添加目录权限,启动的时候,broker会报错:

java.lang.NullPointerException
        at org.apache.rocketmq.broker.schedule.ScheduleMessageService.configFilePath(ScheduleMessageService.java:273)

挂载文件说明

首次挂载时,如果宿主机目录为空,需要从容器内复制初始文件,不然启动会失败

先创建临时容器并复制文件

# 1. 启动临时容器(不挂载)
docker run -d --name temp-container your-image

# 2. 创建本地目录
mkdir -p /path/to/host/directory

# 3. 复制容器内文件到宿主机
docker cp temp-container:/path/in/container /path/to/host/directory

# 4. 停止并删除临时容器
docker stop temp-container && docker rm temp-container

# 5. 正式运行容器并挂载
docker run -v /path/to/host/directory:/path/in/container your-image

docker-compose.yml

执行之前,先执行命令 docker network create dev_net创建网络

services:
  rmqnamesrv: # Nameserver
    image: apache/rocketmq:5.3.2
    container_name: rmqnamesrv
    restart: always
    ports:
      - 9876:9876
    command: sh mqnamesrv
    networks:
      - dev_net

  mqbroker-m1: # Master 1
    image: apache/rocketmq:5.3.2
    container_name: mqbroker-m1
    restart: always
    ports:
      - 10911:10911
      - 10909:10909
      - 10912:10912
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
      - ./conf/broker-m1.conf:/home/rocketmq/conf/broker.conf
      - ./logs/m1:/home/rocketmq/logs
      - ./store/m1:/home/rocketmq/store
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - JAVA_OPT_EXT=-Xms1g -Xmx1g -Xmn512m
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv
    networks:
      - dev_net

  mqbroker-s1: # Slave 1
    image: apache/rocketmq:5.3.2
    container_name: mqbroker-s1
    restart: always
    ports:
      - 11911:11911
      - 11909:11909
      - 11912:11912
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
      - ./conf/broker-s1.conf:/home/rocketmq/conf/broker.conf
      - ./logs/s1:/home/rocketmq/logs
      - ./store/s1:/home/rocketmq/store
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - JAVA_OPT_EXT=-Xms1g -Xmx1g -Xmn512m
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv
    networks:
      - dev_net

  mqbroker-m2: # Master 2
    image: apache/rocketmq:5.3.2
    container_name: mqbroker-m2
    restart: always
    ports:
      - 20911:10911
      - 20909:10909
      - 20912:10912
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
      - ./conf/broker-m2.conf:/home/rocketmq/conf/broker.conf
      - ./logs/m2:/home/rocketmq/logs
      - ./store/m2:/home/rocketmq/store
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - JAVA_OPT_EXT=-Xms1g -Xmx1g -Xmn512m
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv
    networks:
      - dev_net

  mqbroker-s2: # Slave 2
    image: apache/rocketmq:5.3.2
    container_name: mqbroker-s2
    restart: always
    ports:
      - 21911:11911
      - 21909:11909
      - 21912:11912
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
      - ./conf/broker-s2.conf:/home/rocketmq/conf/broker.conf
      - ./logs/s2:/home/rocketmq/logs
      - ./store/s2:/home/rocketmq/store
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - JAVA_OPT_EXT=-Xms1g -Xmx1g -Xmn512m
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - rmqnamesrv
    networks:
      - dev_net

  proxy:
    image: apache/rocketmq:5.3.2
    container_name: rmqproxy
    restart: on-failure
    ports:
      - 8080:8080
      - 8081:8081
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
      - ./conf/rmq-proxy.json:/home/rocketmq/proxy/conf/rmq-proxy.json
    command: sh mqproxy -pc /home/rocketmq/proxy/conf/rmq-proxy.json -pm cluster
    depends_on:
      - rmqnamesrv
      - mqbroker-m1
      - mqbroker-s1
      - mqbroker-m2
      - mqbroker-s2
    networks:
      - dev_net

  rmqdashboard:
    image: apacherocketmq/rocketmq-dashboard:2.0.1
    container_name: rmqdashboard
    restart: on-failure
    depends_on:
      - rmqnamesrv
    volumes: # 如果想保存仪表盘的数据,可以把这个目录也挂载出来
      - ./dashboard:/tmp/rocketmq-console/data
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间到容器
    ports:
      - 18090:8080
    environment:
      - JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
    networks:
      - dev_net

networks:
  dev_net:
    external: true

broker-m1.conf

#集群名称
brokerClusterName=rocketmq-cluster
#broker名称,注意rocketmq的cluster模式下,每个Master配置一个Slave,所以每对主从的brokerName要相同
brokerName=broker_m1
#brokerId master用0 slave用其他
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SYNC_MASTER
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#namesrv地址,多个地址用;分隔
namesrvAddr=rmqnamesrv:9876
#是否能够自动创建topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
# defaultTopicQueueNums=4
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
# autoCreateSubscriptionGroup=true
#commitLog每个文件的大小默认1G
# mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
# mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
# diskMaxUsedSpaceRatio=88
#存储路径(可以自己修改)
# storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径(可以自己修改)
# storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
# storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
# storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
# storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
# abortFile=/usr/local/rocketmq/store/abort

broker-s1.conf

#集群名称
brokerClusterName=rocketmq-cluster
#broker名称,注意rocketmq的cluster模式下,每个Master配置一个Slave,所以每对主从的brokerName要相同
brokerName=broker_m1
#brokerId master用0 slave用其他
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SLAVE
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#namesrv地址,多个地址用;分隔
namesrvAddr=rmqnamesrv:9876
#是否能够自动创建topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
# defaultTopicQueueNums=4
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
# autoCreateSubscriptionGroup=true
#commitLog每个文件的大小默认1G
# mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
# mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
# diskMaxUsedSpaceRatio=88
#存储路径(可以自己修改)
# storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径(可以自己修改)
# storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
# storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
# storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
# storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
# abortFile=/usr/local/rocketmq/store/abort

broker-m2.conf

#集群名称
brokerClusterName=rocketmq-cluster
#broker名称,注意rocketmq的cluster模式下,每个Master配置一个Slave,所以每对主从的brokerName要相同
brokerName=broker_m2
#brokerId master用0 slave用其他
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SYNC_MASTER
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#namesrv地址,多个地址用;分隔
namesrvAddr=rmqnamesrv:9876
#是否能够自动创建topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
# defaultTopicQueueNums=4
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
# autoCreateSubscriptionGroup=true
#commitLog每个文件的大小默认1G
# mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
# mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
# diskMaxUsedSpaceRatio=88
#存储路径(可以自己修改)
# storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径(可以自己修改)
# storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
# storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
# storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
# storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
# abortFile=/usr/local/rocketmq/store/abort

broker-s2.conf

#集群名称
brokerClusterName=rocketmq-cluster
#broker名称,注意rocketmq的cluster模式下,每个Master配置一个Slave,所以每对主从的brokerName要相同
brokerName=broker_m2
#brokerId master用0 slave用其他
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时长 48小时
fileReservedTime=48
#broker角色 -ASYNC_MASTER异步复制 -SYNC_MASTER同步双写 -SLAVE
brokerRole=SLAVE
#刷盘策略 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#namesrv地址,多个地址用;分隔
namesrvAddr=rmqnamesrv:9876
#是否能够自动创建topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
# defaultTopicQueueNums=4
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
# autoCreateSubscriptionGroup=true
#commitLog每个文件的大小默认1G
# mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
# mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
# diskMaxUsedSpaceRatio=88
#存储路径(可以自己修改)
# storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径(可以自己修改)
# storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
# storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
# storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
# storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
# abortFile=/usr/local/rocketmq/store/abort

rmq-proxy.json

{
    "rocketMQClusterName": "rocketmq-cluster",
    "namesrvAddr": "rmqnamesrv:9876"
}

golang示例代码

rmq_v5_demo