第三章 搭建RocketMQ (Deldger集群)
第一章 RocketMQ基础知识
第二章 搭建RocketMQ (单机)
第三章 搭建RocketMQ (Deldger集群)
一、RocketMQ4.X多种集群模式
- 单节点
优点:本地开发测试,配置简单,同步刷盘消息一条都不会丢
缺点:不可靠,如果宕机会导致服务不可用
- 主从(异步,同步双写)
指一个Master节点和一个Slave节点
优点:同步双写消息不丢失, 异步复制存在少量丢失 ,主节点宕机,从节点可以对外提供消息的消费,但是不支持写入
缺点:主备有短暂消息延迟,毫秒级,目前不支持自动切换,需要脚本或者其他程序进行检测然后进行停止broker,
重启让从节点成为主节点
- 双主(2m-noslave)
指两个或两个以上个Master节点
优点:配置简单,单个Master 宕机或重启维护对应用无影响, 可以靠配置RAID磁盘阵列保证消息可靠,异步刷盘丢失少量消息
缺点: master机器宕机期间,未被消费的消息在机器恢复之前不可消费,实时性会受到影响
- 双主双从,多主多从模式(2m-2s-async,异步复制)
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:即使磁盘损坏,消息丢失的非常少,消息实时性不会受影响,Master 宕机后,消费者仍然可以从Slave消费
缺点:主从有短暂消息延迟,毫秒级,如果Master宕机,磁盘损坏情况,会丢失少量消息
- 双主双从,多主多从模式(2m-2s-sync,同步双写)
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功。
优点:同步双写方式,主备都写成功,向应用才返回成功,服务可用性与数据可用性都非常高
缺点:性能比异步复制模式略低,主宕机后,备机不能自动切换为主机
- DLedger模式(基于raft协议的 commitlog 存储库)
RocketMQ 4.5.0 版本开始,引入 DLedger 模式来解决 Broker 组内自动故障转移(自动选主)的问题,而在 4.8.0 版本中社区也对 RocketMQ DLedger 模式进行了全面升级。
阿里巴巴官方介绍:https://blog.csdn.net/alisystemsoftware/article/details/112308224
二、选择DLedger模式
RocketMQ集群部署可以分为两种方式master-slave和dledger,虽然master-slave方式提供了一定的高可用性,但是如果集群中的master节点挂了,这时需要运维人员手动进行重启或者切换操作,即不能自动在集群的剩余节点中选出一个master,dledger解决了这个问题。
另一方面 DLedger 又是一个轻量级的 java library。它对外提供的 API 非常简单,append 和 get。Append 向 DLedger 添加数据,并且添加的数据会对应一个递增的索引,而 get 可以根据索引去获得相应的数据。因此 DLedger 是一个 append only 的日志系统。
DLedger 还可以构建高可用的嵌入式 KV 存储。我们把对一些数据的操作记录到 DLedger 中,然后根据数据量或者实际需求,恢复到hashmap 或者 rocksdb 中,从而构建一致的、高可用的 KV 存储系统,应用到元信息管理等场景。
三、DLedger集群搭建
部署自动容灾切换的 RocketMQ-on-DLedger Group。至少需要 3 个节点,通过 Raft 自动选举出一个 Leader,其余节点 作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用;能自动容灾切换,并保证数据一致;可以水平扩展的,也即可以部署任意多个 RocketMQ-on-DLedger Group 同时对外提供服务。
有两种部署方式:新集群部署、旧集群升级。我们选择新集群部署。
7. 准备环境
三台机器:106、107、108,搭建一主两从
8. 配置参数(/rocketmq-4.9.3/conf/dledger目录下)
2.1 106服务器上:
创建106-broker-n0.conf、107-broker-n1.conf,内容分别为:
#106-broker-n0.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode00
#brokerip
brokerIP1=10.60.32.106
#监听端口
listenPort=10911
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node00
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlog
#broker检测队列中的消息等待时间(默认是200毫秒,自行配置)
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode00
#dLeger集群下的节点配置
dLegerPeers=n0-10.60.32.106:20911;n1-10.60.32.107:20911;n2-10.60.32.108:20911
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n0
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
#107-broker-n1.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode01
#brokerip
brokerIP1=10.60.32.106
#监听端口
listenPort=10921
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node01
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node01/commitlog
#broker检测队列中的消息等待时间(默认是200毫秒,自行配置)
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode01
#dLeger集群下的节点配置
dLegerPeers=n3-10.60.32.107:20921;n4-10.60.32.106:20921;n5-10.60.32.108:20921
##must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n4
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
2.2 107服务器上:
创建107-broker-n0.conf、106-broker-n1.conf,内容分别为:
##107-broker-n0.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode01
#brokerip
brokerIP1=10.60.32.107
#监听端口
listenPort=10921
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node01
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node01/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode01
#dLeger集群下的节点配置
dLegerPeers=n3-10.60.32.107:20921;n4-10.60.32.106:20921;n5-10.60.32.108:20921
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n3
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
##106-broker-n1.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode00
#brokerip
brokerIP1=10.60.32.107
#监听端口
listenPort=10911
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node00
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode00
#dLeger集群下的节点配置
dLegerPeers=n0-10.60.32.106:20911;n1-10.60.32.107:20911;n2-10.60.32.108:20911
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n1
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
2.3 108服务器上:
创建106-broker-n2.conf、107-broker-n2.conf,内容分别为:
##106-broker-n2.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode00
#brokerip
brokerIP1=10.60.32.108
#监听端口
listenPort=10911
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node00
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode00
#dLeger集群下的节点配置
dLegerPeers=n0-10.60.32.106:20911;n1-10.60.32.107:20911;n2-10.60.32.108:20911
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n2
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
##107-broker-n2.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode01
#brokerip
brokerIP1=10.60.32.108
#监听端口
listenPort=10921
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node01
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node01/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode01
#dLeger集群下的节点配置
dLegerPeers=n3-10.60.32.107:20921;n4-10.60.32.106:20921;n5-10.60.32.108:20921
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n5
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
- 启动
3.1 启动namesrv,分别在106、107两台服务器上
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqnamesrv > /usr/local/rocketmq/logs/mqnamesrv.log 2>&1 &
3.2 启动broker,分别在106、107、108三台服务器上
106服务器
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/106-broker-n0.conf > /usr/local/rocketmq/logs/106-broker-n0.log 2>&1 &
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/107-broker-n1.conf > /usr/local/rocketmq/logs/107-broker-n1.log 2>&1 &
107服务器
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/106-broker-n1.conf > /usr/local/rocketmq/logs/106-broker-n1.log 2>&1 &
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/107-broker-n0.conf > /usr/local/rocketmq/logs/107-broker-n0.log 2>&1 &
108服务器
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/106-broker-n2.conf > /usr/local/rocketmq/logs/106-broker-n2.log 2>&1 &
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/107-broker-n2.conf > /usr/local/rocketmq/logs/107-broker-n2.log 2>&1 &
四、安装console
五、遇到问题
- 106服务器启动broker时,报端口被占用。 – 监听端口和节点端口不能为同一端口