Rocketmq 5.1.0 controller高可用部署实战

1,851 阅读3分钟

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

Rocketmq版本

  • version: 5.1.0

部署架构

说明

该架构仅为测试环境部署方案

  1. nameservercontroller同进程部署
  2. brokerproxy同进程部署,采用的是Local模式
  3. nameserver节点为2个,这种方式部署成后,后续要加多少个都简单
  4. broker节点为2个,这种方式部署成后,后续要加多少个都简单
  5. 若需要保证Controller具备容错能力,Controller部署需要三副本及以上(遵循Raft的多数派协议)
  6. nameserve的寻址为http寻址,方便扩展

部署脚本

  • broker

为了支持http方式寻址nameserve,我们添加如下启动参数

-Drocketmq.namesrv.domain=127.0.0.1:9000 -Drocketmq.namesrv.domain.subgroup=nsaddr-2

  • runbroker

默认运行broker的内存为8g,实际测试的内存没这么大,我们可以改小一点,比如4g

配置

这里我们将自己的配置都放在自己新建的路径下,后续启动要用 我这里的路径就是
/root/rocketmq-5.1.0/distribution/target/rocketmq-5.1.0/rocketmq-5.1.0/distribution/conf/controller/test
注意我这里是放在编译好的路径下,实际可用放在项目未编译的路径下,这样编译了这个编译路径也会有该脚本

nameserve

  • namesrv-n0.conf
listenPort = 9876
enableControllerInNamesrv = true

#controller config
controllerDLegerGroup = group1
controllerDLegerPeers = n0-192.168.1.1:9878;n1-192.168.1.2:9878
controllerDLegerSelfId = n0
  • namesrv-n1.conf
listenPort = 9876
enableControllerInNamesrv = true


#controller config
controllerDLegerGroup = group1
controllerDLegerPeers = n0-192.168.1.1:9878;n1-192.168.1.2:9878
controllerDLegerSelfId = n1

broker

  • broker-no.confg
brokerClusterName = testCluster
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true

controllerAddr = 192.168.1.1:9878;192.168.1.2:9878
allAckInSyncStateSet=true
listenPort=30911
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
fetchNamesrvAddrByAddressServer = true
autoCreateTopicEnable=false
enablePropertyFilter=true
slaveReadEnable=true
  • broker-n1.confg
brokerClusterName = testCluster
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true

controllerAddr = 192.168.1.1:9878;192.168.1.2:9878
allAckInSyncStateSet=true
listenPort=30921
storePathRootDir=/tmp/rmqstore/node01
storePathCommitLog=/tmp/rmqstore/node01/commitlog
fetchNamesrvAddrByAddressServer = true
autoCreateTopicEnable=false
enablePropertyFilter=true
slaveReadEnable=true

可以看到我们这里并没有指定nameserve的服务地址,因为我们之前在启动脚本里面添加了http的方式获取nameserve地址,所以无需指定,这么做是方便扩容.

需要注意的是我们controller地址是手动指定的,这种方式是不方便扩容的,如果我们想要方便扩容controller提供了dns的方式

部署

启动nameserve

  1. 启动namesrv-n0
  • 机器: 192.168.1.1
nohup sh bin/mqnamesrv -c /root/rocketmq-5.1.0/distribution/target/rocketmq-5.1.0/rocketmq-5.1.0/conf/controller/test/namesrv-n0.conf &
  1. 启动namesrv-n1
  • 机器:192.168.1.2
nohup sh bin/mqnamesrv -c /root/rocketmq-5.1.0/distribution/target/rocketmq-5.1.0/rocketmq-5.1.0/conf/controller/test/namesrv-n1.conf &

验证

我们可以通过运维命令查看Controller状态。

sh bin/mqadmin getControllerMetaData -a localhost:9878

-a代表集群中任意一个Controller的地址 顺利的话,我们可以看到如下信息

➜ rocketmq-5.1.0:bin/mqadmin getControllerMetaData -a localhost:9878

#ControllerGroup        group1
#ControllerLeaderId     n1
#ControllerLeaderAddress        192.168.1.1:9878
#Peer:  n0:192.168.1.1:9878
#Peer:  n1:192.168.1.2:9878

至此我们启动了两个nameserve+controller

启动proxy+broker

配置环境变量 新的服务上都配置一下

export ROCKETMQ_HOME=/root/rocketmq-5.1.0/distribution/target/rocketmq-5.1.0/rocketmq-5.1.0
  1. 启动broker-n0
  • 机器: 192.168.1.1 执行脚本
nohup bash bin/mqbroker -bc $ROCKETMQ_HOME/conf/controller/test/broker-n0.conf --enable-proxy &
  1. 启动broker-n1
  • 机器: 192.168.1.2
nohup bash bin/mqbroker -bc $ROCKETMQ_HOME/conf/controller/test/broker-n1.conf --enable-proxy &

验证

执行如下脚本

sh bin/mqadmin getSyncStateSet -a localhost:9878 -b broker-a

如果顺利的话可以看到如下信息

➜  rocketmq-5.1.0:sh bin/mqadmin getSyncStateSet -a localhost:9878 -b broker-a

#brokerName     broker-a
#MasterAddr     127.0.0.1:30911
#MasterEpoch    1
#SyncStateSetEpoch      2
#SyncStateSetNums       2

 InSyncReplica: {address='127.0.0.1:30911', brokerId=2}

 InSyncReplica: {address='127.0.0.2:30911', brokerId=0}

Dashboard验证

我们可以通过官方的dashboard去查看,可以看到正常有两个节点

image.png

如果我们kill掉一个节点另一个节点也会从slave切换为master

总结

总的来说部署还是相对简单,线上部署nameserver还是推荐最少3个节点,然后就是内存调大一点,nameserve不要和 broker部署在一起