kafka常见面试题

1、Kafka 中的 ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么?

AR:所有的分区副本;
ISR:所有与leader保持同步的副本集合;
OSR:被leader剔除ISR的集合;当副本在一定时间未与leader进行同步就会被提出ISR。

2、Kafka 中的 HW、LEO 等分别代表什么?

LEO:每个副本中最大的 offset;
HW:消费者能见到的最大的 offset,ISR中最小的LEO;

3、Kafka 中是怎么体现消息顺序性的?

kafka的分区每次写入消息是都是有序的(末尾追加);消费时,每个分区只能被同一个消费者组中的一个消费者消费,从而保证了消息的顺序行。

4、Kafka 中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?

分区器:根据键值确定消息放在哪个分区,默认试用轮询算法,也可以自定义分区器;
序列化器:键序列化器和值序列化器,将键和值都转为二进制流 还有反序列化器 将二进制流转为指定类型数据;
拦截器:两个方法 doSend()方法会在序列化之前完成 onAcknowledgement()方法在消息发送成功或失败时调用 可以添加多个拦截器按顺序执行。
执行顺序:拦截器doSend() -> 序列化器 -> 分区器

5、Kafka 生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?

kafka常见面试题_第1张图片
整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程(发送线程)。在主线程中由KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator,也称为消息收集器)中。Sender线程负责从RecordAccumulator中获取消息并将其发送到Kafka中。
RecordAccumulator主要用来缓存消息以便Sender线程可以批量发送,进而减少网络传输的资源消耗提升性能。RecordAccumulator缓存的大小可以通过生产者客户端参数buffer.memory的配置,默认值为32MB。如果生产者发送消息的速度超过发送到服务器的速度,则会导致生产者空间不足,这个时候KafkaProducer的send()方法调用要么被阻塞,要么抛出异常,这个取决于参数max.block.ms的配置,此参数的默认值为60000,即60秒。

6、“消费组中的消费者个数如果超过 topic 的分区,那么就会有消费者消费不到数据”这句 话是否正确?

正确;同一个分区只能被同一个消费者组中的一个消费者消费。

7、消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?

offset+1。

8、有哪些情形会造成重复消费?

消费者消费后没有commit offset(程序崩溃/强行kill/消费耗时/自动提交偏移情况下unscrible)。

9、那些情景下会造成消息漏消费?

消费者没有处理完消息 提交offset(自动提交偏移 未处理情况下程序异常结束)

10、当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?

1)会在 zookeeper 中的/brokers/topics 节点下创建一个新的 topic 节点,如:
/brokers/topics/first
2)触发 Controller 的监听程序
3)kafka Controller 负责 topic 的创建工作,并更新 metadata cache 。

11、topic 的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?

可以。
命令:bin/kafka-topics.sh --zookeeper node02:2181 --alter --topic second --partitions 3

12、topic 的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?

不能,会丢失数据。

13、Kafka目前有那些内部topic,它们都有什么特征?各自的作用又是什么?

__consumer_offsets 以双下划线开头,保存消费组的偏移

14、简述Kafka的日志目录结构?

每个partition一个文件夹,包含四类文件.index .log .timeindex leader-epoch-checkpoint
.index .log .timeindex 三个文件成对出现 前缀为上一个segment的最后一个消息的偏移 log文件中保存了所有的消息 index文件中保存了稀疏的相对偏移的索引 timeindex保存的则是时间索引
leader-epoch-checkpoint中保存了每一任leader开始写入消息时的offset 会定时更新
follower被选为leader时会根据这个确定哪些消息可用

15、如果我指定了一个 offset,Kafka Controller 怎么查找到对应的消息?

1.通过文件名前缀数字x找到该绝对offset 对应消息所在文件
2.offset-x为在文件中的相对偏移
3.通过index文件中记录的索引找到最近的消息的位置
4.从最近位置开始逐条寻找

16、聊一聊 Kafka Controller 的作用?

负责kafka集群的上下线工作,所有topic的副本分区分配和选举leader工作

17、Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?

在ISR中需要选择,选择策略为先到先得

18、失效副本是指什么?有那些应对措施?

失效副本为速率比leader相差大于10秒的follower
将失效的follower先剔除ISR
等速率接近leader10秒内,再加进ISR

19、Kafka创建Topic时如何将分区放置到不同的Broker中?

首先副本数不能超过broker数
第一分区是随机从Broker中选择一个,然后其他分区相对于0号分区依次向后移
第一个分区是从nextReplicaShift决定的,而这个数也是随机产生的

20、Kafka中的事务是怎么实现的?

kafka事务有两种
producer事务和consumer事务
producer事务是为了解决kafka跨分区跨会话问题
kafka不能跨分区跨会话的主要问题是每次启动的producer的PID都是系统随机给的
所以为了解决这个问题
我们就要手动给producer一个全局唯一的id,也就是transaction id 简称TID
我们将TID和PID进行绑定,在producer带着TID和PID第一次向broker注册时,broker就会记录TID,并生成一个新的组件__transaction_state用来保存TID的事务状态信息
当producer重启后,就会带着TID和新的PID向broker发起请求,当发现TID一致时
producer就会获取之前的PID,将覆盖掉新的PID,并获取上一次的事务状态信息,从而继续上次工作
consumer事务相对于producer事务就弱一点,需要先确保consumer的消费和提交位置为一致且具有事务功能,才能保证数据的完整,不然会造成数据的丢失或重复

你可能感兴趣的:(kafka)