“说一下Kafka中Partition分区副本的Leader选举算法”

我敢说,这个问题百分之99的程序员答不上来,不服,来评论区打我的脸。

这个问题确实有一定的难度,不知道也可以理解,我把答案整理在50万字的大厂面试指南里面,大家可以在文章尾端领取。

问题分析

在Kafka的架构中,一个Topic逻辑主题,可以分成多个Partition分区实现消息内容的物理存储。

同时,为了保证Partition分区的可靠性,Kafka设计了分区副本的概念,也就是一个Partition可以设置多个副本。

在多个副本中,由于设计到数据的同步,所以Kafka针对Partition分区副本集,设置了Leader副本和Follower副本。

Leader副本负责处理所有的读写请求,Follower副本,只负责从Leader副本同步数据。

kafka重新分配分区数据_分布式

而这个问题,就是去了解候选人对于Partition分区副本集中的Leader选举机制的了解,所以如果希望获得面试官的青睐,至少要回到到具体的点上。

因为在Kafka中,除了Partition分区副本的Leader选举以外,还有Kafka集群本身的Leader选举,这两个不是同一个东西,千万别搞混了。

问题答案

Kafka首先会选择一个具有最新数据的副本作为新的Leader,也就是ISR集合中的副本。

其中,ISR(In-Sync Replica)是指与Leader同步的副本集合,它们的数据同步状态与Leader最接近,并且它们与Leader副本的网络通信延迟最小。

如果ISR集合中没有可用的副本,Kafka会从所有副本中选择一个具有最新数据的副本作为新的Leader。

在这种情况下选举出来的Leader,由于和原来老的Leader节点的数据存在较大的延迟,会造成数据丢失的情况,所以Kafka设计者把这个功能开关的选择交给了开发者,如果愿意接受这种情况,可以通过unclean.leader.election.enable参数来设置。

开启之后虽然会造成数据丢失,但是至少可以保证依然能对外提供服务,保证了可用性。

总结

大家知道怎么回答了吗?