• kafka的数据同步原理ISR、ACK、LEO、HW


    1、数据可靠性保证,数据同步

      为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果 producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。

       

      Kafka副本同步选择了第二种方案,全部同步完成才发送ack,原因如下:

         1.同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1 个副本,而 Kafka 的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。

         2.虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。

    2、ISR原理,

      采用第二种方案之后,设想以下情景:leader 收到数据,所有 follower 都开始同步数据, 但有一个 follower,因为某种故障,迟迟不能与 leader 进行同步,那 leader 就要一直等下去, 直到它完成同步,才能发送 ack

        这个问题怎么解决呢? Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集 合。

        当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower 长时间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由 replica.lag.time.max.ms 参数设定。。Leader 发生故障之后,就会从 ISR 中选举新的 leader。

     

      

    3、acks,副本同步

      acks 参数配置:

         0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还 没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据

         1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower 同步成功之前 leader 故障,那么将会丢失数据;

        -1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才 返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会 造成数据重复

    4、如果保证数据一致性

       log

      

        LEO指的是每个副本最大的 offset,日志末端位移,也就是replica中下一条待写入消息的offset,注意哈,是下一条并且是待写入的,并不是最后一条,这个LEO个人感觉也就是用来标示follower的同步进度的。

        HWreplica高水印值,副本中最新一条已提交消息的位移。leader 的HW值也就是实际已提交消息的范围,每个replica都有HW值,但仅仅leader中的HW才能作为标示信息。

         (1)follower 故障

          follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后,follower 会读取本地磁盘 记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。 等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重 新加入 ISR 了

       (2)leader 故障

           leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的 数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader 同步数据。 

        注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

        0.11 版本的 Kafka,引入了一项重大特性:幂等性 , 来确保数据一致性

     

    kafka会引起的几个问题,及如何解决的

    1、kafka如何保证消息发送成功
      ack,副本全部同步完才发送ack给生产者,保证消息发送成功
    2、ack如果一个副本故障,怎么办
      kafka引入ISR,类似哨兵模式,检查副本是否故障,在一定时间不响应自动剔除
    3、副本如何确保数据一致性
      HW、LEO,

     

  • 相关阅读:
    【TensorFlow】tf.nn.max_pool实现池化操作
    nginx页面不能正常访问排除方法
    Nginx启动错误:error while loading shared libraries: libpcre.so.1
    解决:make:cc 命令未找到的解决方法
    spring mvc:练习:表单验证(javaConfig配置和注解)
    spring mvc:练习:javaConfig配置和注解
    SpringMvc中的校验框架@valid和@validation的概念及相关使用 和BindingResult bindingResult
    springmvc的@Validated/@Valid注解使用和BindingResult bindingResult
    spring MVC注解深入研究
    spring mvc: 注解和JavaConfig实例
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/15251698.html
Copyright © 2020-2023  润新知