kafka副本
副本机制(Replication)
对于单个partition而言,在集群中是单点的。一旦该partition不可用,那么partition中的消息就消费不了了,所以kafka通过副本机制备份。
副本角色
Leader副本
每个Partition有且只有一个副本可以作为leader。
负责所有Producer、Consumer的请求。
Producer提交消息后,复制消息到所有的同步副本。
Follower副本
每个Partition中,除了Leader以外的所有Replica均为Follower副本。
不处理任何来自客户端的请求,只通过Fetch Request拉取Leader replica的数据进行同步。
ISR副本
包含leader副本和所有与leader副本保持同步的follower副本。
OSR副本
由于同步落后而被剔除的副本列表。
AR副本
所有副本集合:ISR + OSR
如何判断follower副本是不是同步副本?
过去10S从M副本获取过消息,并在过去6S与ZK发送过心跳。
副本因子(replication-factor)
决定了副本的个数。
如果副本因子是3,那么包含Leader副本在内,所有副本个数是3。
副本分配策略
多个副本如何分配到不同的broker上?
Partition排序的时候,第i个partition分配到(i mod n)broker上,那么第i个partition的第j个副本分配到(i+j mod n)borker。
如何知道leader副本在哪个borker上?
在zk上查,get /brokers/topics/secondTopic/partitions/1/state,查询结果
leader_epoch:0 表示partition 1 的leader副本在broker0 上。
Isr:当前可用且消息量与leader差不多的partition的副本集,也就是说如果某副本最后一条消息的offset与leader副本最后一条消息的offset之差超过阀值(replica.lag.time.max.ms),那么该副本会被踢出isr。
绿色是leader副本
副本数据同步
首先,写请求先写入leader副本,再同步到follower副本,那么follower副本的数据略少于leader副本是可以容忍的,只要不超过阀值。
当然如果follower副本长时间没有同步数据,会被leader副本踢出,因为当Acks设置为all(-1)时,如果某个follower故障导致HW无法递增,那么消息就无法提交,也就不会有后续的数据写进来。
副本同步机制
Consumer消费数据时,只能消费到HW的位置。HW之后的数据对consumer来说是不可见的。
Acks = 1时,消息被leader副本记录后则提交成功,然后leader副本再将消息同步给follower副本(类似异步复制)。所以leader宕机后,HW~LEO之间的数据可能会丢。
Acks设置为all(-1)时,消息被ISR副本记录后则提交成功(类似同步复制)。所以all的数据安全性是最高的。
副本属性
LEO
日志末端位移(log end offset)
记录了该副本底层日志(.log)中下一条消息的offset。
如果LEO=10,那么该副本保存了10条数据,offset为[0,9]。
HW
水位值
新消息被ISR副本同步后,HW才会移到这条消息的位置。
HW的值小于等于LEO。
副本(replica)都宕机了怎么办?
1.等待ISR中任一副本活过来,选它作为leader
2.选择第一个活过来的副本作为leader(不一定是ISR中的)