1、Dledger高可用集群,为什么说是高可用的?
在Dledger集群中,不单独指定各个broker的服务,由这些broker服务自行进行选举,产⽣⼀个Leader角色的服务,响应客户端的各种请求。其他的broker服务,就作为Follower角色,负责对Leader上的数据进行备份。Follower所要负责的事情,比主从架构中的Slave角色会要复杂⼀点,因为这种节点选举是在后端不间断进行的,它们需要随时做好升级成Leader的准备。
Dledger集群的选举是通过Raft协议进⾏的,Raft协议是⼀种多数同意机制。也就是每次选举需要有集群中超过半数的节点确认,才能形成整个集群的共同决定。同时,也意味着在Dledger集群中,只要有超过半数的节点能够正常⼯作,整个集群就能正常⼯作。因此,在部署Dledger集群时,通常都是部署奇数台服务,就可以让集群的容错性达到最⼤。
整个集群结构如下图所示:
2、搭建Dledger高可用集群
2.1、环境准备
准备三台相同配置的Linux服务器【可用虚拟机代替】。
方便更清晰描述三台服务器的操作,给【每个服务器】指定一个host映射。
# 编辑命令
vim /etc/hosts
# IP地址为自己服务器的IP
192.168.242.50 rmq1
192.168.242.51 rmq2
192.168.242.52 rmq3
本次搭建,以RocketMQ默认配置dledger集群,将broker服务分别部署在不同服务器上。集群规划如下:
host映射 | NameServer服务部署 | Broker服务部署 |
---|---|---|
rmq1 | NameServer | broker-n0 |
rmq2 | NameServer | broker-n1 |
rmq3 | NameServer | broker-n2 |
2.2、部署nameServer服务
nameServer服务不需要做特别的配置,跟单机部署一样的步骤,在三台服务器上都分别部署nameServer服务即可。
# 三台的启动命令都一样
# 切换到RocketMQ运行包根目录
nohup mqnamesrv &
2.3、对Broker服务进⾏集群配置
在RocketMQ运⾏包的conf⽬录下,提供了多种集群的部署配置⽂件模板,不需要我们手动创建,只需在原来的基础做调整就好。
集群模式简介
- 2m-noslave: 2主⽆从的集群参考配置,存在单点故障。
- 2m-2s-async和2m-2s-sync: 2主2从的集群参考配置,主从不会自动切换。async和sync表示主从节点之间是同步或异步。
- dledger: 具备主从切换功能的⾼可⽤集群。集群中的节点会基于Raft协议随机选举出⼀个Leader,作⽤类似于Master节点。其他的节点都是follower,作⽤类似于Slave节点。
此次采用dledger的方式搭建集群,需要在三个服务器上修改这个目录下的配置⽂件。
rmq1的broker.conf配置示例
服务器:rmq1,路径:/conf/dledger/broker-n0.conf
,示例配置如下:
brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=rmq1:9876;rmq2:9876;rmq3:9876
storePathRootDir=/opt/apps/server/rocketmq/storeDledger/
storePathCommitLog=/opt/apps/server/rocketmq/storeDledger/commitlog
storePathConsumeQueue=/opt/apps/server/rocketmq/storeDledger/consumequeue
storePathIndex=/opt/apps/server/rocketmq/storeDledger/index
storeCheckpoint=/opt/apps/server/rocketmq/storeDledger/checkpoint
abortFile=/opt/apps/server/rocketmq/storeDledger/abort
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-rmq1:40911;n1-rmq2:40911;n2-rmq3:40911
# 值必须唯一
#【不同服务器的值,配置不一样,比如rmq2值为n1, rmq3值为n2】
dLegerSelfId=n0
sendMessageThreadPoolNums=16
对几个需要重点关注的配置项,做下说明:
- enableDLegerCommitLog: 是否启动Dledger。true表示启动
- namesrvAddr: 指定nameserver地址
- dLedgerGroup: Dledger Raft Group的名字,建议跟brokerName保持⼀致。
- dLedgerPeers: Dledger Group内各个服务节点的地址及端口信息。同⼀个Group内的各个节点配置必须要保持⼀致。
- dLedgerSelfId: Dledger节点ID,必须属于dLedgerPeers中的⼀个。同⼀个Group内的各个节点必须 不能重复。
- sendMessageThreadPoolNums: dLedger内部发送消息的线程数,建议配置成cpu核心数。
2.4、启动Broker服务
启动Broker服务,与单机版本不同,需要增加-c参数,指向对应的配置⽂件。
在三台服务器上分别执行以下指令,启动broker服务 :
# 切换到RocketMQ运行包根目录
cd /opt/apps/server/rocketmq-all-5.3.1-bin-release
# 在rmq1服务器上,启动命令
nohup mqbroker -c ./conf/dledger/broker-n0.conf &
# 在rmq2服务器上,启动命令
nohup mqbroker -c ./conf/dledger/broker-n1.conf &
# 在rmq3服务器上,启动命令
nohup mqbroker -c ./conf/dledger/broker-n2.conf &
2.5、检查集群服务状态
可以在Dashboard控制台的集群菜单⻚看到Dledger集群的运⾏状况。
此时,看到的Master是51这台服务器。
2.7、测试是否自动选举出Master
手动停止51服务器上的broker服务
Dashdboard观察,节点已减少,且master节点已变更为50(rmq1)节点。具体选举出rmq1还是rmq3作为master,这个是随机的。
如果尝试继续停⽌rmq1或rmq3上的broker服务,集群中宕机的broker服务就超过了半数(2台)。这时这个Dledger集群就选举不出master节点,也就⽆法正常⼯作了。
3、我的公众号&资料获取
敬请关注我的公众号:大象只为你,持续更新技术知识…
相关资料获取:
如需RocketMQ资源包,请后台回复:RocketMQ