分区策略:
分区原因:
方便在集群中扩展,每个partition可以通过调整以适应他所在的机器,而一个topic又可以由多个partition组成,因此整个集群就可以适应任意大小的数据
可以提高并发 因为可以以partition为单位进行读写
分区原则:
将producer发送的数据封装成一个ProducerRecord对象
1)在指明partition的情况下,直接将指明得知当做partition的值
2)没有指明partition的值但是有key的值 将key的hash值与topic的partition的个数进行取余得到partition的值
3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法
为可保证producer发送的数据能可靠的发送到指定的topic上,topic的每个partition收到producer发送的数据后 都需要向producer发送ack确认指令,如果producer收到ack指令就会进行下一轮的发送,否则重新发送数据
面试题目:
1)何时发送ack?
确保有follower与leader同步完成时,leader在发送ack,这样才能保证leader挂掉之后在能从follower中选举出新的leader
2)多少个follower同步完成后发送ack
半数以上的follower完成同步即可发送ack,或者当全部的follower完成同步后下发送ack
副本数据同步策略:
方案一:半数以上完成同步,就发送ack
优点:延迟低
缺点:选举新的 leader 时,容忍 n 台节点的故障,需要 2n+1 个副本
方案二:全部完成同步发送ack
优点:选举新的leader时容忍n台结点故障,需要n+1个副本
缺点:延迟高
kafka选择第二种方案 原因:
同样是为了容忍n台结点故障,第一种方案需要2n+1个副本,而第二种方案需要n+1个副本,而kafka的每个分区中有大量的数据,第一种方案会造成大量数据的冗余 虽然第二种方案的延迟性比较高,但是网络延迟对kafka的延迟比较小
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
ack应答机制
对于某些不太重要的数据来说,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,没必要等到ISR中的follower全部接收成功
kafka为用户提供了三种可靠级别:
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 发生故障,那么会造成 数据重复
故障处理
LEO:指的是每个副本最大的offset
HW:指的是消费者能见到的最大的offset ISR中最小的LEO
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同步数据
注意:这只是保证的副本之间数据的一致性,并不能保障数据不丢失或者不重复
标签:同步,生产者,ISR,partition,kafka,ack,follower,leader From: https://www.cnblogs.com/lkd0910/p/16936822.html