美文网首页RocketMq学习
RocketMQ:搭建集群

RocketMQ:搭建集群

作者: Anbang713 | 来源:发表于2020-08-12 21:04 被阅读0次

    在上一篇《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 集群工作流程

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

    3.3 服务器环境

    主机名 主机ip 角色(端口)
    node1 192.168.1.19 rocketmq-ns1(9876)
    rocketmq-bs-m1(10911)
    node2 192.168.1.20 rocketmq-ns2(9876)
    rocketmq-bs-m2(10911)
    rocketmq-bs-s1(11011)
    node3 192.168.1.21 rocketmq-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进入控制台界面了,如下图:

    相关文章

      网友评论

        本文标题:RocketMQ:搭建集群

        本文链接:https://www.haomeiwen.com/subject/njamdktx.html