ISR 理解:
isr 的全称是:In-Sync Replicas isr 是一个副本的列表,里面存储的都是能跟leader 数据一致的副本,确定一个副本在isr列表中,有2个判断条件
条件1:根据副本和leader 的交互时间差,如果大于某个时间差 就认定这个副本不行了,就把此副本从isr 中剔除,此时间差根据配置参数rerplica.lag.time.max.ms=10000 决定 单位ms
条件2:根据leader 和副本的信息条数差值决定是否从isr 中剔除此副本,此信息条数差值根据配置参数rerplica.lag.max.messages=4000 决定 单位条
isr 中的副本删除或者增加 都是通过一个周期调度来管理的
kafka 根据isr 机制和消息的ack方式保证的数据的一致性和保证幂等性(消息是否会重复消费。发送等)
base offset:起始位移,replica中第一天消息的offset
HW:replica高水印值,副本中最新一条已提交消息的位移。leader 的HW值也就是实际已提交消息的范围,每个replica都有HW值,但仅仅leader中的HW才能作为标示信息。什么意思呢,就是说当按照参数标准成功完成消息备份(成功同步给follower replica后)才会更新HW的值,代表消息理论上已经不会丢失,可以认为“已提交”。
LEO:日志末端位移,也就是replica中下一条待写入消息的offset,注意哈,是下一条并且是待写入的,并不是最后一条。这个LEO个人感觉也就是用来标示follower的同步进度的。
1、broker 收到producer的请求
2、leader 收到消息,并成功写入,LEO 值+1
3、broker 将消息推给follower replica,follower 成功写入 LEO +1 (ack 1 一个机器 -1 all 0 不需要)
…
4、所有LEO 写入后,leader HW +1
5、消息可被消费,并成功响应