RocketMQ快速入门:主从、集群模式原理及搭建实操(十一)
在学习完rocketmq的基础知识后,我们进入rocketmq高可用保障的章节,即从服务部署架构角度,探索其支持的多节点部署模式。
目录
0. 引言
在学习完rocketmq的基础知识后,我们进入rocketmq高可用保障的章节,即从服务部署架构角度,探索其支持的多节点部署模式。
1. 前备知识
1.1 namesrv集群模式
我们知道rocketmq主要由namesrv和broker组成,其集群的部署自然就是两个服务的集群部署。而大部分我们谈到其集群模式时,其实都是指的broker, 这是因为namesrv是无状态的,什么是无状态的呢? 简单说就是namesrv之间不互相通信,其集群部署只要部署多个节点,broker中配置上多个namesrv的地址信息,只要其中一个namesrv可用,整体就依然可用。
那么这种无状态机制是怎么实现的呢?
其实要聊到namesrv与broker的通信机制,之前我们也简单说明过,具体如下:
1、nameserver 每隔 10s 会扫描一次 Broker,对于没有超过120s都没有回应的broker做剔除处理
2、broker 每隔 30 秒会向集群中所有的 NameServer 发送心跳包(这里发送的namesrv列表,就是写在broker配置文件中的所有namesrv地址),namesrv收到心跳包后会更新状态信息和路由表
所以可以看到broker会像所有的namesrv发送心跳,所以每个namesrv自然不用相互通信了。
1.2 broker集群模式
broker支持的集群模式包括三种:
- 单主模式
包含一个主节点,一个或多个从节点,主节点负责写操作,从节点负责读操作,主从节点之间通过主从复制机制同步数据,优点是部署维护简单,缺点是当主节点宕机时整个集群将无法工作,所以也没有完整的实现高可用
- 多主模式
包含多个主节点,没有从节点,单个节点宕机时对整体集群可用性无影响,但在该节点上还未消费的消息在宕机期间就无法被消费了,短期内对有限的数据消费有影响。
- 多主多从模式
包含多个主节点,多个从节点,主节点负责写,每个主节点有自己的一组从节点,从节点负责读,弥补多主模式宕机期间消息无法消费的问题,无单点故障,但相对性能会有所下降
1.2 broker主从复制原理
主从复制可以基于以下两种机制实现:同步复制和异步复制。
- 同步复制: 同步复制模式下,主节点会等待至少一个从节点返回确认接收的回执后,才会给生产者发送成功接收回执,该模式强调数据的强一致性,缺点是降低了性能。其执行流程如下:
- 生产者会先发送消息到主broker,主broker会将消息写入到commit log中
- 主broker写入数据时,会唤醒WriteSocketService线程,查询commit log,将数据发送到从broker
- 从接收到消息后,将数据写入到自身的commit log,复制完成后返回新的更新偏移量给主
- 主broker同步等待到偏移量返回后,更新偏移量,如果消息偏移量大于等于主从复制请求的偏移量,则说明复制完成,然后返回消息发送成功的回执给生产者
- 异步复制:主 Broker 发送消息后,不需要等待从 Broker 的确认,即可向生产者返回成功标识。异步复制可以提高性能,但是可能会有数据丢失的风险。
- 主broker启动,监听指定端口
- 从broker启动,与主broker建立连接
- 从broker每5s向主broker拉取消息,从broker收到消息后将数据写入到commit log中,同时返回偏移量给主broker,且更新自身存储的当前最大偏移量
可以看到同步异步的差别,主要是同步由主节点发起复制,异步由从节点发起复制
2. 集群部署
2.1 环境准备
两台部署了rocketmq的服务器,rocketmq在linux中的安装可参考我之前的文章:
linux安装RocketMQ并配置开机自启(一)
2.2 配置讲解
我们通过broker自带的conf目录下的配置文件2m-*,实际就可以知道如何进行配置
其配置项主要有以下几项:
- brokerClusterName=DefaultCluster # 集群名称,同一集群保持一致
- brokerName=broker-a # broker组名称,同一主从保持一致
- brokerId=1 # brokerid, 每个broker节点唯一,0 表示 Master,>0 表示 Slave
- deleteWhen=04 # 删除策略,通常配合时间使用,如每天的“04”点
- fileReservedTime=48 # 文件保留时间,单位为小时
- brokerRole=SLAVE # 角色,SLAVE从节点,ASYNC_MASTER 异步主节点,SYNC_MASTER 同步主节点
当为同步主节点时,生产者发送消息给主节点成功,也要发送给从节点成功之后,集群才会返回成功给生产者;当为异步主节点,生产者发送给主节点,主节点写入成功后就会返回成功回执给生产者。- flushDiskType=ASYNC_FLUSH # 主从复制模式,ASYNC_FLUSH异步刷盘,SYNC_FLUSH同步刷盘
2.3 一主多从模式部署
1、提前部署3个namesrv服务节点,3个broker服务节点,其中计划1个为主节点,2个从节点
broker服务节点 | 角色 |
---|---|
192.168.244.27 | 主 |
192.168.244.28 | 从 |
192.168.244.29 | 从 |
2、修改主节点服务器的broker.conf配置
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
3、修改两个从节点的broker.conf配置
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 1 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 节点ip
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 2 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29 # 节点ip
4、启动3个namesrv
5、启动3个broker
6、查询集群状态
# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"
7、也可以通过管理后台查看集群节点
8、使用之前的代码测试消息发送
消息消费也正常
2.4 多主无从模式部署
1、提前部署2个namesrv服务节点,2个broker服务节点,其中计划2个为主节点,无从节点
broker服务节点 | 角色 |
---|---|
192.168.244.27 | 主 |
192.168.244.28 | 主 |
2、修改其中一个节点服务器的broker.conf配置
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
3、修改另一个节点的broker.conf配置
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
4、启动2个namesrv
5、启动2个broker
6、查询集群状态
# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876"
2.5 多主多从模式部署
1、提前部署3个namesrv服务节点,4个broker服务节点,其中计划2个为主节点,2个从节点
broker服务节点 | 角色 |
---|---|
192.168.244.27 | 主1 |
192.168.244.28 | 主2 |
192.168.244.29 | 从1 |
192.168.244.30 | 从2 |
2、修改主1节点服务器的broker.conf配置
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
3、修改主2节点的broker.conf配置
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 0 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 节点ip, 另一个是192.168.244.29
4、修改两个从节点的配置分别为
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.30
4、启动3个namesrv
5、启动4个broker
6、查询集群状态
# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"
显示有2个主节点,2个从节点
3. 总结
综上,我们针对rocketmq的三种集群模式部署就讲解完成了,如果需要调整刷盘模式,调整flushDiskType参数即可。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)