RocketMQ集群模式!
RocketMQ集群模式!
月伴飞鱼在RocketMQ5.0
以前,有两种集群部署模式,分别为主从模式(Master-Slave
模式)和Dledger
模式。
主从模式
主从模式中,
Broker
分为Master
与Slave
,一个Master
可对应多个Slave
,一个Slave
只能对应一个Master
。每个
Broker
与NameServer
集群中的所有节点建立长连接,定时注册Topic
信息到所有NameServer
。
Master
节点负责接收客户端的写入请求,并将消息持久化到磁盘上。
Slave
节点则负责从Master
节点复制消息数据,并保持与Master
节点的同步。消费者可以从
Master
节点拉取消息,也可以从Slave
节点拉取消息。在
RocketMQ4.5
版本之前,如果Master
宕机,不支持自动将Slave
切换为Master
,需要人工介入。
Dledger模式
为了解决主从架构下
Slave
不能自动切换为Master
的问题,4.5版本之后提供了DLedger
模式。使用
Raft
算法,如果Master
节点出现故障,可以自动从Slave
节点中选举出新的Master
进行切换。存在问题
根据
Raft
算法的多数原则,集群至少有三个节点以上,在消息写入时。
- 需要大多数的
Follower
节点响应成功才能认为消息写入成功。
Dledger
模式下,进行消息写入的时候,使用的是OpenMessaging
包中提供的接口。
- 无法利用
RocketMQ
原生的存储和复制能力。存在两套日志复制流程(主从模式下一套、
Dledger
模式下一套),不统一。
Controller模式
为了解决如上问题,RocketMQ5.0
以后推出了Controller
模式,它的特点如下:
在主从部署模式下就具有自动切换
Master
的能力,5.0
之前需要使用DLedger
才可以。可以利用
RocketMQ
原生存储复制能力,并统一RocketMQ
的存储和复制能力。
RocketMQ5.0
对Broker
选主相关的功能进行了抽离,放在Controller
中。
实现了在主从部署模式下就可以自动切换Master,Controller
可以独立部署也可以嵌入在NameServer
中部署。
独立部署下的Controller
:
嵌入NameServer
中的部署图如下:
Controller
一般集群中部署多个
Controller
,使用Raft
算法选举出一个Active DLedger Controller
作为主控制器。它主要用来管理一个
SyncStateSet
集合。
- 这个集合中存储的是一组跟上
Master
进度的Broker
节点集合。如果
Controller
发现某个Master Broker
下线时,会从集合中选出新的Master Broker
并切换。
Controller
可以单独部署可以嵌在NameServer
中部署。
由于Controller
控制每个节点的角色,所以每个Broker
也会定时向Controller
发送请求获取主备信息。
- 以便在角色发生变化的时候可以及时更新。
同步复制
生产者发送消息后,
Master
接收到存储消息请求,将消息数据同步给Slave
后,才将存储结果返回给生产者。同步复制模式下,发送消息会有一定延迟,系统吞吐量也会降低。
异步复制
生产者发送消息后,
Master
接收到存储消息请求,将消息存储后,直接将存储结果返回给生产者。
Master
和Slave
再通过异步的方式同步数据,这种复制模式具有较小的延迟,可以实现比较高的吞吐量。若
Master
出现故障,有些数据可能未写入Slave
,未同步的数据可能丢失。
Proxy代理层
RocketMQ5.0
以前使用自定义的Remoting
协议底层基于Netty
进行网络通信,计算存储是一体的,都在Broker
中。
生产者和消费者从NameServer
中拉取到路由信息,之后直接与Broker
交互进行消息的生产与消费。
5.0以后引入了弹性无状态的代理模式,对
Broker
的职责进行了拆分。将客户端协议适配、权限管理、消费管理等计算逻辑进行了抽离,放入
Proxy
层,Broker
专注数据的存储。
- 以便更好的适应云原生环境,实现资源弹性调度。
并且5.0以后增加了
GRPC
协议的支持,它是Protobuf
序列化。
从架构上来看,增加
Proxy
代理层后,生产者和消费者不再直接与Broker
通信,而是与Proxy
层通信。
Proxy
层再与NameServer
和Broker
交互进行消息的发送和消费。如果需要提高计算层的能力,只需要增加
Proxy
层,如果需要提高存储层的能力,增加Broker
的部署即可。