在上一篇《RocketMQ:快速入门》之后,今天说一说如何搭建RocketMQ集群。首先看一下集群架构图:
这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,通常可以用于本地测试。我们在《RocketMQ:快速入门》搭建的就是单Master模式。
一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:
优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高。缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样。缺点:Master宕机,磁盘损坏情况下会丢失少量消息。每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。使用vim命令编辑/etc/hosts文件,添加以下配置:
##################### begin rocketmq ##################### # nameserver 192.168.1.19 rocketmq-ns1 192.168.1.20 rocketmq-ns2 192.168.1.21 rocketmq-ns3 # broker 192.168.1.19 rocketmq-bs-m1 192.168.1.20 rocketmq-bs-m2 rocketmq-bs-s1 192.168.1.21 rocketmq-bs-s2 ##################### end rocketmq #####################配置完成后,重启网卡:
systemctl restart network宿主机需要远程访问虚拟机的rocketmq服务和web服务,需要开放相关的端口号,简单粗暴的方式是直接关闭防火墙。
# 关闭防火墙 systemctl stop firewalld.service # 查看防火墙的状态 firewall-cmd --state # 禁止firewall开机启动 systemctl disable firewalld.service或者为了安全,只开放特定的端口号,RocketMQ默认使用3个端口:9876 、10911 、11011 。如果防火墙没有关闭的话,那么防火墙就必须开放这些端口:
nameserver 默认使用 9876 端口master 默认使用 10911 端口slave 默认使用11011 端口执行以下命令:
# 开放name server默认端口 firewall-cmd --remove-port=9876/tcp --permanent # 开放master默认端口 firewall-cmd --remove-port=10911/tcp --permanent # 开放slave默认端口 (当前集群模式可不开启) firewall-cmd --remove-port=11011/tcp --permanent # 重启防火墙 firewall-cmd --reload使用vim命令编辑/etc/profile文件,添加以下配置:
# rocketmq env export ROCKETMQ_HOME=/usr/local/rocketmq/rocketmq-all-4.4.0-bin-release export PATH=$PATH:$ROCKETMQ_HOME/bin配置完成后,生效配置:
source /etc/profile服务器:node1(192.168.1.19)
vim /usr/local/rocketmq/conf/2m-2s-sync/master1.properties配置如下:
#所属集群名字 brokerClusterName=rocketmq-cluster #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a #0 表示 Master,>0 表示 Slave brokerId=0 #nameServer地址,多个之间用分号分割 namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876 #在发送消息时,自动创建服务器不存在的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=/usr/local/rocketmq/store/master1 #commitLog 存储路径 storePathCommitLog=/usr/local/rocketmq/store/master1/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/usr/local/rocketmq/store/master1/consumequeue #消息索引存储路径 storePathIndex=/usr/local/rocketmq/store/master1/index #checkpoint 文件存储路径 storeCheckpoint=/usr/local/rocketmq/store/master1/checkpoint #abort 文件存储路径 abortFile=/usr/local/rocketmq/store/master1/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=SYNC_MASTER #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=SYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128服务器:node2(192.168.1.20)
vim /usr/local/rocketmq/conf/2m-2s-sync/master1-slave1.properties配置如下:
#所属集群名字 brokerClusterName=rocketmq-cluster #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a #0 表示 Master,>0 表示 Slave brokerId=1 #nameServer地址,分号分割 namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876 #在发送消息时,自动创建服务器不存在的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=/usr/local/rocketmq/store/master1-slave1 #commitLog 存储路径 storePathCommitLog=/usr/local/rocketmq/store/master1-slave1/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/usr/local/rocketmq/store/master1-slave1/consumequeue #消息索引存储路径 storePathIndex=/usr/local/rocketmq/store/master1-slave1/index #checkpoint 文件存储路径 storeCheckpoint=/usr/local/rocketmq/store/master1-slave1/checkpoint #abort 文件存储路径 abortFile=/usr/local/rocketmq/store/master1-slave1/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=SLAVE #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128服务器:node2(192.168.1.20)
vim /usr/local/rocketmq/conf/2m-2s-sync/master2.properties配置如下:
#所属集群名字 brokerClusterName=rocketmq-cluster #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-b #0 表示 Master,>0 表示 Slave brokerId=0 #nameServer地址,分号分割 namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876 #在发送消息时,自动创建服务器不存在的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 #存储路径(注意,如果在一台机器上启动多个broker,这个路径要区分开) storePathRootDir=/usr/local/rocketmq/store/master2 #commitLog 存储路径 storePathCommitLog=/usr/local/rocketmq/store/master2/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/usr/local/rocketmq/store/master2/consumequeue #消息索引存储路径 storePathIndex=/usr/local/rocketmq/store/master2/index #checkpoint 文件存储路径 storeCheckpoint=/usr/local/rocketmq/store/master2/checkpoint #abort 文件存储路径 abortFile=/usr/local/rocketmq/store/master2/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=SYNC_MASTER #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=SYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128服务器:node3(192.168.1.21)
vim /usr/local/rocketmq/conf/2m-2s-sync/master2-slave1.properties配置如下:
#所属集群名字 brokerClusterName=rocketmq-cluster #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-b #0 表示 Master,>0 表示 Slave brokerId=1 #nameServer地址,分号分割 namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876 #在发送消息时,自动创建服务器不存在的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=/usr/local/rocketmq/store/master2-slave1 #commitLog 存储路径 storePathCommitLog=/usr/local/rocketmq/store/master2-slave1/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/usr/local/rocketmq/store/master2-slave1/consumequeue #消息索引存储路径 storePathIndex=/usr/local/rocketmq/store/master2-slave1/index #checkpoint 文件存储路径 storeCheckpoint=/usr/local/rocketmq/store/master2-slave1/checkpoint #abort 文件存储路径 abortFile=/usr/local/rocketmq/store/master2-slave1/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=SLAVE #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128根据实际情况,修改/bin/runbroker.sh和/bin/runserver.sh脚本的JVM参数,参考配置如下:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"分别在三台机器上启动NameServer服务:
nohup sh bin/mqnamesrv &启动后通过jps命令查看进程状态,至此一个双主双从,同步双写的集群搭建完成。
RocketMQ有一个对其扩展的开源项目rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,这个便是管理控制台项目了,先将rocketmq-externals拉到本地,因为我们需要自己对rocketmq-console进行编译打包运行。
下载地址:https://github.com/apache/rocketmq-externals
注意:打包前在rocketmq-console中配置namesrv集群地址:
rocketmq.config.namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876编译打包:
git clone https://github.com/apache/rocketmq-externals cd rocketmq-console mvn clean package -Dmaven.test.skip=true在node3这台服务器上启动rocketmq-console:
java -jar rocketmq-console-ng-1.0.1.jar启动成功后,我们就可以通过浏览器访问http://192.168.1.21:8080进入控制台界面了,如下图:
——End—— 更多精彩分享,可扫码关注微信公众号哦。