• 拉取服务镜像

docker pull apache/rocketmq
  • 拉取控制台镜像

docker pull apacherocketmq/rocketmq-dashboard
  • 创建日志、脚本文件夹,并赋予权限

  • 启动服务镜像容器,将服务镜像启动脚本拷贝一份到容器外

docker cp rmqnamesrv:/home/rocketmq/rocketmq-5.1.3/bin/runserver.sh /opt/rocket/nameserver/bin/runserver.sh

  • 创建控制台映射文件夹并设置权限

  • 创建 broker配置文件

vim /opt/rocket/broker/conf/broker.conf
# 集群名称
brokerClusterName = DefaultCluster
# 节点名称
brokerName = broker-a
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0 
brokerId = 0
# Broker服务地址    String    内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP1 = 124.222.37.55
# Broker角色
brokerRole = ASYNC_MASTER
# 刷盘方式
flushDiskType = ASYNC_FLUSH
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 72
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true

详细版

# nameServer 地址多个用;隔开 默认值null
# 例:127.0.0.1:6666;127.0.0.1:8888 
# namesrvAddr = 127.0.0.1:6666
# 集群名称 单机配置可以随意填写,如果是集群部署在同一个集群中集群名称必须一致类似Nacos的命名空间
brokerClusterName = DefaultCluster
# broker节点名称 单机配置可以随意填写,如果是集群部署在同一个集群中节点名称不要重复
brokerName = broker-a
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0 
brokerId = 0
# Broker 对外服务的监听端口 默认值10911
# 端口(注意:broker启动后,会占用3个端口,分别在listenPort基础上-2,+1,供内部程序使用,所以集群一定要规划好端口,避免冲突)
listenPort=10911
# Broker服务地址    String    内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP1 = 124.222.37.55
# BrokerHAIP地址,供slave同步消息的地址 内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP2 = 127.0.0.1

# Broker角色 默认值ASYNC_MASTER
# ASYNC_MASTER 异步复制Master,只要主写成功就会响应客户端成功,如果主宕机可能会出现小部分数据丢失
# SYNC_MASTER 同步双写Master,主和从节点都要写成功才会响应客户端成功,主宕机也不会出现数据丢失
# SLAVE
brokerRole = ASYNC_MASTER
# 刷盘方式
# SYNC_FLUSH(同步刷新)相比于ASYNC_FLUSH(异步处理)会损失很多性能,但是也更可靠,所以需要根据实际的业务场景做好权衡,默认值ASYNC_FLUSH
flushDiskType = ASYNC_FLUSH
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 72

# 消息大小 单位字节 默认1024 * 1024 * 4
maxMessageSize=4194304

# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数,默认值4
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true

# 失败重试时间,默认重试16次进入死信队列,第一次1s第二次5s以此类推。
# 延时队列时间等级默认18个,可以设置多个比如在后面添加一个1d(一天),使用的时候直接用对应时间等级即可,从1开始到18,如果添加了第19个直接使用等级19即可
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

# 指定TM在20秒内应将最终确认状态发送给TC,否则引发消息回查。默认为60秒
transactionTimeout=20
# 指定最多回查5次,超过后将丢弃消息并记录错误日志。默认15次。
transactionCheckMax=5
# 指定设置的多次消息回查的时间间隔为10秒。默认为60秒。
transactionCheckInterval=10
  • 启动控制台镜像,将控制台启动脚背拷贝外部一份

docker cp rmqbroker:/home/rocketmq/rocketmq-5.1.3/bin/runbroker.sh /opt/rocket/broker/bin/runbroker.sh

创建rocket.yml

version: '3.8'
services:
  rmqnamesrv:
    image: apache/rocketmq
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    restart: always
    privileged: true
    volumes:
      - /opt/rocket/nameserver/logs:/home/rocketmq/logs
      - /opt/rocket/nameserver/bin/runserver.sh:/home/rocketmq/rocketmq-5.1.3/bin/runserver.sh
    environment:
      - MAX_HEAP_SIZE=256M
      - HEAP_NEWSIZE=128M
    command: ["sh","mqnamesrv"]
  broker:
    image: apache/rocketmq
    container_name: rmqbroker
    ports:
      - 10909:10909
      - 10911:10911
    restart: always
    privileged: true
    volumes:
      - /opt/rocket/broker/logs:/home/rocketmq/logs
      - /opt/rocket/broker/store:/home/rocketmq/store
      - /opt/rocket/broker/conf/broker.conf:/home/rocketmq/broker.conf
      - /opt/rocket/broker/bin/runbroker.sh:/home/rocketmq/rocketmq-5.1.3/bin/runbroker.sh
    depends_on:
      - 'rmqnamesrv'
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - MAX_HEAP_SIZE=512M
      - HEAP_NEWSIZE=256M
    command: ["sh","mqbroker","-c","/home/rocketmq/broker.conf"]
  rmqdashboard:
    image: apacherocketmq/rocketmq-dashboard
    container_name: rocketmq-dashboard
    ports:
      - 8080:8080
    restart: always
    privileged: true
    depends_on:
      - 'rmqnamesrv'
    environment:
      - JAVA_OPTS= -Xmx256M -Xms256M -Xmn128M -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false

  • 报错

  • rmqnamesrv 容器报错

15:09:03,966 |-ERROR in org.apache.rocketmq.logging.ch.qos.logback.core.rolling.RollingFileAppender[RocketmqTrafficAppender_inner] - openFile(/home/rocketmq/logs/rocketmqlogs/namesrv_traffic.log,true) call failed. java.io.FileNotFoundException: /home/rocketmq/logs/rocketmqlogs/namesrv_traffic.log (No such file or directory)
        at java.io.FileNotFoundException: /home/rocketmq/logs/rocketmqlogs/namesrv_traffic.log (No such file or directory)
        at      at java.io.FileOutputStream.open0(Native Method)
        at      at java.io.FileOutputStream.open(FileOutputStream.java:270)
        at      at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.FileAppender.openFile(FileAppender.java:206)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.FileAppender.start(FileAppender.java:126)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:100)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.model.processor.AppenderModelHandler.postHandle(AppenderModelHandler.java:84)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.model.processor.DefaultProcessor.secondPhaseTraverse(DefaultProcessor.java:257)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.model.processor.DefaultProcessor.secondPhaseTraverse(DefaultProcessor.java:253)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.model.processor.DefaultProcessor.traversalLoop(DefaultProcessor.java:90)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.model.processor.DefaultProcessor.process(DefaultProcessor.java:106)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.joran.GenericXMLConfigurator.processModel(GenericXMLConfigurator.java:200)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.joran.GenericXMLConfigurator.doConfigure(GenericXMLConfigurator.java:166)
        at      at org.apache.rocketmq.logging.ch.qos.logback.core.joran.GenericXMLConfigurator.doConfigure(GenericXMLConfigurator.java:122)
        at      at org.apache.rocketmq.common.logging.JoranConfiguratorExt.doConfigure0(JoranConfiguratorExt.java:56)
        at      at org.apache.rocketmq.common.logging.DefaultJoranConfiguratorExt.configureByResource(DefaultJoranConfiguratorExt.java:87)
        at      at org.apache.rocketmq.common.logging.DefaultJoranConfiguratorExt.configure(DefaultJoranConfiguratorExt.java:70)
        at      at org.apache.rocketmq.logging.ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:98)
        at      at org.apache.rocketmq.logging.ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:77)
        at      at org.apache.rocketmq.logging.ch.qos.logback.classic.spi.LogbackServiceProvider.initializeLoggerContext(LogbackServiceProvider.java:50)
        at      at org.apache.rocketmq.logging.ch.qos.logback.classic.spi.LogbackServiceProvider.initialize(LogbackServiceProvider.java:41)
        at      at org.apache.rocketmq.logging.org.slf4j.LoggerFactory.bind(LoggerFactory.java:152)
        at      at org.apache.rocketmq.logging.org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:139)
        at      at org.apache.rocketmq.logging.org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:422)
        at      at org.apache.rocketmq.logging.org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:408)
        at      at org.apache.rocketmq.logging.org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
        at      at org.apache.rocketmq.namesrv.NamesrvStartup.<clinit>(NamesrvStartup.java:45)
/nameserver/logs 缺少文件夹 在外部添加一个即可
  • rmqbroker 报错

aultProcessor@5bb21b69 - End of configuration.
15:20:51,135 |-INFO in org.apache.rocketmq.common.logging.JoranConfiguratorExt@6b9651f3 - Registering current configuration as safe fallback point

java.lang.NullPointerException
        at org.apache.rocketmq.broker.schedule.ScheduleMessageService.configFilePath(ScheduleMessageService.java:265)
        at org.apache.rocketmq.common.ConfigManager.persist(ConfigManager.java:84)
        at org.apache.rocketmq.broker.BrokerController.shutdownBasicService(BrokerController.java:1401)
        at org.apache.rocketmq.broker.BrokerController.shutdown(BrokerController.java:1464)
        at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:242)
        at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:50)
15:21:52,997 |-INFO in org.apache.rocketmq.logging.ch.qos.logback.classic.LoggerContext[default] - This is logback-classic version 1.3.5-rocketmq

我尼玛吐了,这个错误是因为上面没有给 777 权限,导致没有完全启动,所以broker 才报空 rnm