3.副本设计副本( Replica )是分布式系统中常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式 。
我们知道 Kafka 通过多副本机制,增强了容灾备份的能力,并且实现了故障转移 。这无疑是大大提高了 Kafka 的可用性 , 下面笔者会带着大家一起看 Kafka 的副本机制是如何设计的 。
在此之前,先简单复习几个相关的概念:
- 副本是相对分区而言的,即副本是指某个分区的副本
- 在多副本情况下,其中一个副本为 leader,其它均为 follower 。只有 leader 对外提供服务,follower 仅同步leader 数据
- 分区中所有的副本集合称为 AR,ISR 是与 leader 保持同步状态的副本集合,leader 也是 ISR 中的一员
- LEO 是每个分区下一条消息要写入的位置
- HW 是 ISR 中最小的 LEO,消费者只能拉取 HW 之前的消息
功能失效指的是无法工作,比如某个 broker 宕机了,那么在它上面的分区就会失效 。
同步失效又是怎么判断是否同步失效的呢?是通过参数 replica.lag.time.max.ms 来判断的,默认是 10000 毫秒 。当某个 follower 同步滞后 leader 的时间超过 10 秒 , 则判定为同步失效 。
具体实现原理如下:
![带你吃透Kafka的可靠性设计](http://img.jiangsulong.com/231117/1F2525C4-4.jpg)
文章插图
当 follower 将 leader LEO 之前的消息全部同步完成 , 那么会认为该 follower 已经追上 leader , 并更新 lastCaughtUpTimeMs 。Kafka 的副本管理器有一个副本过期检测的定时任务,如果发现当前时间 - lastCaughtUpTimeMs > 10秒,则判定同步失效 。
除了时间设置以外,还有另一个参数 replica.lag.max.message(默认4000,这个是 broker 级别的参数),也是用来判定失效副本的 。
一般情况下,这两个参数都是使用默认值就可以,因为如果没有调优经验,自己乱配置,容易导致 ISR 变动过于频繁 。同时,需要监控失效副本的数量 , 因为它是衡量 Kafka 是否健康的一个很重要的指标 。
PS:新加入的副本因子/宕机恢复后重新加入的副本在追赶上 leader 之前 , 也会一直处于失效状态 。3.1.1 失效副本的作用失效副本为 Kafka 带来了什么收益呢?为什么需要设计这么一个状态呢?
大家不妨试想下:假设允许 ISR 中有一个副本同步一直跟不上 leader 。当 leader 发生宕机时,这个 follower 被选举成了新的 leader,那么这时就会发生消息丢失 。
一般会造成副本失效基本是以下两个原因:
- follower 副本进程卡顿,在一段时间内无法发起同步请求,比如说频繁发生 FULL GC
- follower 同步过慢,在一段时间内无法追上 leader,比如 I/O有问题(笔者实际工作中遇到过一次,公司搭建自己的物理机房,用了二手服务器,有一台服务器I/O老化导致读写数据慢,导致了副本失效,消息堆积等问题)
假设现在有 3 个 broker,某个 topic 有 1 个分区,3 个副本 。现在有一个 producer 发送了一条消息 , 这 3 个副本会发生些什么操作 。
![带你吃透Kafka的可靠性设计](http://img.jiangsulong.com/231117/1F2523616-5.jpg)
文章插图
具体步骤如下:
- producer 发送消息到 leader
- leader 将消息追加到日志,并且更新日志的偏移量
- follower 执行定时任务向 leader 发送 fetch request 同步数据,该请求会带上自己的 LEO
- leader 读取本地日志,并更新 follower 的信息
- leader 返回 fetch response 给 follower,response 会包含 HW
- follower 将消息追加到本地日志,并更新日志的偏移量
1.一个新建的 topic 被写入了 5 条消息 , 两个 follower 去拉取数据
![带你吃透Kafka的可靠性设计](http://img.jiangsulong.com/231117/1F25211T-6.jpg)
文章插图
2.leader 给 follower 返回 fetch response,并且 leader 又被写入了 5 条消息
推荐阅读
- 大型语言模型 一文带你解密 Large Language Model
- 为什么 Kafka 的吞吐量那么高?
- 一文带你了解Spring Actuator
- 一文带你彻底了解JMX
- K8s部署方式大全:从基础到进阶,一文带你掌握所有技巧
- 秦昊带你爬山是什么梗
- 如何确定Apache Kafka的大小和规模
- 什么是抗初老精华,真正有用值得入手有哪些?这6款精华带你了解
- 《小巷人家》开机,关晓彤、周洁琼、卢昱晓带你感受时代里的故事
- 带你了解衸笥愕乃茄?椒ǎù?懔私庑■笥愕乃茄?椒ㄊ鞘裁矗?