网易一面:KAFKA写入数据时是先写Leader还是先写Follower?
Kafka 的写入路径是先写 Leader再由 Leader 复制到 Followers。对生产者而言是否等 Followers取决于 acks确认级别。不存在生产者直接同时写 Leader 和 Follower的机制复制由 Leader 侧串起完成。写入链路Leader 串行落盘Followers 异步拉取复制一次写入在分区partition维度上发生生产者把记录发给该分区的Leader 副本leader replica。Leader 将记录追加到本地日志log并更新高水位相关状态。各Follower 副本并不接受生产者写入而是通过复制线程向 Leader 发起Fetch拉取新数据写入各自本地日志。当副本赶上并满足条件时Leader 推进HWHigh Watermark高水位表示已提交committed的偏移。因此从时序看是生产者 → Leader 写入 → Followers 拉取复制。Followers 的写入相对 Leader 是滞后的滞后程度由网络、磁盘、负载与副本数共同决定。acks 决定写到哪一步才算成功生产者感知到的写成功由 acks 决定acks0生产者不等任何确认。 Leader 是否写入、Follower 是否复制都不保证吞吐高但丢数据风险最大。acks1Leader 写入本地日志后返回确认。 Followers 可能还没复制完成。 Leader 宕机且数据尚未复制时可能丢失。acksall或 acks-1 Leader 不仅要写入还要等待数据被复制到 **ISRIn-Sync Replicas同步副本集合**中的足够副本后再确认。 通常语义是至少写到所有 ISR 副本更接近强持久但延迟更高。这里的关键点是即便 acksall也是Leader 等 Followers 复制完成后再回 ACK而不是生产者并行写多份。提交可读与已写入不是同一件事Kafka 有两个容易混淆的状态已写入writtenLeader 日志已经追加了这条记录。已提交committed记录的偏移不超过 HW意味着已被 ISR 复制到位。 消费者在默认隔离级别下通常只会稳定读取到 committed 数据。当 acks1 时写入成功返回可能早于 committed。当 acksall 时返回更接近 committed在 ISR 机制正常工作前提下。常见误区以为同时写能降低复制延迟直觉上生产者同时写多个副本似乎更快但 Kafka 的一致性与顺序保证依赖Leader 统一仲裁与定序单点定序Leader 负责为分区内消息分配顺序与 offset。复制一致Followers 通过同一个 Leader 拉取同一条日志流保证副本间顺序一致。故障切换ISR 与 HW 机制围绕 Leader 的状态推进简化一致性判断。因此Kafka 选择Leader 写入 Followers 拉取是为了在吞吐、顺序、一致性与故障恢复之间取平衡而不是追求生产者侧的并行多写。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420305.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!