在 Kafka 中,Follower 副本与 Leader 副本之间的同步是通过 Kafka 的复制机制来完成的。Follower 副本需要与 Leader 副本保持数据的一致性,确保所有的副本(Leader 和 Follower)中的数据是相同的。以下是 Kafka Follower 如何与 Leader 同步数据的详细过程:
1. Leader 和 Follower 的角色
- Leader 副本:负责处理所有的读写请求。每个分区只有一个 Leader,所有的生产者和消费者都会通过 Leader 进行交互。
- Follower 副本:负责从 Leader 副本拉取数据,保持与 Leader 副本的数据同步。Follower 副本不会直接处理生产者或消费者的请求,而是通过同步数据来确保数据的一致性。
2. 数据同步的基本过程
Follower 与 Leader 之间的同步是一个不断进行的过程,主要通过 拉取(pull)机制 来完成。Follower 会定期从 Leader 拉取数据,确保自己与 Leader 保持一致。
2.1 Follower 拉取数据
- Follower 副本定期向 Leader 发起请求,拉取新的日志数据。
- Follower 会通过向 Leader 发送 Fetch 请求 来请求未同步的消息。每个 Fetch 请求会携带以下信息:
- 当前 Offset:Follower 在自己本地的最新 Offset,即它已经接收到的最大消息位移。Leader 会根据这个 Offset 返回新的日志消息。
- 拉取的最大数据量(
fetch.max.bytes
):Leader 会根据这个请求中的数据量限制,返回相应数量的数据。
2.2 数据传输
- Leader 返回数据:Leader 接收到 Follower 的请求后,会根据请求中的 Offset 返回从该位置开始的新消息。数据传输是顺序进行的,Leader 会逐步发送数据,确保 Follower 及时获得最新的数据。
- 数据确认:Follower 在接收到数据后,会将其写入本地磁盘,并更新自己的 日志文件(Log)。然后,Follower 会向 Leader 发送一个确认信号,表示该数据已经成功存储。
2.3 跟踪同步状态
- Kafka 中有一个重要的概念叫 ISR (In-Sync Replicas),表示当前与 Leader 同步的所有副本。每个副本的同步状态是由 Leader 和 Follower 通过心跳和数据确认机制来维护的。如果一个副本滞后过多,它会被移出 ISR。
- 如果 Follower 无法及时与 Leader 保持同步(例如因为网络延迟、磁盘瓶颈或其他原因),它将被踢出 ISR。只有处于 ISR 中的副本才是 同步副本,可以确保数据的一致性。
2.4 同步进度检查
Kafka 还会定期检查每个 Follower 与 Leader 之间的同步进度,确保所有副本都能及时跟上 Leader。
- Replica Lag:如果 Follower 副本的日志落后于 Leader,这个差距被称为 Replica Lag,它通常通过
replica.lag.time.max.ms
或 replica.lag.max.messages
来限制。如果 Follower 的 Replica Lag 超过这些阈值,它会被移出 ISR。
- Follower 会在每次请求中携带自己的 高水位(High Watermark),Leader 会根据这个水位来决定要发送哪些数据。
2.5 Leader 选择和恢复
- 如果 Leader 副本崩溃或不可用,Kafka 会通过 Leader 选举 机制来选择一个新的 Leader。此时,ISR 中的 Follower 会被提升为 Leader,而其他的 Follower 会继续从新的 Leader 获取数据。
- ISR 的恢复:如果某个 Follower 被移出 ISR,恢复同步后,它可以重新加入 ISR,只要它与 Leader 的日志一致。
3. 数据同步的优化
为了优化数据同步过程,Kafka 采用了以下策略:
- 批量拉取:Follower 并不是每次拉取一个单独的消息,而是批量拉取多个消息。Kafka 通过批量机制减少了网络请求的次数,提高了同步效率。
- 流式传输:Kafka 支持 流式传输 数据,Follower 会通过流式读取的方式接收数据,确保高效的数据同步。
- 异步确认:Kafka 允许 异步确认,即 Follower 在接收到数据后不立即向 Leader 发送确认, Leader 会等待一段时间再进行确认,这样可以减少请求的频率,提高吞吐量。
4. Follower 副本的失败与恢复
- Follower 出现故障:如果 Follower 副本因为网络问题、磁盘故障等原因无法同步数据,它会被移出 ISR。如果 Follower 恢复正常,它会重新向 Leader 请求数据,并从 Leader 获取最新的消息,直到与 Leader 达到一致。
- 数据丢失:在 Follower 和 Leader 数据不一致时,Kafka 保证 只要副本在 ISR 中,数据就是一致的,一旦副本落后太多并被移出 ISR,它将不会参与投票,因此不会影响数据的一致性。
5. 关键配置
以下是与 Follower 和 Leader 数据同步相关的一些关键配置:
replica.fetch.max.bytes
:设置 Follower 每次请求的最大字节数。
replica.fetch.wait.max.ms
:设置 Follower 等待 Leader 响应的最大时间。
replica.lag.time.max.ms
:设置 Follower 副本允许的最大延迟时间,超过此时间,Follower 会被移出 ISR。
min.insync.replicas
:设置在生产者写入消息时,至少需要多少个同步副本确认写入才能成功。