RocketMQ部署单机版及集群版本(Docker部署)

目录

前言

单机版部署

1. 准备工作

2. 创建Docker网络

 3.启动NameServer

4.启动Broker

 5.启动RocketMQ控制台

集群版部署

1.启动NameServer

2.启动Broker

配置文件说明


前言

废话不多直接上干货,我负责踩坑,你负责验证。

单机版部署

1. 准备工作

确保Docker和Docker Compose已经安装。如果没有,请先进行安装。

2. 创建Docker网络
docker network create rocketmq-net

 查看Docker网络:

docker network ls

NETWORK ID     NAME               DRIVER    SCOPE
3ce16f0e7951   bridge             bridge    local
afe16f80ffc9   host               host      local
36892fa1b1bb   none               null      local
ce100504c410   rocketmq-network   bridge    local

 3.启动NameServer
docker run -d --name rmqnamesrv   --network rocketmq-network   -p 9876:9876   rocketmqinc/rocketmq   sh mqnamesrv

 输出结果:

Unable to find image 'rocketmqinc/rocketmq:latest' locally
latest: Pulling from rocketmqinc/rocketmq
a02a4930cb5d: Pull complete 
90eb47c86343: Pull complete 
43bf660f95f6: Pull complete 
7f5ca7a20245: Pull complete 
707a618112e3: Pull complete 
4b527473eafb: Pull complete 
fedd1d06c8ba: Pull complete 
27782fcf3aef: Pull complete 
Digest: sha256:b08556227ad8d169b7927f4c48335877cb10060e6781374ce5a644ea29f6fbe1
Status: Downloaded newer image for rocketmqinc/rocketmq:latest
332a6a49ef2f1caf3ec8fb597df49a03a7a91b3a552668f5bf762c19595c2a25

 参数解释:

docker run

  • docker run 命令用于创建并启动一个新的容器。
  • 在这个命令中,你可以指定容器的配置和运行时行为。

-d

  • -d 选项表示“分离模式”(detached mode),即在后台运行容器。
  • 容器启动后,你的终端不会被占用,容器会在后台继续运行。

--name rmqnamesrv

  • --name rmqnamesrv 为容器指定一个名称,这里将容器命名为 rmqnamesrv
  • 使用自定义名称可以更方便地管理和引用这个容器,比如通过名称启动、停止、查看日志等。

--network rocketmq-network

  • --network rocketmq-network 指定容器要连接的 Docker 网络,这里是 rocketmq-network
  • 这使得该容器可以通过网络中的名称(如 rmqnamesrv)与其他容器进行通信。
  • 使用自定义网络可以控制容器之间的连接范围,并启用 Docker 内置的 DNS 服务。

-p 9876:9876

  • -p 9876:9876 映射主机的端口和容器的端口。
  • 这意味着将主机的 9876 端口映射到容器的 9876 端口。
  • RocketMQ 的 NameServer 默认监听 9876 端口,因此通过这个映射,可以从主机直接访问 NameServer。

rocketmqinc/rocketmq

  • rocketmqinc/rocketmq 是所使用的 Docker 镜像名称。
  • 这个镜像包含了 RocketMQ 的安装和运行环境,官方维护的镜像通常会包含 NameServer、Broker 等组件的运行脚本。

sh mqnamesrv

  • sh mqnamesrv 是容器启动后要执行的命令。
  • 这个命令启动一个 sh 进程,并执行 mqnamesrv 脚本来启动 RocketMQ 的 NameServer。
  • mqnamesrv 是 RocketMQ 启动 NameServer 的命令。通常,RocketMQ 镜像包含这个命令,它会启动 NameServer 服务并监听在指定的端口(这里是 9876)。
4.启动Broker
docker run -d --name rmqbroker --network rocketmq-network \
  -p 10911:10911 \
  -e "NAMESRV_ADDR=rmqnamesrv:9876" \
  -v /opt/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf \
  rocketmqinc/rocketmq \
  sh mqbroker -c /opt/rocketmq/conf/broker.conf

参数解释:

docker run

  • docker run 命令用于创建并启动一个新的容器。

-d

  • -d 选项表示“分离模式”(detached mode),即在后台运行容器。

--name rmqbroker

  • --name rmqbroker 为容器指定一个名称,这里将容器命名为 rmqbroker
  • 使用自定义名称可以方便地管理和引用该容器。

--network rocketmq-network

  • --network rocketmq-network 指定容器要连接的 Docker 网络,这里是 rocketmq-network
  • 这允许容器在这个网络中与其他容器(如 NameServer)通过容器名称进行通信。

 -p 10911:10911

  • -p 10911:10911 将主机的 10911 端口映射到容器的 10911 端口。
  • 10911 端口通常用于 RocketMQ Broker 的外部通信(如消息存储的物理 I/O 操作)。

-e "NAMESRV_ADDR=rmqnamesrv:9876"

  • -e 选项用于设置环境变量。在这里,设置了 NAMESRV_ADDR 环境变量。
  • NAMESRV_ADDR=rmqnamesrv:9876 指定了 NameServer 的地址为 rmqnamesrv:9876,其中 rmqnamesrv 是 NameServer 容器的名称,端口号为 9876
  • 这使得 Broker 容器可以在启动时注册到指定的 NameServer。

-v /opt/rocketmq/conf/broker.conf(主机文件路径):/opt/rocketmq/conf/broker.conf(容器文件路径)

  • -v 选项用于将主机文件或目录挂载到容器内。在这里,/opt/rocketmq/conf/broker.conf 文件被挂载到容器的相同路径。
  • 这意味着你可以在主机上编辑 broker.conf 文件,容器内的配置将会实时更新,避免了每次更改配置都要重新构建容器的麻烦。

rocketmqinc/rocketmq

  • rocketmqinc/rocketmq 是所使用的 Docker 镜像名称。
  • 这个镜像包含了 RocketMQ 的安装和运行环境,包括 Broker、NameServer 等组件。

sh mqbroker -c /opt/rocketmq/conf/broker.conf

  • sh mqbroker 是容器启动后要执行的命令,启动一个 sh 进程并执行 mqbroker 命令来启动 RocketMQ 的 Broker 服务。
  • -c /opt/rocketmq/conf/broker.conf 指定了 Broker 的配置文件路径为 /opt/rocketmq/conf/broker.conf。这个文件路径与通过 -v 选项挂载的配置文件一致。

注:在执行此指令之前我们需要创建Broker的配置文件,如果没有创建直接启动Broker 会报错,报错信息可以通过一下操作查看:

# 查看所有镜像
docker ps -a

# 输出结果
CONTAINER ID   IMAGE                      COMMAND                  CREATED         STATUS         PORTS                                                                                                                                                 NAMES
df6d3071e300   rocketmqinc/rocketmq       "sh mqbroker -c /opt…"   4 seconds ago   Up 3 seconds   9876/tcp, 10909/tcp, 0.0.0.0:10911->10911/tcp, :::10911->10911/tcp                                                                                    rmqbroker
332a6a49ef2f   rocketmqinc/rocketmq       "sh mqnamesrv"           7 minutes ago   Up 7 minutes   10909/tcp, 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp, 10911/tcp   


# 查看Broker日志
docker logs df6d3071e300 (对应的镜像ID) 

在没有配置broker.conf前日志中会出现:

java.io.FileNotFoundException: /opt/rocketmq/conf/broker.conf
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:128)
        at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)

配置broker.conf(如果已有则跳过此步骤):

# 创建所有缺少的目录
sudo mkdir -p /opt/rocketmq/conf

# 创建文件
sudo touch /opt/rocketmq/conf/broker.conf

vim /opt/rocketmq/conf/broker.conf


# 配置文件
# RocketMQ Broker配置文件
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
#brokerIP1=127.0.0.1 推荐不设置 此ip可以为镜像名或者使用ping镜像名获取具体IP填写,并非为127.0.0.1
# NameServer地址
namesrvAddr=rmqnamesrv:9876
# 数据存储路径
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
# 设置 Broker ID 和集群名称
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC

在这里额外多说几句,大家可以看到,配置中namesrvAddr 的值按道理来说应该是具体的IP+PORT但是我这里却使用的是rmqnamesrv,其实仔细联系上下文可以发现,这里的rmqnamesrv就是nameServer的镜像名,那为什么在这里可以配置镜像名呢?这便涉及到了Docker的DNS解析如下:

在 Docker 中,如果不指定 --network 选项,Docker 默认会为每个容器创建一个独立的网络。这意味着不同容器之间默认无法通过容器名称直接通信。因此,在这种情况下,配置 namesrvAddr 为镜像名(即容器名)是无法通过 DNS 解析来自动找到对应的容器的,所以我们在开始便创建了自定义网络,这样将容器放置在同一个自定义网络中。这样,Docker 的内置 DNS 服务才能解析容器名称。

  1. Docker 内部 DNS 解析

    • Docker 的内置 DNS 服务器会自动为同一 Docker 网络中的容器提供名称解析。每个容器在其网络内部都可以使用其他容器的名字作为主机名。
    • 当你在容器的配置中指定 namesrvAddr=rmqnamesrv:9876 时,Docker 网络的 DNS 服务会解析 rmqnamesrv 为相应的容器的 IP 地址。
  2. 服务发现

    • 在 Docker 自定义网络中,Docker 会在网络内维护一个 DNS 解析服务,使容器可以通过名字互相发现和通信。容器名称(如 rmqnamesrv)实际上是网络中容器的主机名。
  3. 自动 IP 分配

    • 当你启动容器时,Docker 会自动为每个容器分配一个 IP 地址,并将容器的名字注册到 Docker 内部的 DNS 服务器。这样,其他容器可以通过名字直接访问这个 IP 地址。 
 5.启动RocketMQ控制台
docker run -d --name rmqconsole --network rocketmq-network -p 8080:8080 -e "NAMESRV_ADDR=rmqnamesrv:9876" styletang/rocketmq-console-ng

参数解释:

 --name rmqconsole

  • --name rmqconsole 为容器指定一个名称,这里将容器命名为 rmqconsole
  • 使用自定义名称可以方便地管理和引用该容器。

--network rocketmq-network

  • --network rocketmq-network 指定容器要连接的 Docker 网络,这里是 rocketmq-network
  • 这允许容器在这个网络中与其他容器(如 RocketMQ 的 NameServer 和 Broker)通过容器名称进行通信。

-p 8080:8080

  • -p 8080:8080 将主机的 8080 端口映射到容器的 8080 端口。
  • RocketMQ Console 默认在 8080 端口提供 Web 界面。通过这个映射,你可以从主机上访问 RocketMQ Console 的 Web 界面。

-e "NAMESRV_ADDR=rmqnamesrv:9876"

  • -e 选项用于设置环境变量。在这里,设置了 NAMESRV_ADDR 环境变量。
  • NAMESRV_ADDR=rmqnamesrv:9876 指定了 NameServer 的地址为 rmqnamesrv:9876,其中 rmqnamesrv 是 NameServer 容器的名称,端口号为 9876
  • RocketMQ Console 使用这个地址来连接和管理 RocketMQ 集群的 NameServer 和 Broker。

styletang/rocketmq-console-ng

  • styletang/rocketmq-console-ng 是所使用的 Docker 镜像名称。
  • 这个镜像包含了 RocketMQ Console 的安装和运行环境,它提供了一个 Web 界面,用于监控和管理 RocketMQ 集群,包括查看 Topic、Consumer、Producer 的状态等。

输出结果:

Unable to find image 'styletang/rocketmq-console-ng:latest' locally
latest: Pulling from styletang/rocketmq-console-ng
e12c678537ae: Pull complete 
8d9ed335b7db: Pull complete 
3318dd58ae60: Pull complete 
624ba6156166: Pull complete 
c7a02d193df7: Pull complete 
813b62320378: Pull complete 
49e2d6393f32: Extracting [=============>                                     ]  34.54MB/130.1MB
0a2b7222259b: Download complete 
478657249124: Download complete 
5f8636e9fbb7: Download complete 

 执行完成后便可以使用我们映射的8080端口进行访问控制台至此便已经搭建完成。

集群版部署

1.启动NameServer
# 启动nameServer 1
docker run -d --name rmq-namesrv-1 --network rocketmq-network \
    -p 9876:9876 \
    rocketmqinc/rocketmq sh mqnamesrv
  
启动nameServer 2
docker run -d --name rmq-namesrv-2 --network rocketmq-network \
    -p 9877:9876 \
    rocketmqinc/rocketmq sh mqnamesrv
2.配置broker.conf

broker1.con

ocketMQ Broker配置文件
brokerClusterName=DefaultCluster
brokerName=broker-a
# Master 的 brokerId 必须是 0 
# Slave 的 brokerId 必须是正整数,且唯一
brokerId=0 
brokerIP1=172.20.0.2
# NameServer地址
namesrvAddr=rmqnamesrv:9876;rmqnamesrv:9877
# 数据存储路径
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
# 设置 Broker ID 和集群名称
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC

broker2.conf

RocketMQ Broker配置文件
brokerClusterName=DefaultCluster
brokerName=broker-b
# Master 的 brokerId 必须是 0 
# Slave 的 brokerId 必须是正整数,且唯一
brokerId=1
brokerIP1=172.20.0.3
# NameServer地址
namesrvAddr=rmqnamesrv:9876;rmqnamesrv:9877
# 数据存储路径
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
# 设置 Broker ID 和集群名称
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC
3.配置文件说明

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
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
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
 

4.启动Broker 
# 切换到配置文件目录下
cd /opt/rocketmq/conf

# 启动Broker1
docker run -d --name rmq-broker-a --network rocketmq-network \
    -p 10911:10911 -p 10909:10909 -p 10912:10912 \
    -v $(pwd)/broker-a.conf:/opt/rocketmq/conf/broker-a.conf \
    rocketmqinc/rocketmq \
    sh mqbroker -c /opt/rocketmq/conf/broker-a.conf
	
	

# 启动Broker2
docker run -d --name rmq-broker-b --network rocketmq-network \
    -p 20911:20911 -p 20909:20909 -p 20912:20912 \
    -v $(pwd)/broker-b.conf:/opt/rocketmq/conf/broker-b.conf \
    rocketmqinc/rocketmq \
    sh mqbroker -c /opt/rocketmq/conf/broker-b.conf
5.启动控制台
docker run -d --name rmq-console --network rocketmq-network \
    -p 8080:8080 \
    -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmq-namesrv-1:9876;rmq-namesrv-2:9876" \
    styletang/rocketmq-console-ng

总结

使用 Docker 和 rocketmqinc/rocketmq 镜像成功部署了一个完整的 RocketMQ 集群。此集群在同一个Docker容器中搭建,包括多个 NameServer、多个 Broker 实例以及一个管理控制台,适用于开发、测试和学习场景。如果你有足够的容器也可以进行多容器部署。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值