RocketMQ之部署
RocketMQ的安装包分为两种,二进制包和源码包。
文章以RocketMQ5.3.2为例子
1. 单节点
1. 本地部署
1. 下载二进制包
github下载rocketmq-all-5.3.1-bin-release.zip
2. 解压并放到/usr/local/
unzip rocketmq-all-5.3.1-bin-release.zip
mv rocketmq-all-5.3.1-bin-release /usr/local/rocketmq
3. 启动nameserver
nohup /usr/local/rocketmq/bin/mqnamesrv &
验证是否成功
tail -f ~/logs/rocketmqlogs/namesrv.log
namesrv使用的端口是9876
4. 启动Broker+Proxy
nohup /usr/local/rocketmq/bin/mqbroker -n 本机IP:9876 --enable-proxy &
5. 使用工具测试消息收发
生产者
export NAMESRV_ADDR=172.16.1.175:9876
sh tools.sh org.apache.rocketmq.example.quickstart.Producer -n 172.16.1.175:9876
消费者
export NAMESRV_ADDR=172.16.1.175:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer -n 172.16.1.175:9876
6. 关闭服务器
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
7. 启用proxy与不启用proxy有什么区别
| 对比项 | 不启用 Proxy(纯 Broker,4.x 传统模式) | 启用‑‑enable‑proxy(Local 模式) |
|---|---|---|
| 通信协议 | 只支持Remoting 私有协议(TCP,端口 10911) | Remoting + gRPC 协议(端口 8081),支持多语言轻量客户端CSDN博... |
| 客户端支持 | 仅 Java‑SDK(老版本 4.x);Go/Python/C++ 客户端不能直连 | 支持 Java、Go、Python、C#、Node.js 等 5.x 轻量客户端 |
| 消费模式 | 传统 Push 消费;客户端侧负载均衡 | 新增POP 无状态消费;负载均衡下沉到 Proxy 服务端,客户端变轻量GitHub |
| 连接方式 | 生产者 / 消费者直连 Broker;客户端自己拉取 NameServer 路由、维护队列连接 | 客户端连 Proxy 即可,Proxy 代访 NameServer 和 Broker;客户端不用维护大量长连接 |
| 资源开销 | 进程只有 Broker;CPU、内存占用低 | 同一个 JVM 额外加载 Proxy 模块,内存消耗略高 5‑15% |
| 流量治理、鉴权、链路追踪 | 能力弱,需要客户端实现 | 代理层可统一做限流、权限校验、监控埋点 |
| 云原生存算分离 | 不支持 | 为后续拆分独立 Proxy 集群(Cluster 模式)做铺垫 |
| 老 Java 项目兼容 | 完全兼容 4.x 所有 Java 客户端 | 老 Java‑SDK (<4.9.5) 会报错,必须升级 SDK 版本≥4.9.5稀土掘金 |
1. 不启用proxy的场景
1. 只有Java程序消费发送消息,没有Go/Python等其他语言
2. 老项目从RocketMQ4.x升级上来,不想改动业务SDK
3. 单机资源紧张,仅做简单测试
2. 启用proxy的场景
1. 需要多语言环境接入RocketMQ5.x
2. 计划后续演进为存算分离架构
3. 需要POP无状态消费,轻量客户端,减少客户端长连接压力
2. 使用Docker部署RocketMQ
1. 拉取RocketMQ镜像
docker pull apache/rocketmq:5.3.2
2. 创建容器共享网络
RocketMQ中由多个服务,需要创建多个容器,创建docker网络便于容器间相互通信
docker network create rocketmq
3. 启动NameServer
docker run -d --name rmqnamesrv -p 9876:9876 --network rocketmq apache/rocketmq:5.3.2 sh mqnamesrv
docker logs -f rmqnamesrv
4. 启动Broker+Proxy
# 配置 Broker 的IP地址 echo "brokerIP1=127.0.0.1" > broker.conf # 启动 Broker 和 Proxy docker run -d \ --name rmqbroker \ --network rocketmq \ -p 10912:10912 -p 10911:10911 -p 10909:10909 \ -p 8080:8080 -p 8081:8081 \ -e "NAMESRV_ADDR=rmqnamesrv:9876" \ -v ./broker.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf \ apache/rocketmq:5.3.2 sh mqbroker --enable-proxy \ -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf # 验证 Broker 是否启动成功 docker exec -it rmqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"
5. 停止容器
docker stop rmqnamesrv
docker stop rmqbroker
3. 使用Docker Compose部署RocketMQ
1. 通过配置来创建docker-compose.yml
version: '3.8'
services:
namesrv:
image: apache/rocketmq:5.3.2
container_name: rmqnamesrv
ports:
- 9876:9876
networks:
- rocketmq
command: sh mqnamesrv
broker:
image: apache/rocketmq:5.3.2
container_name: rmqbroker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
depends_on:
- namesrv
networks:
- rocketmq
command: sh mqbroker
proxy:
image: apache/rocketmq:5.3.2
container_name: rmqproxy
networks:
- rocketmq
depends_on:
- broker
- namesrv
ports:
- 8080:8080
- 8081:8081
restart: on-failure
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
command: sh mqproxy
networks:
rocketmq:
driver: bridge
2. 启动RocetMQ
docker-compose up -d
3. 停止所有服务
docker-compose down
4. K8s部署RocketMQ
1. 安装helm
$ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
2. 下载RocketMQ Helm仓库
$ helm pull oci://registry-1.docker.io/apache/rocketmq --version 0.0.1
$ tar -zxvf rocketmq-0.0.1.tgz
3. 部署RocketMQ
使用Helm chart部署RocketMQ
$ vim values.yaml
##values.yaml, 例如根据机器可用内存大小将broker中resources中requests和limits的memory进行调整##
resources:
limits:
cpu: 2
memory: 10Gi
requests:
cpu: 2
memory: 10Gi
##values.yaml##
安装rocketmq
$ helm install rocketmq-demo ./rocketmq #查看pod状态 #若参数正常,则表明部署成功 $ kubectl get pods -o wide -n default NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES rocketmq-demo-broker-0 1/1 Running 0 6h3m 192.168.58.225 k8s-node02 <none> <none> rocketmq-demo-nameserver-757877747b-k669k 1/1 Running 0 6h3m 192.168.58.226 k8s-node02 <none> <none> rocketmq-demo-proxy-6c569bd457-wcg6g 1/1 Running 3 (6h2m ago) 6h3m 192.168.85.227 k8s-node01 <none> <none>
4. 释放RoceketMQ资源
#释放所有rocketmq资源 $ helm uninstall rocketmq-demo
5. 多节点
1. 多节点单副本模式
一个集群内全部部署 Master 角色,不部署Slave 副本,例如2个Master或者3个Master,这种模式的优缺点如下:
优点:
配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
缺点:
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
启动参数nameserver
可以在启动参数里面指定nameserver,也可以在配置文件中指定nameserver
### 在机器A,启动第一个Master,例如NameServer的IP为:192.168.1.1 $ nohup sh bin/mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties --enable-proxy & ### 在机器B,启动第二个Master,例如NameServer的IP为:192.168.1.2 $ nohup sh bin/mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties --enable-proxy &
配置文件内容
brokerName 每个master都是不同的
brokerClusterName 同一个集群是相同的
brokerId 因为没有slave,所以都设置为0,0为master,大于0为slave
namesrvAddr=172.16.1.173:9876;172.16.1.175:9876
brokerRole ASYNC_MASTER SYNC_MASTER SLAVE
2. 多节点多副本模式-异步复制
每个Master配置一个Slave,有多组 Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
优点:
即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
缺点:
Master宕机,磁盘损坏情况下会丢失少量消息。
配置文件
一主 namesrvAddr=172.16.1.173:9876;172.16.1.175:9876 brokerClusterName=DefaultCluster brokerName=broker-a brokerId=0 brokerIP1=172.16.1.173 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH enableProxy=true storePathRootDir=/usr/local/rocketmq/store-broker-a storePathCommitLog=/usr/local/rocketmq/store-broker-a/commitlog 一从 namesrvAddr=172.16.1.173:9876;172.16.1.175:9876 brokerClusterName=DefaultCluster brokerName=broker-a brokerId=1 brokerIP1=172.16.1.175 deleteWhen=04 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH enableProxy=true storePathRootDir=/usr/local/rocketmq/store-broker-a-slave storePathCommitLog=/usr/local/rocketmq/store-broker-a-slave/commitlog listenPort=10921 haListenPort=10922
另外一个是broker-b
主 namesrvAddr=172.16.1.173:9876;172.16.1.175:9876 brokerClusterName=DefaultCluster brokerName=broker-b brokerId=0 brokerIP1=172.16.1.175 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH enableProxy=true 从 namesrvAddr=172.16.1.173:9876;172.16.1.175:9876 brokerClusterName=DefaultCluster brokerName=broker-b brokerId=1 brokerIP1=172.16.1.173 deleteWhen=04 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH enableProxy=true storePathRootDir=/usr/local/rocketmq/store-broker-b-slave storePathCommitLog=/usr/local/rocketmq/store-broker-b-slave/commitlog listenPort=10921 haListenPort=10922
3. 多节点多副本模式-同步双写
每个Master配置一个Slave,有多对 Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
优点: 数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
缺点: 性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
配置文件
修改一下master的brokerRole为SYNC_MASTER,其他配置不变
注意: 不管是异步复制还是同步双写:原生普通主从集群,master宕机,slave不会自动升主。slave只能读,不能写入信息。
6. 主备自动切换模式部署

增加支持自动主从切换的Controller组件,其可以独立部署也可以内嵌在NameServer中。
1. Controller介绍
Controller组件提供选主能力,若需要保证Controller具备容错能力,Controller部署需要三副本及以上(遵循Raft的多数派协议)。
注意: Controller 若只部署单副本也能完成 Broker Failover,但若该单点 Controller 故障,会影响切换能力,但不会影响存量集群的正常收发。
2. Controller嵌入NameServer部署

Controller作为插件跑在NameServer进程内,不需要额外启动mqcontroller进程
不是所有 namesrv 都需要开启 controller,只选 3 台 namesrv 打开enableControllerInNamesrv=true组成 controller 集群;
其余 namesrv 保持默认关闭,继续做普通无状态路由服务;namesrv 本身路由能力不受 controller 故障影响,仅自动切换能力受影响RocketMQ
配置文件namesrv.conf内容:
enableControllerInNamesrv = true controllerDLegerGroup = group1 controllerDLegerPeers = n0‑10.0.0.10:9878;n1‑10.0.0.11:9878;n2‑10.0.0.12:9878 controllerDLegerSelfId = n0 controllerStorePath = /data/rocketmq/controller_store enableElectUncleanMaster = false notifyBrokerRoleChanged = true
参数解释:
enableControllerInNamesrv: Nameserver 中是否开启 controller,默认 false。
controllerDLegerGroup:DLedger Raft Group 的名字,同一个 DLedger Raft Group 保持一致即可。
controllerDLegerPeers:DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致。
controllerDLegerSelfId:节点 id,必须属于 controllerDLegerPeers 中的一个;同 Group 内各个节点要唯一。
controllerStorePath:controller 日志存储位置。controller 是有状态的,controller 重启或宕机需要依靠日志来恢复数据,该目录非常重要,不可以轻易删除。
enableElectUncleanMaster:是否可以从 SyncStateSet 以外选举 Master,若为 true,可能会选取数据落后的副本作为 Master 而丢失消息,默认为 false。
notifyBrokerRoleChanged:当 Broker 副本组上角色发生变化时是否主动通知,默认为 true。
启动NameServer
$ nohup sh bin/mqnamesrv -c namesrv.conf &
注意:嵌入模式下,namesrv 同时承担路由 + controller 选主,CPU / 内存压力会上升;大集群不推荐嵌入模式,优先独立部署。
3. Controller独立部署

启动脚本: bin/mqcontroller
官方模板配置目录:conf/controller/cluster‑3n‑independent/,提供 n0/n1/n2 三份配置文件
配置文件内容:
enableControllerInNamesrv = true controllerDLegerGroup = group1 controllerDLegerPeers = n0‑10.0.0.10:9878;n1‑10.0.0.11:9878;n2‑10.0.0.12:9878 controllerDLegerSelfId = n0 controllerStorePath = /data/rocketmq/controller_store enableElectUncleanMaster = false notifyBrokerRoleChanged = true
启动每个controller节点
nohup sh bin/mqcontroller -c conf/controller/cluster-3n-independent/controller-n0.conf &
4. broker部署
enableControllerMode:Broker controller 模式的总开关,只有该值为 true,自动主从切换模式才会打开。默认为 false。 controllerAddr:controller 的地址,多个 controller 中间用分号隔开。例如controllerAddr = 127.0.0.1:9877;127.0.0.1:9878;127.0.0.1:9879 syncBrokerMetadataPeriod:向 controller 同步 Broker 副本信息的时间间隔。默认 5000(5s)。 checkSyncStateSetPeriod:检查 SyncStateSet 的时间间隔,检查 SyncStateSet 可能会 shrink SyncState。默认5000(5s)。 syncControllerMetadataPeriod:同步 controller 元数据的时间间隔,主要是获取 active controller 的地址。默认10000(10s)。 haMaxTimeSlaveNotCatchup:表示 Slave 没有跟上 Master 的最大时间间隔,若在 SyncStateSet 中的 slave 超过该时间间隔会将其从 SyncStateSet 移除。默认为 15000(15s)。 storePathEpochFile:存储 epoch 文件的位置。epoch 文件非常重要,不可以随意删除。默认在 store 目录下。 allAckInSyncStateSet:若该值为 true,则一条消息需要复制到 SyncStateSet 中的每一个副本才会向客户端返回成功,可以保证消息不丢失。默认为 false。 syncFromLastFile:若 slave 是空盘启动,是否从最后一个文件进行复制。默认为 false。 asyncLearner:若该值为 true,则该副本不会进入 SyncStateSet,也就是不会被选举成 Master,而是一直作为一个 learner 副本进行异步复制。默认为false。 inSyncReplicas:需保持同步的副本组数量,默认为1,allAckInSyncStateSet=true 时该参数无效。 minInSyncReplicas:最小需保持同步的副本组数量,若 SyncStateSet 中副本个数小于 minInSyncReplicas 则 putMessage 直接返回 PutMessageStatus.IN_SYNC_REPLICAS_NOT_ENOUGH,默认为1。
注意: 自动主备切换模式下Broker无需指定brokerId和brokerRole,其由Controller组件进行分配
启动broker
$ nohup sh bin/mqbroker -c broker.conf &

浙公网安备 33010602011771号