You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8.9 KiB

一、RocketMQ 常用部署模式

官方的部署模式:https://github.com/apache/rocketmq/blob/release-4.8.0/docs/cn/best_practice.md

RocketMQ 常用部署方案有以下几种:

  • 单机模式
  • 多主模式
  • 双主双从/多主多从模式(异步复制)
  • 双主双从/多主多从模式(同步双写)
  • Dledger 集群模式

(1)、单机模式

这种模式就如该名单机模式一样,就是部署单个 RocketMQ Broker 来使用,一般使用这种方式在生产中风险较大,一旦 Broker 重启或者宕机时,会导致整个服务不可用,所以常常在学习、开发过程中才会使用这种模式。

优缺点分析:

  • 优点: 本地开发测试,配置简单,同步刷盘消息不会丢失。
  • 缺点: 不可靠,如果宕机会导致服务不可用。

(2)、多主模式

全部由 Broker Master 节点组成(即可能部署两个或者更多 Broker生产者发送的数据会分别存入不同的 Broker 中,这样能够避免某个 Broker 一直接收处理数据从而负载过高。

优缺点分析:

  • 优点: 性能高,配置简单,单个 Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10 时,即使机器宕机不可恢复,由于 RAID10 磁盘非常可靠,消息也不会丢(异步刷盘可能会丢失少量消息,同步刷盘能保证消息不丢)。
  • 缺点: 单台服务器宕机期间,不可订阅该服务器上未被消费者消费的消息,只有机器恢复后才可恢复订阅,所以可能会影响消息的实时性。

(3)、双主双从/多主多从模式(异步复制)

一般会部署多个 Broker Master同时也会为各个 Broker Master 部署一个 Broker Slave且 Master 和 Slave 之间采用”异步复制数据”方式进行数据同步(主从同步消息会有延迟,毫秒级),这样在生产者将消息发送到 Broker Master 后不必等待数据同步到 Slave 节点,就返回成功。

优缺点分析:

  • 优点: 性能高且磁盘损坏也不会丢失大量消息消息实时性不会受影响Master 宕机后,消费者仍然可以从 Slave 消费。
  • 缺点: 主备有短暂消息延迟毫秒级如果Master宕机磁盘损坏情况会丢失少量消息。

(4)、双主双从/多主多从模式(同步双写)

一般会部署多个 Broker Master同时也会为各个 Broker Master 部署一个 Broker Slave且 Master 和 Slave 之间采用”同步复制数据”方式进行数据同步,这样在生产者将消息发送到 Broker Master 后需要等待数据同步到 Slave 节点成功后,才返回成功。

优缺点分析:

  • 优点: 数据与服务都无单点故障Master 宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
  • 缺点: 性能比异步复制模式略低大约低10%左右),发送单个消息的 RT 会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

(5)、Dledger 集群模式

RocketMQ-on-DLedger Group 是指一组相同名称的 Broker至少需要 3 个节点,通过 Raft 自动选举出一个 Leader其余节点 作为 Follower并在 Leader 和 Follower 之间复制数据以保证高可用。当 Master 节点出现问题宕机后也能自动容灾切换,并保证数据一致性。该模式也支持 Broker 水平扩展,即可以部署任意多个 RocketMQ-on-DLedger Group 同时对外提供服务。

优缺点分析:

  • 优点:多节点(至少三个)组成集群,其中一个为 Leader 节点,其余为 Follower 节点组成高可用,能够自动容灾切换。
  • 缺点:需要 RocketMQ 4.5 及以后版本才支持。

二、RocketMQ Dledger 集群模式简介

1、传统部署方式的不足

在 RocketMQ 4.5 之前的版本中,部署 RocketMQ 高可用方案一般都会采用多主多从方式,这种方式需要多个 Master 节点与实时备份 Master 节点数据的 Slave 节点Slave 节点通过同步复制或异步复制的方式去同步 Master 节点数据。但这样的部署模式存在一定缺陷。比如故障转移方面,如果 Master 点挂了,还需要人为手动对 Master 节点进行重启或者切换,它无法自动的将 Slave 节点转换为 Master 节点。因此,我们希望能有一个新的多副本架构,去解决这个问题。

2、新技术解决的问题

新的多副本架构首先需要解决自动故障转移的问题,本质上来说问题关键点在于 Broker 如何自动推选主节点。这个问题的解决方案基本可以分为两种:

  • 利用第三方协调服务集群完成选主,比如 Zookeeper 或者 Etcd但是这种方案会引入了重量级外部组件使部署变得复杂同时也会增加运维对组件的故障诊断成本比如在维护 RocketMQ 集群还需要维护 Zookeeper 集群,保证 Zookeeper 集群如何高可用,不仅仅如此,如果 zookeeper 集群出现故障也会影响到 RocketMQ 集群。
  • 利用 raft 协议来完成一个自动选主raft 协议相比前者的优点是不需要引入外部组件,自动选主逻辑集成到各个节点的进程中,节点之间通过通信就可以完成选主。

RocketMQ 最终选择使用 raft 协议来解决这个问题,而 DLedger 就是一个基于 raft 协议的 commitlog 存储库,也是 RocketMQ 实现新的高可用多副本架构的关键。

3、Dledger 简介

分布式算法中比较常常听到的是 Paxos 算法,但是由于 Paxos 算法难于理解,且实现比较苦难,所以不太受业界欢迎。然后出现新的分布式算法 Raft其比 Paxos 更容易懂与实现到如今在实际中运用的也已经很成熟不同的语言都有对其的实现。Dledger 就是其中一个 Java 语言的实现,其将算法方面的内容全部抽象掉,这样开发人员只需要关系业务即可,大大降低使用难度。

Dledger 相关资料来源于网上搜索。

4、DLedger 定位

img

Raft 协议是复制状态机的实现这种模型应用到消息系统中就会存在问题。对于消息系统来说它本身是一个中间代理commitlog 状态是系统最终状态,并不需要状态机再去完成一次状态构建。因此 DLedger 去掉了 raft 协议中状态机的部分但基于raft协议保证commitlog 是一致的,并且是高可用的。

img

另一方面 DLedger 又是一个轻量级的 java library。它对外提供的 API 非常简单append 和 get。Append 向 DLedger 添加数据,并且添加的数据会对应一个递增的索引,而 get 可以根据索引去获得相应的数据。因此 DLedger 是一个 append only 的日志系统。

5、DLedger 应用场景

img

DLedger 其中一个应用就是在分布式消息系统中RocketMQ 4.5 版本发布后,可以采用 RocketMQ on DLedger 方式进行部署。DLedger commitlog 代替了原来的 commitlog使得 commitlog 拥有了选举复制能力然后通过角色透传的方式raft 角色透传给外部 broker 角色leader 对应原来的 masterfollower 和 candidate 对应原来的 slave。

因此 RocketMQ 的 broker 拥有了自动故障转移的能力,在一组 broker 中如果 Master 挂了,能够依靠 DLedger 自动选主能力重新选出一个 leader然后通过角色透传变成新的 Master。

img

DLedger 还可以构建高可用的嵌入式 KV 存储。我们把对一些数据的操作记录到 DLedger 中然后根据数据量或者实际需求恢复到hashmap 或者 rocksdb 中,从而构建一致的、高可用的 KV 存储系统,应用到元信息管理等场景。

6、RocketMQ Dledger 的方案简介

img

RocketMQ-on-DLedger Group 是指一组相同名称的 Broker组中至少需要 3 个 Broker 节点来保证集群能够运行,在 Broker 启动时候,通过 raft 算法能够自动选举出一个 Broker 为 Leader 节点,其余为 Follower 节点。这种模式下 Leader 和 Follower 之间复制数据以保证高可用,如果 Leader 节点出现问题是可以自动进行容灾切换并保证数据一致性。且不仅仅如此,该模式也支持 Broker 节点水平扩展来增加吞吐量。所以该模式将会是部署 RocketMQ 常用模式之一。

参考

DLedger 模式集群部署

RocketMQ系列搭建3m-3s模式的rocketmq集群