副本机制就是备份机制,指的是在分布式集群机器中保存着相同的数据备份。mysql
那么副本机制的好处的是什么呢?sql
总之: 副本机制是kafka确保系统高可用和高持久的重要基石。api
所谓副本,本质上就是一个只能追加写消息的提交日志。这些日志被相同的分散保存在不一样的Broker上。
在实际生产上,每台Broker均可能保存有各个主题下不一样分区的不一样副本。所以单个Broker上存有成百上千个副本现象是很是正常的。
既然多个Broker中保存分区下的多个副本,那么是如何保证副本当中的数据都是一致的呢? 异步
针对这个问题,kafka的解决方案就是领导者副本机制分布式
领导者的副本机制工做原理
必定注意上面第二点,追随者副本是不会对外提供服务的。这也是kafka没能提供读操做横向扩展的根本缘由,并且它也不像mysql副本同样有”抗读“的做用,帮助领导者减轻压力。那么这种副本机制设计究竟有什么好处呢?
1.方便实现“Read-your-writes”spa
顾名思义,就是当你使用生产者api向kafka成功写入消息后,就立刻使用消费者api去读取刚才的消息。
举个例子,就是你刚发完一条微博,确定是但愿立马可以看到的。这就是Read-your-writes场景了。若是追随者副本对外提供服务的话,因为副本同步是异步的,所以有可能发生追随者副本尚未及时从领导者副本中拉取最新消息,从而使客户端看不到最新的消息。
2.方便实现单调读设计
什么是单调读。单调读就是消费者在屡次读消息时候,不会看到一条消息一下子存在一下子不存在。
例如:若是容许追随者副本提供读服务,那么假设当前有两个追随者副本F1,F2。生产者往领导者中发送了消息后,F1,F2开始异步拉取消息。若F1拉取成功了,而F2还未拉取成功。此时消费者第一次消费F1副本获取最新消息,第二次消费的时候消费到了F2副本。就获取不到该条消息了。这就不是单调读一致性。因此都由Leader副原本处理请求的话,就能实现单调读。
上文说起到的追随者副本不对外提供服务,只是按期的异步拉取消息。既然是异步的,那么就存在着不可能与Leader实时同步的风险。因此kafka应该告诉咱们,追随者副本到底在什么条件之下才算与Leader同步。3d
基于这个想法,kafka引入了ISR,副本集合。ISR中的副本都是与Leader同步的副本,相反,不在ISR中的追随者副本被认为是与Leader不一样步的。那么进入ISR到底须要知足什么条件才能进入呢。日志
首先须要明确一点。ISR不仅是追随者副本集合,它必然包括Leader副本。甚至在某些状况下,ISR只有Leader这一个副本。blog
图中有3个副本:1个领导者副本,2个追随者副本。领导者副本写入了10条消息,F1同步了6条,F3同步了3条。那么哪一个追随者副本与Leader不一样步呢?
事实上,这两个副本都有可能与Leader副本不一样步,但也可能同步。它实际上不是依靠与消息条数来进行判断的。 而是根据Broker端参数replica.lag.time.max.ms参数值。这个参数的含义就是Follower副本可以落后Leader副本的最长时间间隔,当前默认值是10秒。
这就是说,只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即便此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。如果同步过程的速度持续慢于Leadr副本的写入速度,那么在replica.lag.time.max.ms时间后,kafka就会自动收缩ISR集合,将改副本提出集合。
值得注意的是,若改副本后面慢慢追上了Leader的进度。那么它是能够被从新放入ISR集合中的。这也代表ISR是一个动态调整的集合,而非静态不变的。
既然ISR能够动态调整,那么就会出现ISR为空的状况。ISR为空的状况就表明Leader副本也挂掉了。那么kafka就须要从新选举新的Leader。
那么该怎么选举Leader呢?
- kafka把全部不在ISR的存活副本都成为非同步副本。
- 一般来讲,非同步副本落后Leader太多,所以,若是选择这些副本为新的Leader,就可能出现数据的丢失。在kafka,选举Leader这种过程被成为Unclean。由Broker端参数unclean.leader.election.enable控制是否容许Unclean领导者选举。
- 开启 Unclean 领导者选举可能会形成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于中止对外提供服务,所以提高了高可用性。反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。
能够根据你的实际业务场景决定是否开启 Unclean 领导者选举。不过并不建议开启它,毕竟咱们还能够经过其余的方式来提高高可用性。若是为了这点儿高可用性的改善,牺牲了数据一致性,那就很是不值当了。