RocketMQ集群模式!

RocketMQ5.0以前,有两种集群部署模式,分别为主从模式(Master-Slave模式)和Dledger模式。

主从模式

主从模式中,Broker 分为 MasterSlave,一个 Master 可对应多个 Slave,一个 Slave 只能对应一个 Master

每个 BrokerNameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer

Master 节点负责接收客户端的写入请求,并将消息持久化到磁盘上。

Slave 节点则负责从 Master 节点复制消息数据,并保持与 Master 节点的同步。

消费者可以从Master节点拉取消息,也可以从Slave节点拉取消息。

RocketMQ4.5版本之前,如果Master宕机,不支持自动将Slave切换为Master,需要人工介入。

img

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.0Broker选主相关的功能进行了抽离,放在Controller中。

实现了在主从部署模式下就可以自动切换Master,Controller可以独立部署也可以嵌入在NameServer中部署。

独立部署下的Controller

img

嵌入NameServer中的部署图如下:

img

Controller

一般集群中部署多个Controller,使用Raft算法选举出一个Active DLedger Controller作为主控制器。

它主要用来管理一个SyncStateSet集合。

  • 这个集合中存储的是一组跟上Master进度的Broker节点集合。

如果Controller发现某个Master Broker下线时,会从集合中选出新的Master Broker并切换。

  • Controller可以单独部署可以嵌在NameServer中部署。

由于Controller控制每个节点的角色,所以每个Broker也会定时向Controller发送请求获取主备信息。

  • 以便在角色发生变化的时候可以及时更新。

img

同步复制

生产者发送消息后,Master 接收到存储消息请求,将消息数据同步给 Slave 后,才将存储结果返回给生产者。

同步复制模式下,发送消息会有一定延迟,系统吞吐量也会降低。

异步复制

生产者发送消息后,Master 接收到存储消息请求,将消息存储后,直接将存储结果返回给生产者。

MasterSlave 再通过异步的方式同步数据,这种复制模式具有较小的延迟,可以实现比较高的吞吐量。

Master 出现故障,有些数据可能未写入 Slave,未同步的数据可能丢失。

Proxy代理层

RocketMQ5.0以前使用自定义的Remoting协议底层基于Netty进行网络通信,计算存储是一体的,都在Broker中。

生产者和消费者从NameServer中拉取到路由信息,之后直接与Broker交互进行消息的生产与消费。

img

5.0以后引入了弹性无状态的代理模式,对Broker的职责进行了拆分。

将客户端协议适配、权限管理、消费管理等计算逻辑进行了抽离,放入Proxy层,Broker专注数据的存储。

  • 以便更好的适应云原生环境,实现资源弹性调度。

并且5.0以后增加了GRPC协议的支持,它是Google开源的高性能RPC框架,基于Protobuf序列化。

img

从架构上来看,增加Proxy代理层后,生产者和消费者不再直接与Broker通信,而是与Proxy层通信。

  • Proxy层再与NameServerBroker交互进行消息的发送和消费。

如果需要提高计算层的能力,只需要增加Proxy层,如果需要提高存储层的能力,增加Broker的部署即可。