Kafka面试题
- 1. Kafka中的ISR、AR又代表什么?
- 2. Kafka中的HW、LEO等分别代表什么?
- 3. Kafka中是怎么体现消息顺序性的?
- 4. Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
- 5. Kafka生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?
- 6. 消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?
- 7. 消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?
- 8. 有哪些情形会造成重复消费?
- 9. 那些情景会造成消息漏消费?
- 10. 当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?
- 11. topic的分区数可不可以增加减少?为什么?
- 12. kafka producer如何优化打入速度
- 13. Kafka有内部的topic吗?如果有是什么?有什么所用?
- 14. Kafka分区分配的概念?
- 15. 简述Kafka的日志目录结构?
- 16. 如果我指定了一个offset,Kafka Controller怎么查找到对应的消息?
- 17. 聊一聊Kafka Controller的作用?
- 18. Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?
- 19. 失效副本是指什么?有那些应对措施?
- 20. Kafka的那些设计让它有如此高的性能?
1. Kafka中的ISR、AR又代表什么?
AR:Assigned Replicas 所有副本,包括主
ISR:In-Sync Replicas 副本同步队列 (ISR由leader维护,follower从leader同步数据有一些延迟)
(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度)
当前最新的版本0.10.x中只支持replica.lag.time.max.ms这个维度),任意一个超过阈值都会把follower剔除出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。
AR=ISR+OSR。
2. Kafka中的HW、LEO等分别代表什么?
LEO:(Log End Offset)每个副本的最后条消息的offset
HW:(High Watermark)俗称高水位,一个分区中所有副本最小的offset
3. Kafka中是怎么体现消息顺序性的?
Kafka只能保证分区内消息顺序有序,无法保证全局有序
实际业务中:
1)一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。
2)写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。
4. Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
拦截器(onSend onAcknowledgement)->序列化器->分区器
5. Kafka生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?
1个主线程,一个sender线程。主线程有拦截器(onSend onAcknowledgement)->序列化器->分区器,sender线程负责堆积(或到指定时间)发送数据到对应分区
6. 消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?
消费者个数如果超过topic的分区,那么就会有消费者消费不到数据,一个分区只能被一个消费者消费
7. 消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?
offset+1,文件也是这样命名的
8. 有哪些情形会造成重复消费?
1)从生产者端:
ack 设置为 -1 ,Leader收到数据follower同步数据后 ,brocker准备返回ack的时候挂掉了,新选出的Leader则会出现重复发送的情况
2)从消费者端:
先消费后提交,消费完成以后offset没有提交成功,下次消费时则会导致重复
9. 那些情景会造成消息漏消费?
1)从生产者端:
ack 设置为 0或者1时
–为0时,无状态返回,不知道是否收到
–为1时,只有Leader收到就返回ack,此时Leader挂了,副本尚未同步,则会漏消费。
2)从消费者端:
先提交后消费时
10. 当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?
1、会在zookeeper中的/brokers/topics节点下创建一个新的topic节点,如:/brokers/topics/first
2、触发Controller的监听程序
3、kafka Controller 负责topic的创建工作,并更新metadata cache
11. topic的分区数可不可以增加减少?为什么?
可以增加,不能减少。
12. kafka producer如何优化打入速度
增加线程
提高 batch.size
增加更多 producer 实例
增加 partition 数
设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;
跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。
13. Kafka有内部的topic吗?如果有是什么?有什么所用?
__consumer_offsets:作用是保存 Kafka 消费者的位移信息
14. Kafka分区分配的概念?
1、range
2、Round-robin
15. 简述Kafka的日志目录结构?
一个Topic有多个partition,一个partition对应一个目录,目录命名 ,topic-分区id。
下面分多个segment目录,命名是以topic名称和开始消息的偏移量来命名的,目录主要有两类文件log和index文件。
16. 如果我指定了一个offset,Kafka Controller怎么查找到对应的消息?
通过 offset找到对应的segment目录,目录下找到index文件,再去log文件中获取消息
17. 聊一聊Kafka Controller的作用?
Kafka集群的管理者,依赖zookeeper
在Kafka早期版本,对于分区和副本的状态的管理依赖于zookeeper的Watcher和队列:每一个broker都会在zookeeper注册Watcher,所以zookeeper就会出现大量的Watcher, 如果宕机的broker上的partition很多比较多,会造成多个Watcher触发,造成集群内大规模调整;每一个replica都要去再次zookeeper上注册监视器,当集群规模很大的时候,zookeeper负担很重。这种设计很容易出现脑裂和羊群效应以及zookeeper集群过载。
新版本该变了这种设计,使用KafkaController,只有KafkaController
Leader会向zookeeper上注册Watcher,其他broker几乎不用监听zookeeper的状态变化
Kafka集群中多个broker,有一个会被选举为controller leader,负责管理整个集群中分区和副本的状态,比如partition的leader 副本故障,由controller 负责为该partition重新选举新的leader 副本;当检测到ISR列表发生变化,有controller通知集群中所有broker更新其MetadataCache信息;或者增加某个topic分区的时候也会由controller管理分区的重新分配工作
当broker启动的时候,都会创建KafkaController对象,但是集群中只能有一个leader对外提供服务,这些每个节点上的KafkaController会在指定的zookeeper路径下创建临时节点,只有第一个成功创建的节点的KafkaController才可以成为leader,其余的都是follower。当leader故障后,所有的follower会收到通知,再次竞争在该路径下创建节点从而选举新的leader(先到先得)
18. Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?
1、KafkaController选举的时候,先到先得
2、分区的副本选Leader的时候,从ISR中获取
19. 失效副本是指什么?有那些应对措施?
踢出ISR的那些OSR。从HW截断,然后同步Leader
20. Kafka的那些设计让它有如此高的性能?
1、分区
2、顺序
3、零拷贝