共计 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