RocketMQ无损扩容实战

2023年 7月 18日 85.7k 0

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

背景

假设目前我们的线上部署的RocketMQ部署的是一主一从,现在随着业务的发展,或者是我们需要做一些促销活动,会有突发流量高峰,现有的一主一从无法满足我们的性能,服务器的内存和cpu占用已经高达70-90%左右,所以我们需要对线上的RocketMQ集群进行无损扩容(不影响业务正常使用)

扩容

原有的一主一从的配置

broker-a-n0

brokerClusterName = xiaozou
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true

fetchNamesrvAddrByAddressServer = true
fetchControllerAddrByDnsLookup = true
# 虚拟的,线上填写自己真实地址(dns服务发现使用域名)
controllerAddr = weihubeats-mq-controller.com:9878
allAckInSyncStateSet=true
listenPort=30911

storePathRootDir=/Users/weihubeats/Desktop/sofe/rocketmq-file/rmqstore/node00/store

autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
enablePropertyFilter=true
slaveReadEnable=true
waitTimeMillsInSendQueue=1000

broker-a-n1

brokerClusterName = xiaozou
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true

fetchNamesrvAddrByAddressServer = true
fetchControllerAddrByDnsLookup = true
# 虚拟的,线上填写自己真实地址(dns服务发现使用域名)
controllerAddr = weihubeats-mq-controller.com:9878
allAckInSyncStateSet=true
listenPort=30911

storePathRootDir=/Users/weihubeats/Desktop/sofe/rocketmq-file/rmqstore/node01/store

autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
enablePropertyFilter=true
slaveReadEnable=true
waitTimeMillsInSendQueue=1000

可以看到broker-a-n0broker-a-n1配置并没有什么太大区别。

现在我们要进行无损扩容了,我们需要新增一主一从,即broker-b-n0broker-a-n1

新主从配置

我们这里先给出新的主从的配置

broker-a-n0

brokerClusterName = xiaozou
brokerName = broker-b
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true

fetchNamesrvAddrByAddressServer = true
fetchControllerAddrByDnsLookup = true
# 虚拟的,线上填写自己真实地址(dns服务发现使用域名)
controllerAddr = weihubeats-mq-controller.com:9878
allAckInSyncStateSet=true
listenPort=30911

storePathRootDir=/Users/weihubeats/Desktop/sofe/rocketmq-file/rmqstore/node00/store

autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
enablePropertyFilter=true
slaveReadEnable=true
waitTimeMillsInSendQueue=1000

broker-a-n1

brokerClusterName = xiaozou
brokerName = broker-b
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true

fetchNamesrvAddrByAddressServer = true
fetchControllerAddrByDnsLookup = true
# 虚拟的,线上填写自己真实地址(dns服务发现使用域名)
controllerAddr = weihubeats-mq-controller.com:9878
allAckInSyncStateSet=true
listenPort=30911

storePathRootDir=/Users/weihubeats/Desktop/sofe/rocketmq-file/rmqstore/node01/store

autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
enablePropertyFilter=true
slaveReadEnable=true
waitTimeMillsInSendQueue=1000

可以看到新的主从配置与原先的broker-a-n0没有太大的区别,唯一的不同就是brokerClusterName不同

copy原有的配置文件

需要注意新主节点如果不copy原有集群的topics.json配置和subscriptionGroup.json会导致原有集群上的topic和subscriptionGroup在新的扩容集群不生效,需要手动去创建

如果查看老的topic会发现在新的集群是没有的,所以我们需要把旧集群的这两个配置topics.jsonsubscriptionGroup.json复制到我们新集群的配置文件夹里面,即我们配置的storePathRootDir
storePathRootDir + /config

然后按照我们原先的启动集群方式启动新的集群即可

我这里可以看到broker-d已经有消息消费了

验证方式

如果想要验证很简单,本地启动一个product一直发送消息

然后看到扩容的broker启动,看看有没有消息发送到这个broker即可完成验证

一个小细节

我们在复制的topic.json中有一个系统topic比如我们的集群是broker-a
那么会有这么一个topic


"broker-a":{
			"attributes":{},
			"order":false,
			"perm":7,
			"readQueueNums":1,
			"topicFilterType":"SINGLE_TAG",
			"topicName":"broker-a",
			"topicSysFlag":0,
			"writeQueueNums":1
		}

这种topic复制到新的扩容集群我们需要手动修改为broker-b吗,实际是不需要的,系统会自动创建该topic

总结

总的来说整体操作难度不大,但是如果认为的去扩容在线上遇到紧急流量我们可能操作不过来,所以可以考虑使用快照的方式扩容这样库容会更快

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论