RocketMQ官网,虽然官网里面的文档自带有Docker,Docker Compose部署MQ的教材,但是实际上是不够用的,缺少了一些配置,我查看官方文档,再使用AI,实际动手部署后,能够成功部署上MQ,然后发个文章,做个记录,也希望对有需要的朋友提供帮助。

1.安装JDK

MQ的运行是需要JDK1.8+,所以我们首先安装JDK,这里我们安装OpenJDK,而不是Oracle JDK,一般情况下,Open JDK已经能满足所有的需求,而且免费使用,安装速度很快。我这里使用的是AlmaLinux的操作系统。

# CentOS 8 / Rocky / AlmaLinux / RHEL 8+
sudo dnf install java-1.8.0-openjdk-devel -y

验证

javac
java -version

如果出现对应的版本号那就是安装成功了。

2.拉取MQ的镜像

docker pull apache/rocketmq:5.3.2

3.拉取控制台Dashboard镜像

拉取控制的镜像是为了可观测和可视化操作。

#最新版本的官方的镜像
$ docker pull apacherocketmq/rocketmq-dashboard:latest

#旧版本镜像
docker pull styletang/rocketmq-console-ng:latest

这里给出两个选择的原因是因为,我在实际部署过程中发现,最新版本的官方的镜像会存在一些问题,和最新版本5.x的MQ存在兼容性问题,MQ和控制台都成功运行之后,控制台是无法访问的,就算是在服务器内部使用curl命令去访问也是报错的,所以改换了社区维护较好、稳定性更高的 styletang/rocketmq-console-ng 这个镜像。

4.新建MQ工作目录和配置文件

我们使用Docker Compose部署MQ是需要创建对应的文件夹和docker-compose.yml文件的。
我这里就在根目录创建文件夹了。

#切换到根目录
cd /
sudo mkdir rocketmq
sudo touch docker-compose.yml
sudo chmod +x docker-compose.yml

工作目录和compose.yml文件建好之后,我们继续在这个目录下新建docker要挂载数据的文件件以及broker.conf配置文件,建立这个配置文件是方便配置MQ的一些参数,例如分配的JVM内存等配置。

cd rocketmq
sudo touch broker-a.conf broker-b.conf
sudo mkdir data/broker-a/logs data/broker-a/store
sudo mkdir data/broker-b/logs data/broker-b/store

这里解释一下为什么要创建这几个文件和文件夹。我们查看官方文档会发现MQ有单机和集群的部署模式,我这里这么做就是实现单机模式下的多组节点(集群)单副本模式,这个模式部署的都是Master节点,但是实际上这样部署也只是伪集群,生产环境下有能力的还是推荐真正的集群模式。这里的broker-a和broker-b就是部署的两个节点。

5.编写docker-compose.yml和broker.conf

docker-compose.yml

services:
  namesrv:
    image: apache/rocketmq:5.3.2
    container_name: rmqnamesrv
    ports:
      - "9876:9876"
    networks:
      - rocketmq
    command: sh mqnamesrv
    restart: unless-stopped

  # ==================== Broker A ====================
  broker-a:
    image: apache/rocketmq:5.3.2
    container_name: rmqbroker-a
    ports:
      - "10911:10911"
      - "10909:10909"
      - "10912:10912"
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
    volumes:
      - ./data/broker-a/logs:/home/rocketmq/logs
      - ./data/broker-a/store:/home/rocketmq/store
      - ./broker-a.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf:ro
    depends_on:
      - namesrv
    networks:
      - rocketmq
    command: sh mqbroker -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf
    restart: unless-stopped
#    deploy:
#      resources:
#        limits:
#          memory: 1200M

  # ==================== Broker B ====================
  broker-b:
    image: apache/rocketmq:5.3.2
    container_name: rmqbroker-b
    ports:
      - "10921:10911"
      - "10919:10909"
      - "10922:10912"
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
    volumes:
      - ./data/broker-b/logs:/home/rocketmq/logs
      - ./data/broker-b/store:/home/rocketmq/store
      - ./broker-b.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf:ro
    depends_on:
      - namesrv
    networks:
      - rocketmq
    command: sh mqbroker -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf
    restart: unless-stopped
#    deploy:
#      resources:
#        limits:
#          memory: 1200M

  proxy:
    image: apache/rocketmq:5.3.2
    container_name: rmqproxy
    ports:
      - "8080:8080"
      - "8081:8081"
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
    depends_on:
      - broker-a
      - broker-b
    networks:
      - rocketmq
    command: sh mqproxy
    restart: unless-stopped

  dashboard:
#    image: apacherocketmq/rocketmq-dashboard:latest
    image: styletang/rocketmq-console-ng:latest
    container_name: rmqdashboard
    ports:
      - "8082:8080"
    environment:
      - JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 
        -Dcom.rocketmq.sendMessageWithVIPChannel=false
        -Drocketmq.config.enableDashBoard=true
    depends_on:
      - namesrv
      - broker-a
      - broker-b
    networks:
      - rocketmq
#    network_mode: host
    restart: unless-stopped

networks:
  rocketmq:
    driver: bridge

broker-a.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
namesrvAddr = rmqnamesrv:9876
listenPort = 10911
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
autoCreateTopicEnable = true
autoCreateSubscriptionGroup = true
brokerJVMOpts = -Xms768m -Xmx768m -Xmn384m -XX:MaxDirectMemorySize=1g
maxMessageSize = 4194304

broker-b.conf配置文件就不贴了,都是一样的配置,只需要改一下brokerName这个配置项就行了。然后里面的 autoCreateTopicEnableautoCreateSubscriptionGroup这个两个配置项说一下。
前者是配置为自动创建主题,也就是我们项目里面,如果你没有手动去创建主题的话,当代码执行发送消息的时候,那个对应的主题会自动创建,后者是自动创建订阅组,不过这两个在生产环境下都不推荐使用。

6.启动MQ和控制台

# 后台运行
docker compose up -d

运行上面的这会命令,界面上会出对应的构建过程信息,等待1-2分钟即可构建启动成功。
查看运行状态

docker ps

出现如下图所示的界面,就代表MQ启动成功了
docker正在运行的容器
最后再访问 ip:8082就能进入MQ的控制台了。
在这里插入图片描述
在这里插入图片描述

至此基本上就结束了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐