生产级实践之集群搭建方案系列-RocketMQ集群安装搭建与配置

1. 目标

  • 实现RokcetMQ双主双从异步模式部署并理解其他集群部署模式。

2. 脉络

  • 介绍RocketMQ集群模式
  • 了解RocketMQ消息持久化机制
  • RocketMQ集群部署规划
  • RocketMQ集群安装
  • RocketMQ集群配置
  • RocketMQ集群服务启动
  • Rocket Console 控制台安装与启动

3. 知行

3.1 RocketMQ集群模式介绍

之前我们已经介绍过RocketMQ单节点的安装使用, 对于大数据量高性能要求的场景,单节点容易产生瓶颈, 无法满足需要, 这个时候可以采用RocketMQ集群模式,通过扩展多个节点, 分解单机压力瓶颈, 提升整体吞吐能力。

生产级实践之集群搭建方案系列-RocketMQ集群安装搭建与配置_第1张图片
官方推荐了三种集群方式(官方给出了三种集群的配置参考文件, 在 $ROCKETMQ_HOME/conf配置目录下):

3.1.1 双主或多主模式(2m-noslave)

所有节点全是Master,没有Slave, 但必须最少2个主节点。

优点: 配置简便, 单个节点故障对集群使用无影响, 因为不需要主从同步复制,减少开销, 性能最高。

缺点: 单台机器宕机期间 , 会导致该节点未被消费的消息在在节点恢复前不可订阅。

3.1.2 多主多从异步模式(2m-2s-async)

每个主节点跟随一个从节点, 由多对主从节点组成整个集群, HA数据采用异步复制方式 , 主从有短暂消息延迟, 但是毫秒级别。

优点: 主节点出现故障, 不影响消息的订阅, 消费者仍可以从Slave节点继续消费, 由于数据采用异步同步模式, 消息实时性不会受影响, 性能与多主模式几乎一样。

缺点: 主节如果突然宕机, 磁盘受损情况, 会存在消息丢失的可能。

3.1.3 多主多从同步模式(2m-2s-sync)

每个主节点跟随一个从节点, 由多对主从节点组成整个集群, HA数据采用同步复制方式, 只有主备都写入成功, 才会返回成功。

优点:基于数据同步处理模式, 服务的可用性与数据可用性都非常高。

缺点:性能比异步复制模式略低,大约低10%左右。

3.2 RocketMQ消息持久化机制

Disk Flush(磁盘刷新/同步操作), 将内存的数据落地,存储在磁盘中。RocketMQ提供了以下两种模式:

  • SYNC_FLUSH(同步刷盘):

    生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。

  • ASYNC_FLUSH(异步刷盘):

    生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种处理机制:

    一是定期将缓存中更新的数据进行刷盘; 二是当缓存中更新的数据条数达到某一设定值后进行刷盘,这种方式会存在消息丢失(在还未来得及同步到磁盘的时候宕机),但是性能很好。 默认是采用这种模式。

3.3 RocketMQ集群部署规划

准备四台虚拟机:

10.10.20.28: 1号主节点、NameServer1(9876)。

10.10.20.29: 1号从节点、NameServer2(9876)。

10.10.20.30: 2号主节点、Rocket Console(8080)。

10.10.20.32: 2号从节点。

3.4 RocketMQ集群安装

  1. 下载安装包

    Rocket MQ 4.4安装包

    如果不能下载, 换用其他地址:

    https://mirrors.cloud.tencent.com/apache/rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip

  2. 解压

    unzip -qo rocketmq-all-4.4.0-bin-release.zip
    
  3. 修改启动配置

    如果用的RocketMQ 4.X版本, 建议使用JDK1.8版本, 避免有些JVM参数不支持。

    • 修改name server启动配置

      vi bin/runserver.sh
      

      修改内容:

      # 指定JDK1.8的路径, 如果在系统环境变量中已设置, 可以不用修改此项
      export JAVA_HOME=/usr/local/jdk1.8.0_181
      # 启动内存设置, 如在虚拟机在本地, 建议将内存设置小一些, 节省资源
      JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
      
    • 修改broker server启动配置:

      vi bin/runbroker.sh 
      

      修改内容:

      # 指定JDK1.8的路径, 如果在系统环境变量中已设置, 可以不用修改此项
      export JAVA_HOME=/usr/local/jdk1.8.0_181
      # 启动内存设置, 如在虚拟机在本地, 建议将内存设置小一些, 节省资源
      JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn512m"
      
    • 修改tools工具内存配置:

      vi bin/tools.sh
      

      修改内容:

      # 指定JDK1.8的路径, 如果在系统环境变量中已设置, 可以不用修改此项
      export JAVA_HOME=/usr/local/jdk1.8.0_181
      # 启动内存设置, 如在虚拟机在本地, 建议将内存设置小一些, 节省资源
      JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
      
  4. 在部署的四台节点机器上, 分别进行安装配置。

3.5 RocketMQ集群配置

这里我们采用的是双主双从异步模式,RocketMQ官方帮我们内置了配置文件, 我们可以直接采用内置文件启动, 也可以根据需要做些调整修改, Broker 配置详解:

参数名 默认值 说明
listenPort 10911 Broker对外服务的监听端口
namesrvAddr Null NameServer地址
brokerIP1 本机IP 本机ip地址,默认系统自动识别,但是某些多网卡机器会存在识别错误的情况,这种情况下可以人工配置
brokerName 本机主机名
brokerClusterName DefaultCluster Broker所属那个集群
brokerId 0 BrokerId,必须是大于等于0的整数,0表示Master, 大于0表示Slave, 一个Master可以挂多个Slave,Master和Slave通过BrokerName来配对
storePathCommitLog $HOME/store/commitlog commitLog存储路径
storePathConsumerQueue $HOME/store/consumequeue 消费队列存储路径
storePathIndex $HOME/store/index 消息索引存储队列
deleteWhen 4 删除时间点,默认凌晨4点
fileReserverdTime 48 文件保留时间,默认48小时
maxTransferBytesOnMessageInMemory 262144 单次pull消息(内存)传输的最大字节数
maxTransferCountOnMessageInMemory 32 单次pull消息(内存)传输的最大条数
maxTransferBytesOnMessageInDisk 65535 单次Pull消息(磁盘)传输的最大字节数
maxTransferCountOnMessageInDisk 8 单次pull消息(磁盘)传输的最大条数
messageIndexEnable TRUE 是否开启消息索引功能
messageIndexSafe FALSE 是否提供安全的消息索引机制,索引保证不丢
brokerRole ASYNC_MASTER Broker的角色:ASYNC_MASTER异步复制Master; SYNC_MASTER同步双写MASTER; SLAVE
flushDiskType ASYNC_FLUSH 刷盘方式: ASYNC_FLUSH异步刷盘;SYNC_FLUSH同步刷盘clientFileForciblyEnable

修改broker配置文件, 只修改namesrvAddr参数, 其他按默认值处理:

进入10.10.20.28机器, 查看对应配置:

vi /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties 

注意, 根据双主双从配置, 每个节点的配置文件名称不一样, 不要修改错误:

10.10.20.28 对应配置文件: broker-a.properties

10.10.20.29 对应配置文件: broker-a-s.properties

10.10.20.30 对应配置文件: broker-b.properties

10.10.20.32 对应配置文件: broker-b-s.properties

broker-a.properties 配置内容示例:

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# Namer Server服务地址, 多个以”;“分号隔离
namesrvAddr=10.10.20.28:9876;10.10.20.29:9876

3.6 启动集群服务

3.6.1 启动Name服务

  1. 在10.10.20.28节点,启动第一个Name Server

    nohup /usr/local/rocketmq4.3.2/bin/mqnamesrv >/dev/null 2>&1 & 
    

    查看进程:

    [root@localhost rocketmq4.3.2]# ps -ef | grep namesrv
    root       7214      1  0 04:54 ?        00:00:00 /bin/sh bin/mqnamesrv
    root       7218   7214  0 04:54 ?        00:00:00 sh /usr/local/rocketmq4.3.2/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup
    
  2. 在10.10.20.29节点, 启动第二个Name Server

    nohup /usr/local/rocketmq4.3.2/bin/mqnamesrv >/dev/null 2>&1 & 
    

    查看进程

    [root@localhost rocketmq4.3.2]# ps -ef | grep namesrv
    root      24958      1  0 17:11 ?        00:00:00 /bin/sh bin/mqnamesrv
    root      24962  24958  0 17:11 ?        00:00:00 sh /usr/local/rocketmq4.3.2/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup
    

    检查日志:

    less ~/logs/rocketmqlogs/namesrv.log 
    

3.6.2 启动Broker服务

上面我们在每个Broker节点上, 都配置好了Name Server地址, 现在可以直接启动Broker服务。

  1. 在10.10.20.28, 启动1号主节点服务:

    nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
    

    查看进程:

    [root@localhost rocketmq4.3.2]# ps -ef | grep broker
    root       8034   8012  0 10:27 pts/2    00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties
    root       8038   8034  0 10:27 pts/2    00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties
    
  2. 在10.10.20.29, 启动1号从节点服务:

    nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a-s.properties > /dev/null 2>&1 &
    

    查看进程:

    [root@localhost rocketmq4.3.2]# ps -ef | grep broker
    root      40260  39833  0 22:25 pts/1    00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a-s.properties
    root      40265  40260  0 22:25 pts/1    00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a-s.properties
    
  3. 在10.10.20.30, 启动2号主节点服务:

    nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b.properties > /dev/null 2>&1 &
    

    查看进程:

    [root@localhost rocketmq_console]# ps -ef | grep broker
    root       1270   1245  0 04:19 pts/0    00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b.properties
    root       1274   1270  0 04:19 pts/0    00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b.properties
    
  4. 在10.10.20.32, 启动2号从节点服务:

    nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b-s.properties > /dev/null 2>&1 &
    

    查看进程:

    [root@localhost 2m-2s-async]# ps -ef | grep broker
    root       1250   1232  0 04:30 pts/0    00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b-s.properties
    root       1254   1250  0 04:30 pts/0    00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b-s.properties
    

3.7 Rocket Console服务安装与启动

  1. 下载地址

    Rocket Console 控制台

  2. 在10.10.20.30

  3. 解压

    mkdir -p /usr/local/rocket_console
    unzip rocketmq-console-1.0.0.zip
    
  4. MAVEN打包 (编译源码)

    如果采用安装包, 可以不需要编译, 跳过此步骤。

    如果没有maven环境, 通过yum安装

    yum -y install maven
    

    进入安装目录, 执行打包命令:

    mvn clean package -Dmaven.test.skip=true
    

    打包成功后, target目录下会生成rocketmq-console-ng-1.0.0.jar文件。

  5. 创建配置文件

    新建application.properties配置文件与jar包放到同一目录:

    vi /usr/local/rocketmq_console/application.properties 
    

    配置信息:

    server.port=8080
    rocketmq.config.namesrvAddr=10.10.20.28:9876;10.10.20.29:9876
    
  6. 启动控制台服务

    nohup java -jar /usr/local/rocketmq_console/rocketmq-console-ng-1.0.0.jar > /dev/null 2>&1 &
    
  7. 查看集群状态

    访问地址: http://10.10.20.30:8080/#/cluster
    生产级实践之集群搭建方案系列-RocketMQ集群安装搭建与配置_第2张图片

    我们可以看到存在4个节点, 两主两从, 显示的IP地址与集群部署规划一致。

  8. 应用服务的连接配置

    以Spring Boot工程为例, 修改工程配置文件bootstrap.yml:

    spring:
      stream:     
        rocketmq:
          binder:
            #RocketMQ Name Server地址, 集群多个地址以”;"分号隔离
            name-server: 10.10.20.28:9876;10.10.20.29:9876
    

4. 合一

  • 这里介绍了RocketMQ所支持的集群部署模式,生产级方案建议采用双主双从异步部署模式, 具备了高可用与高性能特性, 如果对数据的稳定性,一致性要求极高, 可以采用双主双从同步部署模式+RAID磁盘阵列的方式。在实际应用当中, 还有很多细节配置, 比如文件保留时间, 如果数据消费能力较慢, 保留时间就要设置长一些,否则可能出现数据过期丢失问题,所列出的集群配置参数,大家可以多仔细查阅理解,结合实际应用场景, 做出最优配置。

未经本人同意, 请勿随意转载! 相逢是缘, 希望对大家有所帮助, 谢谢!

如需获取最新技术资讯或交流, 请关注:
在这里插入图片描述

你可能感兴趣的:(生产级实践)