消息队列之RocketMQ集群部署
1
在多master模式的基础上,每个master节点都有至少一个对应的slave。
master节点可读可写,但是slave只能读不能写,类似于mysql的主从模式。
优点:在master宕机时,消费者可以从slave读取消息,消息的实时性不会受影响,性能几乎和多master一样。
缺点:使用异步复制的同步方式有可能会有消息丢失的问题。
同多master多slave异步复制模式类似,区别在于master和slave之间的数据同步方式。 优点:同步双写的同步模式能保证数据不丢失。 缺点:发送单个消息RT会略长,性能相比异步复制低10%左右。 刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储) 同步方式:同步双写和异步复制(指的一组master和slave之间数据的同步) **注意:**要保证数据可靠,需要采用同步刷盘和同步双写的方式,但性能会较其他方式低。
优点:所有模式中性能最高
缺点:单个master节点宕机期间,未被消费的消息在节点恢复之前不可用,消息的实时性就受到影响。
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配置决定。
集群的工作流程
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.1 服务器环境
linux版本:debian10
JDK版本:1.8
主机环境:
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)
#下载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
#使用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