1 RocketMQ集群搭建

1.1 RocketMQ集群的三种配置模式

1.1.1 2m-2s-async(主从异步)

在多master模式的基础上,每个master节点都有至少一个对应的slave。

master节点可读可写,但是slave只能读不能写,类似于mysql的主从模式。

优点:在master宕机时,消费者可以从slave读取消息,消息的实时性不会受影响,性能几乎和多master一样。

缺点:使用异步复制的同步方式有可能会有消息丢失的问题。

1.1.2 2m-2s-sync(主从同步)

同多master多slave异步复制模式类似,区别在于master和slave之间的数据同步方式。

优点:同步双写的同步模式能保证数据不丢失。

缺点:发送单个消息RT会略长,性能相比异步复制低10%左右。

刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)

同步方式:同步双写和异步复制(指的一组master和slave之间数据的同步)

**注意:**要保证数据可靠,需要采用同步刷盘和同步双写的方式,但性能会较其他方式低。

1.1.3 2m-noslave(仅master)

多个master节点组成集群,单个master节点宕机或者重启对应用没有影响。

优点:所有模式中性能最高

缺点:单个master节点宕机期间,未被消费的消息在节点恢复之前不可用,消息的实时性就受到影响。

注意:使用同步刷盘可以保证消息不丢失,同时Topic相对应的queue应该分布在集群中各个节点,而不是只在某节点上,否则,该节点宕机会对订阅该Topic的应用造成影响。

2 集群特点

- NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
- Broker部署相对复杂,Broker分为master和slave,一个master可以对应多个slave,但是一个slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的Brokerid来定义,Brokerid为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Nameserver集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。
- Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
- Consumer与NameServer集群中的其中一个节点(随机)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅信息,也可以从Slave订阅信息,订阅规则由Broker配置决定。

3 集群的工作流程

1. 启动NameServer,NameServer起来后监听端口,等待Broker,Producer、Consumer连上来,相当于一个路由控制中心。
2. Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topice跟Broker的映射关系。
3. 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
4. Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
5. Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。

4 集群搭建

4.1 服务器环境

linux版本:debian10

RocketMQ版本:4.9.0

JDK版本:1.8

主机环境:

rocketmq 集群 docker rocketmq 集群同步_配置文件

4.2 部署java环境

注意:每台机器都需要部署java环境

#创建java的目录
mkdir -p /apps/java
#将下载好的文件传到目录下解压
tar xvf jdk-8u271-linux-x64.tar.gz
#创建软链接
ln -sv jdk1.8.0_271/ jdk
#配置环境变量
vim /etc/profile.d/java.sh
#java环境变量
export JAVA_HOME=/apps/java/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#同步文件
source /etc/profile.d/java.sh
#测试java环境变量是否配置成功
root@ubuntu-40:/apps# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

4.3 部署RocketMQ集群

注意:本次安装采用2m-2s-async模式

#下载RocketMQ包
root@ubuntu-10:/apps/rocketMQ# wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.9.0/rocketmq-all-4.9.0-bin-release.zip
#解压
root@ubuntu-10:/apps/rocketMQ# unzip rocketmq-all-4.9.0-bin-release.zip

#设置RockerMQ的环境变量
vim /etc/profile.d/rocketmq.sh
#rocketmq环境变量
export ROCKETMQ_HOME=/apps/rocketmq/rocketmq-all-4.9.0-bin-release
export PATH=$ROCKETMQ_HOME/bin:$PATH
#同步环境变量
source /etc/profile.d/rocketmq.sh
#创建RocketMQ的消息存储路径
mkdir -p /data/rocketmq/mstore/{commitlog,consumequeue,index,checkpoint,abort}

master1配置文件

#编辑10.0.0.10上的Master Broker的配置文件broker-a.properties
root@debian10-10:~# vim /apps/rocketmq/rocketmq-all-4.9.0-bin-release/conf/2m-2s-async/broker-a.properties

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=ASYNC_MASTER
#nameServer地址,分号分割
namesrvAddr=10.0.0.10:9876;10.0.0.20:9876
#配置外网连接地址
brokerIP1 = 10.0.0.10
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
#storePathRootDir=/data/rocketmq/mstore
#commitLog 存储路径
#storePathCommitLog=/data/rocketmq/mstore/commitlog
#消费队列存储路径存储路径
#storePathConsumeQueue=/data/rocketmq/mstore/consumequeue
#消息索引存储路径
#storePathIndex=/data/rocketmq/mstore/index
#checkpoint 文件存储路径
#storeCheckpoint=/data/rocketmq/mstore/checkpoint
#abort 文件存储路径
#abortFile=/data/rocketmq/mstore/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

slave1配置文件

#编辑10.0.0.30上的Master Broker的配置文件broker-a-s.properties
root@debian10-30:~# vim /apps/rocketmq/rocketmq-all-4.9.0-bin-release/conf/2m-2s-async/broker-a-s.properties

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=SLAVE
#nameServer地址,分号分割
namesrvAddr=10.0.0.10:9876;10.0.0.20:9876
#配置外网连接地址
brokerIP1 = 10.0.0.30
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
#storePathRootDir=/data/rocketmq/mstore
#commitLog 存储路径
#storePathCommitLog=/data/rocketmq/mstore/commitlog
#消费队列存储路径存储路径
#storePathConsumeQueue=/data/rocketmq/mstore/consumequeue
#消息索引存储路径
#storePathIndex=/data/rocketmq/mstore/index
#checkpoint 文件存储路径
#storeCheckpoint=/data/rocketmq/mstore/checkpoint
#abort 文件存储路径
#abortFile=/data/rocketmq/mstore/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

master2配置文件

#编辑10.0.0.20上的Master Broker的配置文件broker-b.properties
root@debian10-20:~# vim /apps/rocketmq/rocketmq-all-4.9.0-bin-release/conf/2m-2s-async/broker-b.properties

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=ASYNC_MASTER
#nameServer地址,分号分割
namesrvAddr=10.0.0.10:9876;10.0.0.20:9876
#配置外网连接地址
brokerIP1 = 10.0.0.20
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
#storePathRootDir=/data/rocketmq/mstore
#commitLog 存储路径
#storePathCommitLog=/data/rocketmq/mstore/commitlog
#消费队列存储路径存储路径
#storePathConsumeQueue=/data/rocketmq/mstore/consumequeue
#消息索引存储路径
#storePathIndex=/data/rocketmq/mstore/index
#checkpoint 文件存储路径
#storeCheckpoint=/data/rocketmq/mstore/checkpoint
#abort 文件存储路径
#abortFile=/data/rocketmq/mstore/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

slave2配置文件

#编辑10.0.0.40上的Master Broker的配置文件broker-b-s.properties
root@debian10-40:~# vim /apps/rocketmq/rocketmq-all-4.9.0-bin-release/conf/2m-2s-async/broker-b-s.properties

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=SLAVE
#nameServer地址,分号分割
namesrvAddr=10.0.0.10:9876;10.0.0.20:9876
#配置外网连接地址
brokerIP1 = 10.0.0.40
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
#storePathRootDir=/data/rocketmq/mstore
#commitLog 存储路径
#storePathCommitLog=/data/rocketmq/mstore/commitlog
#消费队列存储路径存储路径
#storePathConsumeQueue=/data/rocketmq/mstore/consumequeue
#消息索引存储路径
#storePathIndex=/data/rocketmq/mstore/index
#checkpoint 文件存储路径
#storeCheckpoint=/data/rocketmq/mstore/checkpoint
#abort 文件存储路径
#abortFile=/data/rocketmq/mstore/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

4.4 使用mqadmin命令查看集群

#使用mqadmin 查看集群状态
root@debian10-10:/apps/rocketmq/rocketmq-all-4.9.0-bin-release/bin# /apps/rocketmq/rocketmq-all-4.9.0-bin-release/bin/mqadmin clusterList -n 10.0.0.10:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
rocketmq-cluster  broker-a                0     10.0.0.10:10911        V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 451592.87 -1.0000
rocketmq-cluster  broker-a                1     10.0.0.30:11011        V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 451592.87 0.2818
rocketmq-cluster  broker-b                0     10.0.0.20:10911        V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 451592.87 -1.0000
rocketmq-cluster  broker-b                2     10.0.0.40:11011        V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 451592.87 0.2887

4.5 使用rocketMQ-console查看集群状态

rocketmq 集群 docker rocketmq 集群同步_长连接_02