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.  主备自动切换模式部署  

      image

    增加支持自动主从切换的Controller组件,其可以独立部署也可以内嵌在NameServer中。

    1.  Controller介绍

        Controller组件提供选主能力,若需要保证Controller具备容错能力,Controller部署需要三副本及以上(遵循Raft的多数派协议)。

        注意:  Controller 若只部署单副本也能完成 Broker Failover,但若该单点 Controller 故障,会影响切换能力,但不会影响存量集群的正常收发。            

    2.  Controller嵌入NameServer部署

      image

        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独立部署 

        image

        启动脚本:  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 &                    

                                                                             

posted @ 2026-08-17 16:13  奋斗史  阅读(36)  评论(0)    收藏  举报