文章目录
- kafka的副本机制
- ACKS
- In-Sync Replicas(ISR)
- Unclean leader election
- min.insync.replicas
- acks=1的情况
- acks=-1的情况
- acks=-1和min.insync.replicas=2的情况
- 同步机制
- 1.follower不对外提供服务的原因
- 2.幂等性的实现
kafka的副本机制
假如3分区,3副本的topic数据分布:
ACKS
请求完成之前,生产者要求收到的应答数量,可以控制发送数据是否持久化。
- acks=0:生产者不会等待broker返回确认信息(生产者只要发送完数据即认为已经写入成功)。在这种情况下,无法保证服务器已收到记录,重试配置也不会生效(因为客户端通常不会知道任何故障)。
- acks=1:此时只会等待leader将数据写入到本地日志后发送确认,不会等待所有follower的确认。在这种情况下,如果leader在确认记录后立即失败(follower还未同步数据),数据将丢失。
- acks=all或-1:会等待leader和所有处于ISR集合中的follower发送确认。all和-1相同,唯一区别在于如果需要启用幂等性,则需要设置为all。
In-Sync Replicas(ISR)
ISR简单来讲就是与leader保持同步状态的副本的集合。ISR集合里包含leader副本和0到多个follower副本。
如果一个follower在设定的replica.lag.time.max.ms时间周期内时刻保持与leader的数据更新,则认为该follower是同步的,它将被leader保留在ISR列表中,反之将被从ISR中剔除。
在下列场景中follower将会被移除ISR列表:
- 与zookeeper的会话断开(zookeeper.session.timeout.ms)
- follower未在指定时间内向leader发出fetch操作请求(replica.fetch.wait.max.ms,需要小于lag.time)
- follower的数据更新时间与leader落后太多(replica.lag.time.max.ms)
Unclean leader election
是否允许将新leader切换到数据不同步的follower(故障切换时,unclean.leader.election.enable)
默认false,不允许将leader切换到不同步的follower。
min.insync.replicas
生产者acks设置为all或-1时,指定必须写入成功的最小副本数。如果不能满足最小值,生产者将抛出异常。
acks=1的情况
生产者只会等待leader写入就返回。此时如果leader所在节点发生故障
- 如果副本均在ISR中,只要ISR中有一个follower与leader同步,可以发生故障切换,不会丢数据
- 如果副本均在ISR中,但follower均落后一点leader,此时如果发生切换,会丢数据。如果不允许切换,会停止服务。只需恢复broker,就不会丢数据
acks=-1的情况
生产者会等待leader和所有follower写入才返回。此时如果leader所在节点发生故障
- 如果副本均在ISR中,可以正常切换,不会丢数据
- 如果在之前有副本因为落后被踢出ISR集合,导致ISR集合中仅剩leader,此时如果发生切换,会丢数据。如果不允许切换,会停止服务。
此时如果副本均在ISR中,但稍微落后leader时,会增加对应的写入延迟。
acks=-1和min.insync.replicas=2的情况
生产者会等待leader和所有follower写入才返回。此时如果leader所在节点发生故障
- 如果副本集合中仅剩leader时,此时写入会直接抛出异常
同步机制
HighWatermark
标识特定的消息偏移量(offset)。
- 消费者只能消费到HW所在的位置
- 取分区ISR集合中最小的LEO为HW
Log End Offset
标识当前日志文件中下一条待写入的消息偏移量(offset)。
- 每个分区副本都各自有LEO,Leader和follower各自负责更新自己的LEO
1.刚开始,此时HW=2
leader和follower的LEO=2
2.生产者写入消息到leader,此时HW=2
leadeLEO=4,follower0和1 LEO=2
3.部分数据同步之后,HW=3
leader LEO=4,follower0 LEO=3,follower1 LEO=3
4.完全同步之后,HW=4
leader LEO=4,follower0 LEO=4,follower1 LEO=4
1.follower不对外提供服务的原因
由于副本同步不是完全同步的,ISR集合也随时在变化。
- 可能出现follower还没有从leader处拉取到最新消息,此时如果follower对外提供服务,客户端会看不到最新写入的消息。
- 也可能出现多个follower的数据不同步,此时如果多次消费看到的数据会产生不一致性。
2.幂等性的实现
引入PID(ProducerID)和SequenceNumber来避免消息重复发送