RocketMQ高阶

前言

上一篇RocketMQ进阶,记录了消息RocketMQ的特性,举了一些实例。接下来我们记录一下,如何搭建RocketMQ的集群。

https://wysiwyg.work/2023/11/02/2023/web/2023-11-02-RocketMQ-%E8%BF%9B%E9%98%B6/

RocketMQ部署方式

单Master

只有一个Broker,一旦重启或者宕机,对外就无法提供服务,建议线上不要使用。

多Master

一个集群没有Slave,都是Master。可以是2个或3个节点。

  • 优点:配置简单,相比于单节点,可以同时保存并处理更多消息,提高并发。
  • 缺点:一个节点宕机之后,此节点的消息在恢复之前无法被消费。

多Master多Slave异步复制

每个Master有一个Slave,有多对Master-Slave。HA采用异步复制,主备消息不同步,呈现最终一致性。

  • 优点:当Master节点宕机之后,消费者可以在Slave上继续消费消息,切换操作不需要人工干预。性能同多Master模式几乎一样

  • 缺点:在Master节点宕机之后会有消息丢失。

多Master多Slav同步双写

每个Master有一个Slave,有多对Master-Slave。采用同步复制,主从数据一致。

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
  • 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

自动主从切换(5.0版本)

相比于主从模式,添加了基于 Raft 的一致性模块(DLedger Controller),当Master节点宕机之后,可以自主实现主从切换。

搭建集群

环境

centos版本:7.0 java版本:1.8.0_332 RocketMQ版本:5.0

虚拟机A:192.168.202.129 虚拟机B:192.168.202.130

安装RocketMQ

1
2
wget https://archive.apache.org/dist/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip
unzip rocketmq-all-5.0.0-bin-release.zip

在conf下面提供了几种集群方式的配日志文件实例:

2m-noslave:双master节点

2m-2s-sync:双master双slave同步双写模式

2m-2s-async:双master双slave异步复制模式

准备NameServer

NameServer之间是无状态的,首先启动NameServer

创建启动脚本namesrv.start,然后执行脚本即可启动。

1
./bin/mqnamesrv >namesrv.log 2>&1 &  #重定向 错误、标准输出到 namesrv.log,并 & 后台启动

PS:修改conf/logback_namesrv.xml文件的标签内容,也可修改日志保存内容

关闭NameServer命令:

1
./bin/mqshutdown namesrv

部署方式

多Master

192.168.202.129 NameServer Broker-Master-a
192.168.202.130 NameServer Broker-Master-b

修改/conf/2m-noslave 下的 broker-a.propertiesbroker-b.properties

broker-a.properties:

1
2
3
4
5
6
7
8
9
10
11
12
13
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0 # master=0 slave>0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER #异步复制
flushDiskType=ASYNC_FLUSH #异步刷盘 消息通过异步的方式保存到服务器磁盘
listenPort=10980
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876 #nameServer地址,多个用;隔开
storePathRootDir=/home/chirs/rocketmq/store/master-a
storePathCommitLog=/home/chirs/rocketmq/store/master-a/commitlog #commitlog保存路径
storePathIndex=/home/chirs/rocketmq/store/master-a/index #索引
storePathConsumeQueue=/home/chirs/rocketmq/store/master-a/consumequeue #队列

broker-b.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10981
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876
storePathRootDir=/home/chirs/rocketmq/store/master-b
storePathCommitLog=/home/chirs/rocketmq/store/master-b/commitlog
storePathIndex=/home/chirs/rocketmq/store/master-b/index
storePathConsumeQueue=/home/chirs/rocketmq/store/master-b/consumequeue

复制129MQ文件到130

1
scp -r ./rocketmq-all-5.0.0-bin-release root@192.168.202.130:/home/chirs/rocketmq/

启动NameServer

1
./namesrv.start

启动Broker

1
2
nohup bin/mqbroker -c conf/2m-noslave/broker-a.properties &  #129 
nohup bin/mqbroker -c conf/2m-noslave/broker-b.properties & #130 也可以启动broker-a,跟129命令一样

关闭Broker

1
./bin/mqshutdown broker

查看启动进程

1
2
3
4
[root@k8s-master rocketmq-all-5.0.0-bin-release]# jps
5073 BrokerStartup
4547 NamesrvStartup
5081 Jps

使用控制台查看集群信息

image-20231105214537995

多Master多Slave异步复制

192.168.202.129 NameServer Broker-Master-a Broker-Slave-b
192.168.202.130 NameServer Broker-Slave-a Broker-Master-b

修改conf/2m-2s-async 下的 broker-a.propertiesbroker-a-s.propertiesbroker-b.propertiesbroker-b-s.properties

broker-a.propertiesbroker-b.properties跟多master内容一致

broker-a-s.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=10990
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876
storePathRootDir=/home/chirs/rocketmq/store/slave-a
storePathCommitLog=/home/chirs/rocketmq/store/slave-a/commitlog
storePathIndex=/home/chirs/rocketmq/store/slave-a/index
storePathConsumeQueue=/home/chirs/rocketmq/store/slave-a/consumequeue

broker-b-s.properties:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=10991
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876
storePathRootDir=/home/chirs/rocketmq/store/slave-b
storePathCommitLog=/home/chirs/rocketmq/store/slave-b/commitlog
storePathIndex=/home/chirs/rocketmq/store/slave-b/index
storePathConsumeQueue=/home/chirs/rocketmq/store/slave-b/consumequeue

复制一下最新配置信息

1
scp -r ./rocketmq-all-5.0.0-bin-release root@192.168.202.130:/home/chirs/rocketmq/

启动Broker

1
2
3
4
nohup bin/mqbroker -c conf/2m-2s-async/broker-a.properties >master-a.log 2>&1 &  #129 
nohup bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties >slave-b-s.log 2>&1 & #129
nohup bin/mqbroker -c conf/2m-2s-async/broker-b.properties >master-b.log 2>&1 & #130
nohup bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties >slave-a-s.log 2>&1 & #130

可能出现问题:

image-20231105220523168

runbroker.sh 修改Broker (runserver.sh 修改nameServer)

修改 JAVA_OPT

image-20231105221715272

控制台查看集群

image-20231105221852409

主从自动切换(Controller架构)

192.168.202.129 NameServer Controller-n0 Broker-Master
192.168.202.130 NameServer Controller-n1 Broker-Slave
192.168.202.131 NameServer Controller-n2 Broker-Slave
Controller配置
配置文件说明

/conf/controller/cluster-3n-independent:单独部署(采用单独部署方式

/conf/controller/cluster-3n-namesrv-plugin:嵌入nameserver

参数说明
  • 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。
  • scanNotActiveBrokerInterval:扫描 Broker是否存活的时间间隔。
开始配置

进入**/conf/controller/cluster-3n-independent**

controller-n0.conf:

1
2
3
4
5
6
7
8
controllerDLegerGroup = controllerCluster
#DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致。
controllerDLegerPeers = n0-192.168.202.129:19878;n1-192.168.202.130:19878;n2-192.168.202.129:19878
#必须唯一,跟随controllerDLegerPeers每个IP前面的标识,可以n10
controllerDLegerSelfId = n0
controllerStorePath = /home/chirs/rocketmq/store/controller-cluster
enableElectUncleanMaster = false
notifyBrokerRoleChanged = true

controller-n1.conf:

1
2
3
4
5
6
controllerDLegerGroup = controllerCluster
controllerDLegerPeers = n0-192.168.202.129:19878;n1-192.168.202.130:19878;n2-192.168.202.129:19878
controllerDLegerSelfId = n1
controllerStorePath = /home/chirs/rocketmq/store/controller-cluster
enableElectUncleanMaster = false
notifyBrokerRoleChanged = true

controller-n2.conf:

1
2
3
4
5
6
controllerDLegerGroup = controllerCluster
controllerDLegerPeers = n0-192.168.202.129:19878;n1-192.168.202.130:19878;n2-192.168.202.129:19878
controllerDLegerSelfId = n2
controllerStorePath = /home/chirs/rocketmq/store/controller-cluster
enableElectUncleanMaster = false
notifyBrokerRoleChanged = true
Broker Controller配置
配置文件说明

可以基于主从配置进行修改,我这里直接创建了新的配置文件,重新配置,采用一主两从

路径:conf/controller/cluster-3n-independent/

broker-a.conf:主节点 ; broker-s1.conf:从节点;broker-s2.conf:从节点

参数说明
  • enableControllerMode:Broker controller模式的总开关,只有该值为true,controller模式才会打开。默认为false。
  • controllerAddr:controller的地址,两种方式填写。
    • 直接填写多个Controller IP地址,多个controller中间用分号隔开,例如controllerAddr = 127.0.0.1:9877;127.0.0.1:9878;127.0.0.1:9879。注意由于Broker需要向所有controller发送心跳,因此请填上所有的controller地址。
    • 填写域名,然后设置fetchControllerAddrByDnsLookup为true,则Broker去自动解析域名后面的多个真实controller地址。
  • fetchControllerAddrByDnsLookup:controllerAddr填写域名时,如果设置该参数为true,会自动获取所有controller的地址。默认为false。
  • controllerHeartBeatTimeoutMills:Broker和controller之间心跳超时时间,心跳超过该时间判断Broker不在线。
  • 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-a.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
brokerClusterName=controllerCluster
#broker需要一致
brokerName=broker-a
#<=0 master ;>0 slave
brokerId=0
deleteWhen=04
fileReservedTime=48
#节点之间异步复制数据
brokerRole=ASYNC_MASTER
#操作系统异步刷盘
flushDiskType=ASYNC_FLUSH

listenPort=10980
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876
storePathRootDir=/home/chirs/rocketmq/store/dledger-broker/master-a
storePathCommitLog=/home/chirs/rocketmq/store/dledger-broker/master-a/commitlog
storePathIndex=/home/chirs/rocketmq/store/dledger-broker/master-a/index
storePathConsumeQueue=/home/chirs/rocketmq/store/dledger-broker/master-a/consumequeue
#开始controller模式
enableControllerMode=true
#controller的地址
controllerAddr=192.168.202.129:19878;192.168.202.130:19878;192.168.202.129:19878
# allAckInSyncStateSet=ture 开启此配置,只有等到所有节点都消息都复制完成,可以保证消息不丢失。(当然异步也会丢失数据)

broker-s1.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
brokerClusterName=controllerCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=10981
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876
storePathRootDir=/home/chirs/rocketmq/store/dledger-broker/slave-a
storePathCommitLog=/home/chirs/rocketmq/store/dledger-broker/slave-a/commitlog
storePathIndex=/home/chirs/rocketmq/store/dledger-broker/slave-a/index
storePathConsumeQueue=/home/chirs/rocketmq/store/dledger-broker/slave-a/consumequeue

enableControllerMode=true
controllerAddr=192.168.202.129:19878;192.168.202.130:19878;192.168.202.129:19878

broker-s2.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
brokerClusterName=controllerCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=10981
namesrvAddr=192.168.202.129:9876;192.168.202.130:9876
storePathRootDir=/home/chirs/rocketmq/store/dledger-broker/slave-b
storePathCommitLog=/home/chirs/rocketmq/store/dledger-broker/slave-b/commitlog
storePathIndex=/home/chirs/rocketmq/store/dledger-broker/slave-b/index
storePathConsumeQueue=/home/chirs/rocketmq/store/dledger-broker/slave-b/consumequeue

enableControllerMode=true
controllerAddr=192.168.202.129:19878;192.168.202.130:19878;192.168.202.129:19878
启动集群!

复制129的MQ文件到130、131:

1
2
scp -r ./rocketmq-all-5.0.0-bin-release root@192.168.202.130:/home/chirs/rocketmq/
scp -r ./rocketmq-all-5.0.0-bin-release root@192.168.202.131:/home/chirs/rocketmq/

各节点启动NameServer,上面有不重复了

启动Controller:

1
2
3
4
5
6
7
8
#129
nohup ./bin/mqcontroller -c /home/chirs/rocketmq/rocketmq-all-5.0.0-bin-release/conf/controller/cluster-3n-independent/controller-n0.conf >independent_controller.log 2>&1 &

#130
nohup ./bin/mqcontroller -c /home/chirs/rocketmq/rocketmq-all-5.0.0-bin-release/conf/controller/cluster-3n-independent/controller-n1.conf >independent_controller.log 2>&1 &

#131
nohup ./bin/mqcontroller -c /home/chirs/rocketmq/rocketmq-all-5.0.0-bin-release/conf/controller/cluster-3n-independent/controller-n2.conf >independent_controller.log 2>&1 &

启动Broker:

1
2
3
4
5
6
7
8
#129
nohup ./bin/mqbroker -c /home/chirs/rocketmq/rocketmq-all-5.0.0-bin-release/conf/controller/cluster-3n-independent/broker-a.conf >dledger_broker.log 2>&1 &

#130
nohup ./bin/mqbroker -c /home/chirs/rocketmq/rocketmq-all-5.0.0-bin-release/conf/controller/cluster-3n-independent/broker-s1.conf >dledger_broker.log 2>&1 &

#131
nohup ./bin/mqbroker -c /home/chirs/rocketmq/rocketmq-all-5.0.0-bin-release/conf/controller/cluster-3n-independent/broker-s2.conf >dledger_broker.log 2>&1 &

查看是否启动

image-20231109233721406

控制台查看集群信息

image-20231110214932933

关闭Master,验证是否可以自动切换

1
2
#129节点执行
./bin/mqshutdown broker

控制台再次查看集群信息

131节点重新变为Master

image-20231110215601834

启动129节点的Broker,再次查看控制台,129节点变成了Slave

image-20231110215737295

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信