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中的)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值