关于javascript:RabbitMQKafkaRocketMQ-是如何实现高可用的

54次阅读

共计 1879 个字符,预计需要花费 5 分钟才能阅读完成。

本文从高可用的角度观察一下 RabbitMQ、Kafka、RocketMQ,看看它们各自的实现思路。

1. RabbitMQ

RabbitMQ 有 3 种部署模式:

  • 单机模式
  • 一般集群模式
  • 镜像集群模式

单机模式与高可用齐全没关系,咱就不说了,间接看看这 2 种集群模式。

1.1 一般集群模式

某一个 Queue 是在集群中的某一个 Broker 上,各个 Broker 会同步元数据,但不会同步 Queue 的音讯数据。

如果某一个 Broker 故障了,其中的 Queue 便无奈应用。如果音讯没有配置音讯长久化,则音讯失落。

能够看到,这种形式并没有实现高可用,只是扩展性比拟好,裁减 Broker 能够包容更多的 Queue,进步吞吐量。

1.2 镜像集群模式

一个 Broker 中 Queue 的元数据和音讯数据都会同步到其余 Broker 上,就是做了全量备份,所以称为“镜像模式”。

实现了高可用,如果一个 Broker 故障了,没关系,能够应用其余 Broker 持续工作,音讯数据不会失落。

可用性下来了,但扩展性没有了。

一个 Queue 的数据是全量存在 Broker 中的,所以 Queue 的音讯容量、音讯解决能力,都受限于 Broker。

一般集群模式 没有达到高可用,扩展性较好。

镜像集群模式 实现了高可用,但扩展性差。

2. Kafka

Kafka 把 Topic(主题 / 队列)分为了多个 Partition(分区),Topic 只是逻辑概念,Partition 才是理论的音讯存储单元。

一个 Topic 的多个 Partition 扩散在多个 Broker 中,每个 Partition 寄存 Topic 的一部分数据。

有了 Partition 之后,Topic 就具备了极强的扩展性,能够指定 N 个 Partition。

能够为 Partition 指定多个“正本”,扩散在不同的 Broker,从而实现其高可用。

当某个 Broker 故障的时候,其中寄存的 Partition 不可用,但没有关系,能够应用其余 Broker 上的正本。

Partition 的多个正本分为两种角色,Leader 和 Follower。

Leader 是由 Kafka 选举进去的,负责解决音讯的读写。Leader 收到新音讯后,会同步给 Follower。

Follower 的作用是候选人,当 Leader 出事儿之后,Kafka 会从 Follower 中选举出新的 Leader。

能够配置音讯写入实现的规范:

  • 写入 Leader 既可 — 速度快,但可能会有音讯失落,例如在同步到 Follower 之前 Broker 故障了,则音讯失落。
  • Follower 同步实现之后才算写入胜利 — 音讯可靠性极高,但影响写入速度。

3. RocketMQ

这是 RocketMQ 的官网结构图,左右是 Producer 和 Consumer,两头是 RocketMQ,分为两个局部:

  • NameServer 集群 — 寄存元数据
  • Broker 集群 — 寄存队列数据

这两局部都须要保障高可用。

NameServer 是独立运行的,保留着集群残缺的集群元数据,例如路由信息、Broker 信息、数据信息。

为了保障其高可用,能够运行多个 NameServer,之间残缺的同步数据即可。

这样只有有一个 NameServer 是可用的,就不会影响集群的失常工作。

Broker 集群的部署形式能够分为 3 种。

  • 多 Master

部署多个 Broker,角色都是 Master,Topic 的数据会扩散存储在这些 Broker 中。

单个 Master 故障会导致其中数据无奈应用,须要期待修复。

如果想保障数据的可靠性,能够应用【RAID10 + 同步刷盘】机制。

  • 多 Master 多 Slave

为 Master 配置了 Slave,Master 会把数据同步到 Slave。

当 Master 故障之后,能够用 Slave 顶上去,数据和服务都不影响,但会有短暂的进展,须要批改配置并重启能力实现切换动作。

数据同步的形式分为:

1)异步 — Master 写入实现即可,异步同步给 Slave。写入速度快,但同步会有提早,可能会丢数据。

2)同步 — Master 与 Slave 都写入之后才算胜利。不会丢音讯,但写入速度升高。

  • Dledger Group

Dledger 模式要求为 Master 配置 2 个 Slave,3 者组成一个 Dledger Group。

Dledger 也是 Master-Slave 同步的形式,益处在于能够实现主动选举 Master,主动切换。

当 Master 故障的时候,RocketMQ 能够从组内选出一个新的 Master,实现主动切换,这样更进一步进步了集群的可用性。

最初小结一下。

举荐浏览

OAuth2 图解

轻松了解 Kubernetes 的外围概念

开发者必须要理解的架构技术趋势:Service Mesh

正文完
 0