Kafka的高可靠性的保障来源于其健壮的副本(replication)策略。通过调节其副本相关参数,
可以使得Kafka在性能和可靠性之间运转的游刃有余。Kafka从0.8.x版本开始提供partition级别的复制,
replication的数量可以在$KAFKA_HOME/config/server.properties中配置。

default.replication.refactor
1、repcation机制

为了提高消息的可靠性,Kafka每个topic的partition有N个副本(replicas),其中N(大于等于1)是topic的复制
因子(replica fator)的个数。Kafka通过多副本机制实现故障自动转移,当Kafka集群中一个broker失效情况下
仍然保证服务可用。在Kafka中发生复制时确保partition的日志能有序地写到其他节点上,N个replicas中,
其中一个replica为leader,其他都为follower, leader处理partition的所有读写请求,
(leader读写请求:kafka是由follower周期性或者尝试去pull(拉)过来(其实这个过程与consumer消费过程非常相似),
写是都往leader上写,读也只在leader上读,flower只是数据的一个备份,保证leader被挂掉后顶上来,
并不往外提供服务),follower会被动定期地去复制leader上的数据。

2、ISR机制

Kafka提供了数据复制算法保证,如果leader发生故障或挂掉,一个新leader被选举并被接受客户端的消息成功

写入。Kafka确保从同步副本列表中选举一个副本为leader,或者说follower追赶leader数据。

kafka 复制因子无效 kafka主从复制原理_数据


**注意:**当ISR中的个副本的LEO不一致时,如果此时leader挂掉,选举新的leader时并不是按照LEO的高低进行选举,而是按照ISR中的顺序选举。

ISR (In-Sync Replicas),这个是指副本同步队列。副本数对Kafka的吞吐率是有一定的影响,但极大的增强了可用性。默认情况下Kafka的replica数量为1,即每个partition都有一个唯一的leader,为了确保消息的可靠性,通常应用中将其值(由broker的参数offsets.topic.replication.factor指定)大小设置为大于1,比如3。 所有的副本(replicas)统称为Assigned Replicas,即AR。ISR是AR中的一个子集,每个Partition都会有一个ISR,而且是由leader动态维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度。

##延迟时间
replica.lag.time.max.ms
##延迟条数
replica.lag.max.messages两个维度,

当前最新的版本0.10.x中只支replica.lag.time.max.ms这个维度),

replica.lag.time.max.ms

任意一个超过阈值都会把follower剔除出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。

还有两个概念HW和LEO。HW俗称高水位,HighWatermark的缩写,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置。另外每个replica都有HW,leader和follower各自负责更新自己的HW的状态。
对于leader新写入的消息,consumer不能立刻消费,leader会等待该消息被所有ISR中的replicas同步后更新HW,
此时消息才能被consumer消费。这样就保证了如果leader所在的broker失效,该消息仍然可以从新选举的leader中获取。对于来自内部broker的读取请求,没有HW的限制。