Kafka面试题总结

1、kafka是什么? 可以用来做什么?

Kafka 是一个分布式的、高吞吐量的、可持久性的、自动负载均衡的消息队列。

它不仅可以实现传统意义上MQ功能,异步解耦削峰

还可以作为大数据的流处理平台。

2、为什么kafka安装需要依赖Zookeeper?
  • 配置中心,管理Broker、Topic、Partition、Consumer的信息,包括数据的变动。
  • 负载均衡,Broker在ZK注册watch,从而感知Broker的上下线。
  • 集群管理和选举,选举产生Controller。
3、pull和push,kafka支持哪种消费模型?为什么这么设计?

kafka支持的pull,因为在push模式下,如果消息产生速度远远大于消费者消费消息的速率,那消费者就会不堪重负(你已经吃不下了,但是还要不

断地往你嘴里塞),直到挂掉。而且消费者可以自己控制一次到底获取多少条消息,通过max.poll.record 来控制。

4、Topic的用途是什么?为什么Kafka没有队列?

Topic 将消息分类,生产者和消费者面向的是同一个 Topic。生产者和Topic、Topic和消费者的关系都是多对多。一个生产者可以发送消息到多个Topic,一个消费者也可以从多个Topic获取消息。

5、分区Patition的作用是什么?

为了实现扩展性,提高并发能力。类似于分库分表,实现的也是横向扩展负载的目的。

6、分区数和副本数怎么设置?

分区数目,需要根据具体项目情况通过使用官方提供的测试工具kafka-producer-perf-test.shkafka-producer-perf-test.sh来测试。

副本数量也可以通过测试脚本得到最优解,不过副本数量一定小于Broker数量,否则会报错。

7、分区的副本在Broker上是怎么分布的?

假设有3个Broker,一个Topic有两个分区,每个分区两个副本,可能的分布情况是什么样的?

  1. 第一个分区的第一个副本放置位置是随机从 broker集合选择的;
  2. 其他分区的第一个副本放置位置相对于第一个分区依次往后移;
  3. 每个分区剩余的副本相对于第1个副本放置位置其实是由nextReplicaShift决定的,而这个数也是随机产生的。
8、Segment的作用是什么?

将一个Partition分成多个Segment,不至于一个Partition过大,导致消息查询读取的速度变慢。提高查询读取消息的效率。

9、Consumer Group的含义是什么?

Consumer Group是消费者组的意思,多个Consumer通过设置相同的group id来组成一个Consumer Group。同一个Consumer Group的Consumer消费同一个Topic是互斥的,而且一个partition只能由组内的一个Consumer来消费。多个Consumer消费一个Topic提高了消费消息的吞吐量

10、Consumer Group上次消费的偏移量记录在哪里?怎么更新?

Consumer Group上次消费的偏移量记录在_consumer_offset 的Topic中,主要以GroupMetadataOffsetAndMetadata两个对象存储。这里OffsetAndMetadata保存了消费者组和partition和offset位移信息的元数据。

Consumer Group的偏移量,只有在消费者消费完消息,提交以后,才会更新。

11、生产者送消息如何选择分区?
  1. 如果消息创建的时候指定了分区,就去指定的分区。
  2. 没有制定分区,使用了自定义的分区器,根据分区器计算出去哪个分区。
  3. 没有指定partition值但有key的情况下,使用默认分区器DefaultPartitioner,将key的hash 值与topic的 partition 数进行取余得到partition值;
  4. 既没有partition值又没有key值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与topic可用的partition总数取余得到partition值,也就是常说的round-robin算法。
12、生产者acks 1 0 -1的含义是什么?
  1. acks=0,Broker接收到消息就返回(还未写入磁盘)。延迟最低,若Broker故障,丢数据的风险大。
  2. acks=1,等到Partition的leader落盘成功后返回ack,若follower同步成功之前,leader故障,会丢失数据。
  3. acks=-1,Partition的leader和follower全部落盘以后才返回ack。
13、消息主要的物理存储文件有哪些?

14、Kafka中有哪些索引类型?消息怎么通过索引检索?

偏移量索引和时间戳索引。

比如我要检索偏移量是10002673的消息。

  1. 消费的时候是能够确定分区的,所以第一步是找到在哪个segment 中。Segment文件是用base offset命名的,所以可以用二分法很快确定(找到名字不小于10002673的segment)。
  2. 这个segment有对应的索引文件,它们是成套出现的。所以现在要在索引文件中根据offset找position。
  3. 得到position之后,到对应的log文件开始查找offset,和消息的 offset进行比较,直到找到消息。
15、kafka的稀疏索引,间隔由什么决定?为什么不用B+Tree?

间隔有消息的大小决定,只要写入消息超过4K,则偏移量索引增加一条记录。

16、Kafka的日志文件不可能无限扩大,那么可以通过哪些方式释放磁盘空间?

可以有两种方式释放,一种是delete删除,一种是compact压缩。

delete方式,是通过定时任务来执行的,执行间隔默认是5分钟,可以设置。也可以通过配置,确定哪些消息需要删除。

compact方式,是通过保存key相同的最后一个value,来进行压缩的。

17、Kafka副本Leader是怎么选举的?谁来选举?选谁为Leader?什么是AR?什么是ISR?什么是OSR?

副本的leader是通过Controller来选举的 ,使用微软的PacificA算法。在这种算法中,默认是让ISR中第一个replica变成leader。比如ISR是1、5、9,优先让1成为leader。

AR是Assigned-Replicas,一个分区所有的副本。

ISR是In-Sync Replicas,是这些所有的副本中,跟leader 数据保持一定程度同步的。

OSR是Out-Sync Replicas,是跟leader同步滞后过多的副本。

18、Kafka副本follower怎么向Leader同步?什么是HW?什么是LEO?
  • HW(Hight Watermark)是副本水位值,表示分区中最新一条已提交(Committed)的消息的Offset。

  • LEO:Log End Offset,Leader中最新消息的Offset。

  1. follower节点会向Leader发送一个fetch请求,leader向follower’发送数据。
  2. follower接收到数据响应后,依次写入消息并且更新LEO
  3. leader更新HW (ISR最小的LEO)。
19、kafka的offset怎么维护?存在哪里?什么时候更新?

同10

20、一个消费组中的消费者与分区的关系是什么样的?例如topic有3个分区,假如有2个消费者,怎么分配?假如有4个消费者,怎么分配?

假如Topic有3个分区,2个消费者;

这里涉及到,消费者配置是消费策略,如果是RangeAssignor(范围分配),则可能的结果是,{(1,2)(3)}或者{(1){2,3}}

如果是RoundRobinAssginor(轮询),则可能是{(1,3)(2)}

如果是StickyAssignor(粘滞),可能是{(1,2)(3)};{(1){2,3}};{(2){1,3}}

假如是3分区,4个消费者的话,前3个消费者一个人一个,第四不消费。

  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值