• RocketMQ--Dledger集群搭建


    引言:一直以来,在多地多中心的消息发送场景下,如何保障数据的完整性和一致性是一个技术难点。

    一、Dledger

    概念

    Dledger 作为一个轻量级的 Java Library,它的作用就是将 Raft 有关于算法方面的内容全部抽象掉,开发人员只需要关心业务即可

    在 RocketMQ 4.5 版本之前,RocketMQ 只有 Master/Slave 一种部署方式,一组 broker 中有一个 Master ,有零到多个
    Slave,Slave 通过同步复制或异步复制的方式去同步 Master 数据。Master/Slave 部署模式,提供了一定的高可用性。
    但这样的部署模式,有一定缺陷。比如故障转移方面,如果主节点挂了,还需要人为手动进行重启或者切换,无法自动将一个从节点转换为主节点。因此,我们希望能有一个新的多副本架构,去解决这个问题。

    新的多副本架构首先需要解决自动故障转移的问题,本质上来说是自动选主的问题。这个问题的解决方案基本可以分为两种:

    利用第三方协调服务集群完成选主,比如 zookeeper 或者 etcd。这种方案会引入了重量级外部组件,加重部署,运维和故障诊断成本,比如在维护 RocketMQ 集群还需要维护 zookeeper 集群,并且 zookeeper 集群故障会影响到 RocketMQ 集群。
    利用 raft 协议来完成一个自动选主,raft 协议相比前者的优点是不需要引入外部组件,自动选主逻辑集成到各个节点的进程中,节点之间通过通信就可以完成选主。
    因此最后选择用 raft 协议来解决这个问题,而 DLedger 就是一个基于 raft 协议的 commitlog 存储库,也是 RocketMQ 实现新的高可用多副本架构的关键。

    二、RocketMQ基于Dledger的集群服务搭建

    2.1 构建集群环境

    该集群至少三台服务器

    服务器说明:(生产中应该将 NameServer 部署到其他服务器中,在这为了方便,与Broker部署在一起)

    服务器IP安装的服务
    服务器1-主192.168.161.11DLedger,Broker,NameServer
    服务器2-从192.168.161.12DLedger,Broker,NameServer
    服务器3-从192.168.161.13DLedger,Broker,NameServer

    Java环境:
    在这里插入图片描述
    maven库:

    在这里插入图片描述

    2.2 构建安装DLedger

    三台服务器同时进行

    [root@localhost opt]# git clone https://github.com/openmessaging/openmessaging-storage-dledger.git
    [root@localhost opt]# cd openmessaging-storage-dledger
    [root@localhost opt]# mvn clean install -DskipTests
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3 下载RocketMQ

    从 https://github.com/apache/rocketmq/releases 这里下载需要的RocketMQ版本

    [root@localhost opt]# unzip rocketmq-all-4.9.3-source-release.zip 
    [root@localhost opt]# cd rocketmq-all-4.9.3/
    [root@localhost  rocketmq-all-4.9.3]# mvn -Prelease-all -DskipTests clean install -U
    [root@localhost  rocketmq-all-4.9.3]# cd distribution/target/rocketmq-4.9.3/rocketmq-4.9.3/
    可以将该文件拷出
    cp rocketmq-all-4.9.3/distribution/target/rocketmq-4.9.3/rocketmq-4.9.3 /opt/rocketmq-4.9.3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2.4 服务器1配置-Master

    在这里插入图片描述

    vim conf/dledger/broker-n0.conf

    修改Broker配置

    ## 集群名
    brokerClusterName = RaftCluster
    ## broker组名,同一个RaftClusterGroup内,brokerName名要一样
    brokerName=RaftNode00
    ## 监听的端口
    listenPort=30911
    ## 你设置的NameServer地址和端口
    namesrvAddr=192.168.161.11:9876;192.168.161.12:9876;192.168.161.13:9876
    storePathRootDir=/tmp/rmqstore/node00
    storePathCommitLog=/tmp/rmqstore/node00/commitlog
    enableDLegerCommitLog=true
    dLegerGroup=RaftNode00
    ## n0 n1 n2 分别是broker1,broker2,broker3 的 dLegerSelfId
    ## 例如:dLegerPeers=n0-服务器1的IP:40911;n1-服务器2的IP:40912;n2-服务器3的IP:40913
    dLegerPeers=n0-192.168.161.11:40911;n1-192.168.161.12:40912;n2-192.168.161.13:40913
    ## must be unique
    ## 这个值必须是在同一个RaftClusterGroup内唯一的
    dLegerSelfId=n0
    sendMessageThreadPoolNums=16
    ## 由于我的虚拟机配置了多个网卡,所以会绑定ip错误,因此我配置了这项,
    brokerIP1=192.168.161.11
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    2.5 服务器2配置-slave

    vim conf/dledger/broker-n1.conf

    修改Broker配置

    brokerClusterName = RaftCluster
    brokerName=RaftNode00
    listenPort=30921
    namesrvAddr=192.168.161.11:9876;192.168.161.12:9876;192.168.161.13:9876
    storePathRootDir=/tmp/rmqstore/node01
    storePathCommitLog=/tmp/rmqstore/node01/commitlog
    enableDLegerCommitLog=true
    dLegerGroup=RaftNode00
    dLegerPeers=n0-192.168.161.11:40911;n1-192.168.161.12:40912;n2-192.168.161.13:40913
    ## must be unique
    dLegerSelfId=n1
    sendMessageThreadPoolNums=16
    brokerIP1=192.168.161.12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    2.6 服务器3配置-Slave

    vim conf/dledger/broker-n2.conf

    修改Broker配置

    brokerClusterName = RaftCluster
    brokerName=RaftNode00
    listenPort=30921
    namesrvAddr=192.168.161.11:9876;192.168.161.12:9876;192.168.161.13:9876
    storePathRootDir=/tmp/rmqstore/node01
    storePathCommitLog=/tmp/rmqstore/node01/commitlog
    enableDLegerCommitLog=true
    dLegerGroup=RaftNode00
    dLegerPeers=n0-192.168.161.11:40911;n1-192.168.161.12:40912;n2-192.168.161.13:40913
    ## must be unique
    dLegerSelfId=n2
    sendMessageThreadPoolNums=16
    brokerIP1=192.168.161.13
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    2.7 启动集群

    在服务器1 执行

    nohup sh bin/mqnamesrv > nohubNameserv &
    nohup sh bin/mqbroker  > nohubBroker -c conf/dledger/broker-n0.conf &
    
    • 1
    • 2

    在服务器2 执行

    nohup sh bin/mqnamesrv > nohubNameserv &
    nohup sh bin/mqbroker  > nohubBroker -c conf/dledger/broker-n1.conf &
    
    • 1
    • 2

    在服务器3 执行

    nohup sh bin/mqnamesrv > nohubNameserv &
    nohup sh bin/mqbroker  > nohubBroker -c conf/dledger/broker-n2.conf &
    
    • 1
    • 2

    查看集群服务是否启动成功

    在这里插入图片描述

    查看集群情况

    [root@localhost rocketmq-4.9.3]# sh bin/mqadmin clusterList -n 127.0.0.1:9876
    RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap).
    RocketMQLog:WARN Please initialize the logger system properly.
    #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
    RaftCluster       RaftNode00              0     192.168.161.11:30911   V4_9_3                   0.00(0,0ms)         0.00(0,0ms)          0 460185.53 0.3000
    RaftCluster       RaftNode00              2     192.168.161.12:30921   V4_9_3                   0.00(0,0ms)         0.00(0,0ms)          0 460185.53 0.4100
    RaftCluster       RaftNode00              3     192.168.161.13:30931   V4_9_3                   0.00(0,0ms)         0.00(0,0ms)          0 460185.53 0.1200
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.8 kill 主broker 并再次查看集群情况

    [root@localhost rocketmq-4.9.3]# sh bin/mqshutdown broker
    The mqbroker(30811) is running...
    Send shutdown request to mqbroker(30811) OK
    [root@localhost rocketmq-4.9.3]# sh bin/mqadmin clusterList -n 127.0.0.1:9876
    RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap).
    RocketMQLog:WARN Please initialize the logger system properly.
    #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
    RaftCluster       RaftNode00              0     192.168.161.12:30921   V4_9_3                   0.00(0,0ms)         0.00(0,0ms)          0 460185.66 0.4100
    RaftCluster       RaftNode00              3     192.168.161.13:30931   V4_9_3                   0.00(0,0ms)         0.00(0,0ms)          0 460185.66 0.1200
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Master切换成功

    在这里插入图片描述
    重新启动后原master服务器变为从

    在这里插入图片描述

    2.8备注

    Broker 配置
    参考文档:

    参数名默认值说明
    listenPort10911接受客户端连接的监听端口
    namesrvAddrnullnameServer 地址
    brokerIP1网卡的 InetAddress当前 broker 监听的 IP
    brokerIP2跟 brokerIP1 一样存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步
    brokerNamenullbroker 的名称
    brokerClusterNameDefaultCluster本 broker 所属的 Cluser 名称
    brokerId0broker id, 0 表示 master, 其他的正整数表示 slave
    storePathCommitLog$HOME/store/commitlog/存储 commit log 的路径
    storePathConsumerQueue$HOME/store/consumequeue/存储 consume queue 的路径
    mappedFileSizeCommitLog1024 * 1024 * 1024(1G)commit log 的映射文件大小
    deleteWhen04在每天的什么时间删除已经超过文件保留时间的 commit log
    fileReservedTime72以小时计算的文件保留时间
    brokerRoleASYNC_MASTERSYNC_MASTER/ASYNC_MASTER/SLAVE
    flushDiskTypeASYNC_FLUSHSYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在收到确认生产者之前将消息刷盘。ASYNC_FLUSH 模式下的 broker 则利用刷盘一组消息的模式,可以取得更好的性能。
    enableDLegerCommitLog是否启动 DLedgertrue
    dLegerGroupDLedger Raft Group的名字,建议和 brokerName 保持一致RaftNode00
    dLegerPeersDLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
    dLegerSelfId节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一n0
    sendMessageThreadPoolNums发送线程个数,建议配置成 Cpu 核数16

    2.9 启动内存不够

    修改 bin/runbroker.sh 和 bin/runserver.sh 中的

    JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g

    将参数调低 (可以改为别的值)

    JAVA_OPT=“${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m”

    报连接超时

    查看防火墙服务状态 systemctl status firewalld

    将防火墙关闭 systemctl stop firewalld

  • 相关阅读:
    尚医通(二)
    软件设计师:程序设计语言
    Bytebase 2.9.0 - 支持在工单创建前执行 SQL 审核
    我的新书《Android Jetpack开发:原理解析与应用实战》已出版
    HCNP Routing&Switching之组播技术-组播路由协议PIM
    宇泰(UTEK)5口全电口以太网交换机工业级导轨UT-LLDC-5TDS-24正品
    可视化领域 SVG
    Java项目:SSM二手汽车交易商城网站管理系统
    hitTest的基本用法
    视频编解码学习之一:理论基础
  • 原文地址:https://blog.csdn.net/L2111533547/article/details/125564421