docker 部署 RocketMq 5.x
官网地址:https://rocketmq.apache.org/
镜像拉取(使用 apache/rocketmq 镜像包含 NameServer+Broker+Proxy…)
镜像地址: https://hub.docker.com/r/apache/rocketmq/tags
我在部署的时候最新发行版是 5.1.0 可以根据需求自行选择一个 5.x 的版本,部署流程不会有太大改变。
docker pull apache/rocketmq:5.1.0
部署 NameServer
NameServer 是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现,几乎无状态节点,因此可集群部署,节点之间无任何信息同步,所谓的集群部署和单机部署其实是一样的,需要多个 NameServer 保持高可用只需独立部署即可。
创建挂载文件夹
# 日志目录
mkdir /usr/local/rocketmq/nameserver/logs -p
# 脚本目录
mkdir /usr/local/rocketmq/nameserver/bin -p
设置权限:如果不设置会导致 NameServer 容器内部无法写日志文件
# 777 文件所属者、文件所属组和其他人有读取 & 写入 & 执行全部权限。rwxrwxrwx
chmod 777 -R /usr/local/rocketmq/nameserver/*
创建挂载文件
NameServer 启动脚本中有一个自动计算最大堆内存和新生代内存的函数会导致在不同硬件环境下设置最大堆内存和新生代内存环境变量不被应用,,这里先提前 copy 一份容器内部启动脚本做挂载,如果想自定义内存可以自己调整。
1、启动容器
docker run -d \
--privileged=true \
--name rmqnamesrv \
apache/rocketmq:5.1.0 sh mqnamesrv
2、复制容器内启动脚本到挂载目录 / usr/local/rocketmq/nameserver/bin
docker cp rmqnamesrv:/home/rocketmq/rocketmq-5.1.0/bin/runserver.sh /usr/local/rocketmq/nameserver/bin/runserver.sh
3、修改 runserver.sh
# 打开脚本文件
vi /usr/local/rocketmq/nameserver/bin/runserver.sh
找到调用 calculate_heap_sizes 函数的位置注释掉保存即可,拉到脚本最底部就能找到
4、停止 & 删除容器
docker stop rmqnamesrv
docker rm rmqnamesrv
启动 NameServer
sudo docker run -d \
--privileged=true \
--restart=always \
--name rmqnamesrv \
-p 9302:9876 \
-v /docker/rocketmq/nameserver/logs:/home/rocketmq/logs \
-v /docker/rocketmq/nameserver/bin/runserver.sh:/home/rocketmq/rocketmq-5.1.0/bin/runserver.sh \
-e "MAX_HEAP_SIZE=256M" \
-e "HEAP_NEWSIZE=128M" \
apache/rocketmq:5.1.0 sh mqnamesrv
- 参数说明
注意个别参数有两个减号
参数 | 说明 |
---|---|
-d | 以守护进程的方式启动 |
–restart=always | docker 重启时候容器自动重启 |
–name rmqnamesrv | 把容器的名字设置为 rmqnamesrv |
-p 9876:9876 | 把容器内的端口 9876 挂载到宿主机 9876 上面,宿主机端口: 容器内部端口 |
-v /usr/local/rocketmq/nameserver/logs:/home/rocketmq/logs | 挂载容器内日志 |
-v /usr/local/rocketmq/nameserver/bin/runserver.sh:/home/rocketmq/rocketmq-5.1.0/bin/runserver.sh | 挂载启动脚本 |
-e “MAX_HEAP_SIZE=256M” | 设置最大堆内存和堆内存初始大小 |
-e “HEAP_NEWSIZE=128M” | 设置新生代内存大小 |
apache/rocketmq:5.1.0 | 使用的镜像名称 + 版本 |
sh mqnamesrv | 启动 namesrv 服务 |
部署 Broker
创建需要映射的文件夹和文件
创建的挂载文件夹
提前创建挂载目录用于挂载容器内部数据、配置文件、以及日志。
# 创建需要的挂载目录
mkdir /docker/rocketmq/broker/logs -p \
mkdir /docker/rocketmq/broker/data -p \
mkdir /docker/rocketmq/broker/conf -p \
mkdir /docker/rocketmq/broker/bin -p
设置权限
# 777 文件所属者、文件所属组和其他人有读取 & 写入 & 执行全部权限。rwxrwxrwx
chmod 775 -R /docker/rocketmq/broker/*
创建 broker.conf 文件
在 / usr/local/rocketmq/broker/conf 文件夹下创建 broker.conf 文件
vi /docker/rocketmq/broker/conf/broker.conf
添加以下配置信息到 broker.conf,这里不对参数做过多的说明,在下面 Broker 配置详解中有对 Broker 常用参数做详细介绍
# nameServer 地址多个用;隔开 默认值null
# 例:127.0.0.1:6666;127.0.0.1:8888
namesrvAddr = xx.xxx.xxx.xx:9302
# 集群名称
brokerClusterName = DefaultCluster
# 节点名称
brokerName = broker-a
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0
brokerId = 0
# Broker服务地址 String 内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP1 = xx.xxx.xxx.xx
# Broker角色
brokerRole = ASYNC_MASTER
# 刷盘方式
flushDiskType = ASYNC_FLUSH
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 72
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
说明:建立 broker.conf 文件,通过这个文件把 RocketMQ 的 broker 管理起来
拷贝容器内 Broker 启动脚本到宿主机(如果不需要自定义堆内存可以跳过)
Broker 启动脚本中有一个自动计算最大堆内存和新生代内存的函数会导致在不同硬件环境下设置最大堆内存和新生代内存环境变量不被应用,,这里先提前 copy 一份容器内部启动脚本做挂载,如果想自定义内存可以自己调整。
1、启动容器
docker run -d \
--name rmqbroker \
--privileged=true \
apache/rocketmq:5.1.0 \
sh mqbroker
2、复制容器内启动脚本到挂载目录 / usr/local/rocketmq/nameserver/bin
docker cp rmqbroker:/home/rocketmq/rocketmq-5.1.0/bin/runbroker.sh /docker/rocketmq/broker/bin/runbroker.sh
3、修改 runbroker.sh
# 打开脚本文件
vi /docker/rocketmq/broker/bin/runbroker.sh
找到调用 calculate_heap_sizes 函数的位置注释掉保存即可,拉到脚本最底部就能找到
4、停止 & 删除容器
docker stop rmqbroker
docker rm rmqbroker
启动 Broker
docker run -d \
--restart=always \
--name rmqbroker \
-p 10911:10911 -p 10909:10909 \
--privileged=true \
-v /docker/rocketmq/broker/logs:/root/logs \
-v /docker/rocketmq/broker/store:/root/store \
-v /docker/rocketmq/broker/conf/broker.conf:/home/rocketmq/broker.conf \
-v /docker/rocketmq/broker/bin/runbroker.sh:/home/rocketmq/rocketmq-5.1.0/bin/runbroker.sh \
-e "MAX_HEAP_SIZE=512M" \
-e "HEAP_NEWSIZE=256M" \
apache/rocketmq:5.1.0 \
sh mqbroker -c /home/rocketmq/broker.conf
- 参数说明
注意个别参数有两个减号
参数 | 说明 |
---|---|
-d | 以守护进程的方式启动 |
–restart=always | docker 重启时候容器自动重启 |
–name rmqbroker | 把容器的名字设置为 rmqbroker |
-p 10911:10911 | 把容器内的端口 10911 挂载到宿主机 10911 上面,宿主机端口: 容器内部端口 |
-p 10909:10909 | 把容器内的端口 10909 挂载到宿主机 10909 上面,宿主机端口: 容器内部端口 |
-v /usr/local/rocketmq/broker/logs:/root/logs | 挂载容器内日志 |
-v /usr/local/rocketmq/broker/store:/root/store | 挂载数据目录 |
-v /usr/local/rocketmq/broker/conf/broker.conf:/home/rocketmq/broker.conf | 挂载启动配置文件 |
-v /usr/local/rocketmq/broker/bin/runbroker.sh:/home/rocketmq/rocketmq-5.1.0/bin/runbroker.sh | 挂载 broker 启动脚本,需要自己定义堆内存时使用 |
-e “MAX_HEAP_SIZE=512M” | 设置最大堆内存和堆内存初始大小 |
-e “HEAP_NEWSIZE=256M” | 设置新生代内存大小 |
apache/rocketmq:5.1.0 | 使用的镜像名称 + 版本 |
sh mqbroker -c /home/rocketmq/broker.conf | 启动 broker 服务 使用自定义配置文件 |
部署 Proxy
这里暂时不对 Proxy 进行部署,单机版本没必要,不使用 Proxy 和之前的 4.x 版本基本一致
部署 RocketMQ 控制台(rocketmq-dashboard)
镜像拉取
拉取最新版即可
docker pull apacherocketmq/rocketmq-dashboard:latest
启动 RocketMQ 控制台(rocketmq-dashboard)
docker run -d \
--restart=always \
--name rmqdashboard \
-e "JAVA_OPTS=-Xmx256M -Xms256M -Xmn128M -Drocketmq.namesrv.addr=xx.xxx.xxx.xx:9302 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 9301:8080 \
-e TZ=Asia/Shanghai \
apacherocketmq/rocketmq-dashboard
Broker 配置详解
# 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 = 127.0.0.1
# 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
本文系作者 @WangJun 原创发布在wangjun's blog站点。未经许可,禁止转载。
暂无评论数据