RocketMQ:搭建集群

    技术2022-07-10  139

    在上一篇《RocketMQ:快速入门》之后,今天说一说如何搭建RocketMQ集群。首先看一下集群架构图:

    1. 集群特点

    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配置决定。

    2. 集群模式

    2.1 单Master模式

    这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,通常可以用于本地测试。我们在《RocketMQ:快速入门》搭建的就是单Master模式。

    2.2 多Master模式

    一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:

    优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高。缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。

    2.3 多Master多Slave模式(异步)

    每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:

    优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样。缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

    2.4 多Master多Slave模式(同步)

    每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

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

    3. 双主双从同步双写集群搭建

    3.1 总体架构

    3.2 集群工作流程

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

    3.3 服务器环境

    主机名主机ip角色(端口)node1192.168.1.19rocketmq-ns1(9876)rocketmq-bs-m1(10911)node2192.168.1.20rocketmq-ns2(9876)rocketmq-bs-m2(10911)rocketmq-bs-s1(11011)node3192.168.1.21rocketmq-ns3(9876)rocketmq-bs-s2(10911)rockermq-console(8080)

    3.4 修改host配置

    使用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

    3.5 防火墙配置

    宿主机需要远程访问虚拟机的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

    3.6 配置环境变量

    使用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

    3.7 创建消息存储路径

    # node1 mkdir /usr/local/rocketmq/store/master1 mkdir /usr/local/rocketmq/store/master1/commitlog mkdir /usr/local/rocketmq/store/master1/consumequeue mkdir /usr/local/rocketmq/store/master1/index # node2 mkdir /usr/local/rocketmq/store/master2 mkdir /usr/local/rocketmq/store/master2/commitlog mkdir /usr/local/rocketmq/store/master2/consumequeue mkdir /usr/local/rocketmq/store/master2/index mkdir /usr/local/rocketmq/store/master1-slave1 mkdir /usr/local/rocketmq/store/master1-slave1/commitlog mkdir /usr/local/rocketmq/store/master1-slave1/consumequeue mkdir /usr/local/rocketmq/store/master1-slave1/index # node3 mkdir /usr/local/rocketmq/store/master2-slave1 mkdir /usr/local/rocketmq/store/master2-slave1/commitlog mkdir /usr/local/rocketmq/store/master2-slave1/consumequeue mkdir /usr/local/rocketmq/store/master2-slave1/index

    3.8 Broker配置文件

    3.8.1 master1的配置

    服务器: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

    3.8.2 master1-slave1的配置

    服务器: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

    3.8.3 master2的配置

    服务器: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

    3.8.4 master2-slave1的配置

    服务器: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

    3.9 修改启动脚本

    根据实际情况,修改/bin/runbroker.sh和/bin/runserver.sh脚本的JVM参数,参考配置如下:

    JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

    3.10 启动服务

    3.10.1 启动NameServer集群

    分别在三台机器上启动NameServer服务:

    nohup sh bin/mqnamesrv &

    3.10.2 启动Broker集群

    在node1上启动master1: nohup sh bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master1.properties & 在node2上启动master1-slave1和master2 nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master1-slave1.properties & nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master2.properties & 在node3上启动master2-slave1 nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master2-slave1.properties &

    3.11 查看进程状态

    启动后通过jps命令查看进程状态,至此一个双主双从,同步双写的集群搭建完成。

    4. 集群监控平台搭建

    4.1 概述

    RocketMQ有一个对其扩展的开源项目rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,这个便是管理控制台项目了,先将rocketmq-externals拉到本地,因为我们需要自己对rocketmq-console进行编译打包运行。

    4.2 下载并编译打包

    下载地址: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—— 更多精彩分享,可扫码关注微信公众号哦。

    Processed: 0.009, SQL: 9