多副本
Kafka 为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。
同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样)。这部分机制其实很像Redis里的主从复制。
不妨稍微回忆下Redis的主从复制,主从复制和哨兵模式加在一起可以保证redis的可用性(也就是一个节点挂了,这个服务还能用)。那么kafka的多副本大概也是为了保证可用性。
生产者和消费者只与 leader 副本交互。你可以理解为其他副本只是 leader 副本的拷贝,它们的存在只是为了保证消息存储的安全性。当 leader 副本发生故障时会从 follower 中选举出一个 leader,但是 follower 中如果有和 leader 同步程度达不到要求的参加不了 leader 的竞选。Kafka 通过多副本机制实现了故障的自动转移,当 Kafka 集群中某个 broker 失效时仍然能保证服务可用。
多分区和多副本
- Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。
- Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。
同步or异步
多副本并不是同步或异步,搞清多副本一致的具体机制之前,首先要弄清两个概念
- HW 是 High Watermark 的缩写,俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个 offset 之前的消息。即,只有这部分是对消费者可见的。
- LEO 是 Log End Offset 的缩写,它标识当前日志文件中下一条待写入消息的 offset。每个副本的LEO都是不同的。
- 如果主从同步,HW和LEO应该是一致的。即所有的数据都是可见的,所有的从或主的数据都是相同的。
- HW是从中最小的LEO-1.
文章末尾请带上以下文字及链接:本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情