RocketMQ集群搭建
ROcketMQ集群搭建有以下几种方案:
「单Master模式」
「多Master模式」
「多Master多Slave模式-异步复制」
「多Master多Slave模式-同步双写」
其中,
「单Master模式」风险较大,「一旦Broker重启或者宕机时,会导致整个服务不可用」。不建议线上环境使用,可以用于本地测试。
「多Master模式」,一个集群无Slave,全是Master,单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,「消息实时性会受到影响」。
「多Master-Slave异步复制模式」,即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时「Master宕机后,消费者仍然可以从Slave消费」,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样。Master宕机会丢失少量的信息。
「多Master-Slave同步双写模式」,数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高,「性能比异步复制模式略低」(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
我们采用多Master多Slave的异步复制模式来搭建RocketMQ集群。
架构图:
集群各个角色参考配置如下:
首先创建消息存储路径,RocketMQ获取到消息默认为 /home,我们可以修改消息存储路径:
mkdir ./store
mkdir ./store/commitlog
mkdir ./store/consumequeue
mkdir ./store/index
cd store/
ll
total 0
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 commitlog
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 consumequeue
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 index
接下来编辑/conf/broker.conf
#所属集群名称
brokerClusterName=DefaultCluster
#broker名字,同一组的master-slave中,broker名字相同
brokerName=broker-a
#brokerId的ID,0 表示Master,>0 表示Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#nameServer集群地址,如果是多个,使用分号;分割
namesrvAddr=10.11.12.223:9876;10.11.12.224:9876;10.11.12.227:9876;10.11.128:9876;
brokerIP1=10.11.12.223
#存储路径
storePathRootDir=/data/rocketmq-all-4.9.4-bin-release/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq-all-4.9.4-bin-release/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq-all-4.9.4-bin-release/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq-all-4.9.4-bin-release/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq-all-4.9.4-bin-release/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq-all-4.9.4-bin-release/store/abort
首先创建消息存储路径,RocketMQ获取到消息后,broker会默认将消息进行持久化,持久化目录默认为 /home,我们可以修改消息存储路径:
mkdir ./store
mkdir ./store/commitlog
mkdir ./store/consumequeue
mkdir ./store/index
cd store/
ll
total 0
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 commitlog
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 consumequeue
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 index
编辑/conf/broker.conf
#所属集群名称
brokerClusterName=DefaultCluster
#broker名字,同一组的master-slave中,broker名字相同
brokerName=broker-b
#brokerId的ID,0 表示Master,>0 表示Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#nameServer集群地址,如果是多个,使用分号;分割
namesrvAddr=10.11.12:9876;10.11.12:9876;10.11.12.227:9876;10.11.12.228:9876;
brokerIP1=10.11.12.224
#存储路径
storePathRootDir=/data/rocketmq-all-4.9.4-bin-release/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq-all-4.9.4-bin-release/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq-all-4.9.4-bin-release/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq-all-4.9.4-bin-release/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq-all-4.9.4-bin-release/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq-all-4.9.4-bin-release/store/abort
首先创建消息存储路径,RocketMQ获取到消息后,broker会默认将消息进行持久化,持久化目录默认为 /home,我们可以修改消息存储路径:
mkdir ./store
mkdir ./store/commitlog
mkdir ./store/consumequeue
mkdir ./store/index
cd store/
ll
total 0
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 commitlog
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 consumequeue
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 index
编辑/conf/broker.conf
#所属集群名称
brokerClusterName=DefaultCluster
#broker名字,同一组的master-slave中,broker名字相同
brokerName=broker-a
#brokerId的ID,0 表示Master,>0 表示Slave
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#nameServer集群地址,如果是多个,使用分号;分割
namesrvAddr=10.11.12.223:9876;10.11.12.224:9876;10.11.12.227:9876;10.11.12.228:9876;
brokerIP1=10.11.12.227
#存储路径
storePathRootDir=/data/rocketmq-all-4.9.4-bin-release/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq-all-4.9.4-bin-release/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq-all-4.9.4-bin-release/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq-all-4.9.4-bin-release/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq-all-4.9.4-bin-release/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq-all-4.9.4-bin-release/store/abort
首先创建消息存储路径,RocketMQ获取到消息后,broker会默认将消息进行持久化,持久化目录默认为 /home,我们可以修改消息存储路径:
mkdir ./store
mkdir ./store/commitlog
mkdir ./store/consumequeue
mkdir ./store/index
cd store/
ll
total 0
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 commitlog
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 consumequeue
drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 index
编辑/conf/broker.conf
所属集群名称
brokerClusterName=DefaultCluster
#broker名字,同一组的master-slave中,broker名字相同
brokerName=broker-b
#brokerId的ID,0 表示Master,>0 表示Slave
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#nameServer集群地址,如果是多个,使用分号;分割
namesrvAddr=10.11.12.223:9876;10.11.12.224:9876;10.11.12.227:9876;10.11.12.228:9876;
brokerIP1=10.11.12.228
#存储路径
storePathRootDir=/data/rocketmq-all-4.9.4-bin-release/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq-all-4.9.4-bin-release/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq-all-4.9.4-bin-release/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq-all-4.9.4-bin-release/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq-all-4.9.4-bin-release/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq-all-4.9.4-bin-release/store/abort
分区在4台机器上执行
#在223执行
nohup sh bin/mqnamesrv -n 10.11.12.223:9876 &
#在224执行
nohup sh bin/mqnamesrv -n 10.11.12.224:9876 &
#在227执行
nohup sh bin/mqnamesrv -n 10.11.12.227:9876 &
#在228执行
nohup sh bin/mqnamesrv -n 10.11.12.228:9876 &
tail -f ~/logs/rocketmqlogs/namesrv.log
分别在4台主机上执行
nohup sh bin/mqbroker -n '10.11.12.223:9876;110.11.12.224:9876;10.11.12.227:9876;10.11.12.228:9876;' -c conf/broker.conf autoCreateTopicEnable=true &
tail -f ~/logs/rocketmqlogs/broker.log
2022-08-21 22:54:11 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2022-08-21 22:54:11 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
2022-08-21 22:54:12 INFO brokerOutApi_thread_1 - register broker[0]to name server 10.11.12.223:9876 OK
2022-08-21 22:54:12 INFO brokerOutApi_thread_2 - register broker[0]to name server 10.11.12.224:9876 OK
2022-08-21 22:54:12 INFO brokerOutApi_thread_3 - register broker[0]to name server 10.11.12.227:9876 OK
2022-08-21 22:54:12 INFO brokerOutApi_thread_4 - register broker[0]to name server 10.11.12.228:9876 OK
jps
1761 BrokerStartup
1706 NamesrvStartup
1854 Jps
docker run -d -e "JAVA_OPTS=-Drocketmq.namesrv.addr=10.11.12.223:9876;10.11.12.224:9876;10.11.12.227:9876;10.11.12.228:9876
-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
--name rocketmq-console \
-p 8080:8080 \
-v /opt/software/rocketmq/rocketmq-console/logs:/root/logs \
-t apacherocketmq/rocketmq-dashboard:latest