Kafka 中如何进行主从同步?
1 个回答
不要和差点意思的人周旋。流月在 Kafka 中,主从同步(Leader-Follower 同步)是通过动态维护一个同步状态的副本集合(ISR,In-Sync Replicas)来实现的。这个集合中的所有节点(副本)都与 Leader 保持高度同步,确保数据的一致性。以下是 Kafka 主从同步的详细机制和实现方式。 ### 1. **ISR(In-Sync Replicas)机制** - **ISR 集合**:ISR 是一组与 Leader 副本保持同步的 Follower 副本的集合。只有在 ISR 集合中的副本才被认为是同步副本,确保数据的一致性和可靠性。任何一条消息只有被 ISR 集合中的所有副本读取并追加到日志中,Kafka 才会认为该消息已经被提交(即被确认存储)。 - **动态维护**:Kafka 会动态维护 ISR 集合。如果某个 Follower 副本的同步进度落后于 Leader 过多,它会被暂时从 ISR 集合中移除,直到重新同步后再加入。 ### 2. **同步复制** - **Producer 发送消息**: - Producer 首先通过 Zookeeper 或 Kafka 集群中的元数据服务识别出某个分区的 Leader 副本,然后将消息发送给 Leader。 - **Leader 处理消息**: - Leader 收到消息后,首先将消息写入本地的日志文件(log)。这一过程是同步完成的,确保消息已经在 Leader 上持久化。 - **Follower 拉取消息**: - Follower 副本会定期向 Leader 拉取(Pull)新消息,将这些消息写入到各自的本地日志文件中。 - **Ack 确认**: - 当 Follower 成功将消息写入日志文件后,会向 Leader 发送一个确认(Ack)。 - 当 Leader 收到 ISR 集合中所有 Follower 的 Ack 确认后,Leader 会向 Producer 返回一个成功的确认 Ack,表明消息已经被安全复制并存储。 ### 3. **异步复制** - **Producer 异步发送**: - 在异步复制模式下,Producer 不会等待消息被真正存储到 Kafka Broker 上,而是将消息放入一个内部的阻塞队列(BlackingQueue)中,然后立即返回给应用程序,提升吞吐量。 - **后台线程发送**: - Producer 内部有一个专门的线程(ProducerSendThread),它会不断从队列中取出消息,并通过同步方式将消息发送到 Kafka Broker。 - **批量发送**: - 为了提升网络效率,Producer 在内存中缓存消息,当累计到一定阈值时,会将消息批量发送到 Broker。这样可以减少网络 I/O 操作,提高整体效率。 - **风险**: - 如果在达到批量发送的阈值前,Producer 崩溃或不可用,那么缓存中的数据将丢失,造成数据的不一致性和丢失风险。 ### 4. **同步与异步的权衡** - **同步复制**:保证数据一致性和可靠性,适用于对数据持久性要求高的场景。缺点是延迟较高,因为需要等待所有 Follower 的确认。 - **异步复制**:提高了吞吐量和性能,适用于对延迟敏感的场景,但存在数据丢失的风险。 通过合理选择同步或异步复制策略,Kafka 可以在不同场景下平衡数据一致性、可靠性和系统性能,满足多种业务需求。发布于 2024-09-03 18:04 •IP属地 辽宁举报评论收藏
公众号进入网站体验更佳

