kafka的文章
1.面试的问题
- 要点 至多一次、恰好一次
- 数据一致性
- 超时重试、幂等
- 消息顺序
- 消息挤压
- 延时消息
1.1 kafaka 生产消息的过程。
在消息发送的过程中,涉及到了两个线程,一个是main 线程,一个是sender 线程。在main 线程中创建了一个双端队列 RecordAccumulator,main 线程将消息发送到 双端队列,sender 线程不断从双端队列读取 发送到 broker
1.2 消息队列的可靠性。
1.3 副本同步机制
leo: 定义:LEO 即日志末端偏移量,它表示每个副本日志中最后一条消息的下一个偏移量。
hw:高水位(HW,High Watermark)的确是 ISR(In - Sync Replicas,同步副本集合)中所有副本的最小日志末端偏移量(LEO,Log End Offset)
Kafka 的副本同步机制
Kafka 的副本同步机制是保障数据可靠性和高可用性的核心特性,下面从整体架构、同步流程、ISR 机制、相关参数等方面进行详细介绍。
整体架构
- Kafka 中每个分区都有一个 Leader 副本和多个 Follower 副本。生产者和消费者只与 Leader 副本进行交互,Follower 副本负责从 Leader 副本同步数据。这样的设计使得 Kafka 可以在多个 Broker 上存储数据副本,提高数据的容错能力。
同步流程
- 消息生产
生产者将消息发送到 Kafka 集群时,会指定要发送到的主题和分区。Kafka 根据分区的 Leader 副本位置,将消息发送到对应的 Leader 副本所在的 Broker。 - Leader 副本接收消息
Leader 副本接收到生产者发送的消息后,将消息写入本地日志,并更新自身的日志末端偏移量(LEO)。 - Follower 副本同步消息
Follower 副本通过向 Leader 副本发送 Fetch 请求来同步消息。Fetch 请求中包含 Follower 副本当前的 LEO,Leader 副本根据该信息将新的消息发送给 Follower 副本。
Follower 副本接收到消息后,将消息写入本地日志,并更新自身的 LEO。 - 高水位(HW)更新
高水位(HW)是分区中所有副本都已经成功复制的消息的最大偏移量。Kafka 会根据 ISR(In - Sync Replicas,同步副本集合)中所有副本的 LEO 来更新 HW。具体来说,HW 是 ISR 中最小的 LEO。
只有偏移量小于 HW 的消息才被认为是已经在所有同步副本中安全保存的,可以被消费者消费。
ISR 机制 - ISR 定义
ISR 是与 Leader 副本保持同步的一组副本集合。只有在 ISR 中的副本,才被认为是可靠的同步副本,能够参与 HW 的计算。 - ISR 动态维护
Kafka 会定期检查 Follower 副本与 Leader 副本的同步情况,通过比较 LEO 的差距来判断 Follower 副本是否落后。如果 Follower 副本的 LEO 与 Leader 副本的 LEO 差距超过一定阈值(由 replica.lag.time.max.ms 参数控制),则该 Follower 副本会被从 ISR 中移除。
当落后的 Follower 副本追上 Leader 副本后,它可以重新加入 ISR。 - ISR 的作用
提高数据可靠性:只有 ISR 中的副本参与 HW 的计算,确保消费者只能读取到已经在多个副本中安全保存的消息。
故障转移:当 Leader 副本出现故障时,Kafka 会从 ISR 中选举出新的 Leader 副本,保证数据的一致性和服务的连续性。
相关参数 - acks 参数
该参数用于控制生产者发送消息时的确认机制,影响副本同步策略。
acks = 0:生产者发送消息后,不等待任何确认,相当于异步复制,性能最高但数据可靠性最低。
acks = 1:生产者发送消息后,等待 Leader 副本确认,只要 Leader 副本写入成功就返回响应,性能和可靠性适中。
acks = all 或 acks = -1:生产者发送消息后,等待所有 ISR 中的副本确认,相当于同步复制,数据可靠性最高但性能最低。 - min.insync.replicas 参数
用于指定 ISR 中最少需要有多少个副本同步消息,才能认为消息写入成功。结合 acks = all 使用时,可以进一步增强数据的可靠性。如果 ISR 中的副本数量小于 min.insync.replicas,生产者发送消息时会收到写入失败的响应。 - replica.lag.time.max.ms 参数
该参数定义了 Follower 副本与 Leader 副本之间允许的最大延迟时间。如果 Follower 副本在该时间内没有向 Leader 副本发送 Fetch 请求或者没有追上 Leader 副本的 LEO,则会被从 ISR 中移除。
异常情况处理 - Leader 副本故障
当 Leader 副本所在的 Broker 出现故障时,Kafka 会从 ISR 中选举出新的 Leader 副本。新的 Leader 副本会将 HW 作为新的起始偏移量,继续处理生产者和消费者的请求。 - Follower 副本故障
如果某个 Follower 副本出现故障,它会被从 ISR 中移除。当该副本恢复正常后,会重新向 Leader 副本发送 Fetch 请求,追赶 Leader 副本的进度,当追上后可以重新加入 ISR。
综上所述,Kafka 的副本同步机制通过 Leader - Follower 架构、ISR 机制和相关参数的配置,在保证数据可靠性和高可用性的同时,兼顾了性能和容错能力。
1.4 kafka 高性能、高吞吐原因
- 磁盘顺序读写
- 顺序读 会使用预读
- 保证了消息的堆积 相比于内存。
- 使用了零拷贝的技术
- 分区分段 + 索引
- 每个 分区 在磁盘上 按照segment 文件存储的。针对segment 建立.index的索引文件
- 批量压缩 多条消息批量压缩传输,降低带宽
- 批量读写
1.5 消息丢失的场景 解决方案
- ack=all,
- 配置 min.insync.replicas>1
1.6 消息可靠性的解决方案
消息发送
- ack -1/all 、
- unclean.leader.election.enable: false, 禁止选举 isr 以外的follower为leader
- tries >1 重试次数
- min.insync.replicas>1 同步副本数,没满足该之前,不提供 读写服务。
综上所述,在 acks = all 且 min.insync.replicas = 3,副本总数为 5 个的情况下,至少 3 个处于 ISR 中的副本写入数据完成,Kafka 才会判定消息写入操作完成。
消费者
- 手动提交 offset
- broker 减少刷盘间隔
- 事务消息
1.7 kafka reblance
- 消费者分区策略
- range 范围分区 默认
- roundrobin 轮询
- sticky 策略 体现在 reblance 策略下。
- 触发reblance 的时间
- 消费者组成员个数变化的时候。
有新的消费者加入、离开消费者组
- 订阅的topic 发生变化
- 订阅topic 的分区发生变化
- coordinator 协调过程
- 消费者 找到消费者组中的 协调器
- 确定分区策略
system design interview 书
第八章 设计短链系统
kafka 笔记
尚硅谷-笔记