栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RocketMQ--Dledger集群搭建

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RocketMQ--Dledger集群搭建

文章目录
  • 一、Dledger
    • 概念
  • 二、RocketMQ基于Dledger的集群服务搭建
    • 2.1 构建集群环境
    • 2.2 构建安装DLedger
    • 2.3 下载RocketMQ
    • 2.4 服务器1配置-Master
    • 2.5 服务器2配置-slave
    • 2.6 服务器3配置-Slave
    • 2.7 启动集群
    • 2.8 kill 主broker 并再次查看集群情况
    • 2.8备注
    • 2.9 启动内存不够

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

一、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

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

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

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

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

2.7 启动集群

在服务器1 执行

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

在服务器2 执行

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

在服务器3 执行

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

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

查看集群情况

[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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号