在Kafka中一个分区日志其实就是一个备份日志,kafka利用多个相同备份日志来提升系统的可用性。这些备份日志其实就是所谓的副本。网络
Kafka的副本具备leader副本和follower副本之分,leader副本为客户端提供读写请求,follower副本只是用于被动地从leader副本中同步数据,对外不提供读写服务。spa
Kafka的全部节点全部副本假设都在正常运行,那么leader副本会一直不变,可是所谓世界上没有绝对稳定的系统,一旦kafa的leader副本节点出现了问题,那么follower副本须要竞争上岗成为leader副本,可是并非全部的follower副本都有资格竞争上岗,很明显假设一个follower落后的数据远远少于leader副本,它是没有资格的。所以Kafka内部维护了一组具备资格的follower副本,他们统称ISR。日志
ISR中的副本会被剔除,也会有新增。blog
下图主要讲述了Kafka日志中重要概念,下图的相关概念事关生产、消息消费、ISR以及副本同步机制。进程
ISR其实就是Kafka内部维护的具备竞争上岗的一组与leader同步follower的副本集合。rem
follower副本与leader副本不一样步的缘由:kafka
该参数用来检测同步数据请求速度追不上的问题,若是ISR中的副本消息数落后于leader副本的消息数超过了该参数的设置,将会被踢出ISR。同步
这个参数在kafka0.9.0.9版本以后被移除,为何被移除呢?it
确定是有他的弊端的。考虑如下这个状况,kafka在的生产者的生产速率不是平稳的,会有高峰会有低峰,在高峰的时候,因为消息大量汇集产生,致使ISR中的消息与Leader的消息差超过了该数值,所以ISR中的副本将会被踢出。class
但随着生产消息速率的稳定和降低,而且此时follower副本也在全力追赶leader副本,当follower副本从新追上leader副本时,又会从新加入ISR。
该参数用来检测另两种状况:若是在该时间内,follower副本没法向leader副本请求数据,那么将会被踢出ISR。
因为在新的版本中移除了replica.lag.max.messages参数的设置,所以replica.lag.max.ms也用于同步数据请求速度追不上问题的检测,但用在次问题的检测上时,检测机制是只要follower副本落后于leader的时间不持续性超过该参数即视为同步,若是持续性超过该参数即视为不一样步。