Kafka问题

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

  • ISR: 和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower 长时间未向 leader 同步数据,则该 follower 将被踢出 ISR。Leader 发生故障之后,就会从 ISR 中选举新的 leader。
  • 分区中的所有副本统称为AR(Assigned Replicas)。
  • 所有与leader副本保持一定程度同步的副本(包括leader副本在内)组成ISR(In-Sync Replicas),ISR集合是AR集合中的一个子集。
  • 与leader副本同步滞后过多的副本(不包括leader副本)组成OSR(Out-of-Sync Replicas)

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

  • HW是High Watermark的缩写,俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个offset之前的消息。
  • LEO是Log End Offset的缩写,它标识当前日志文件中下一条待写入消息的offset,图中offset为9的位置即为当前日志文件的LEO,LEO的大小相当于当前日志分区中最后一条消息的offset值加1。分区ISR集合中的每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对消费者而言只能消费HW之前的消息

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

Kafka只能保证分区内消息顺序有序,无法保证全局有序
生产者:通过分区的leader副本负责数据顺序写入,来保证消息顺序性
消费者:同一个分区内的消息只能被一个group里的一个消费者消费,保证分区内消费有序

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

整个kafka生产者客户端由两条线程协调运行。这两条线程分别为主线程和sender线程(发送线程)
主线程的作用就是:由KafkaProducer创建消息,然后通过可能的拦截器-》序列化器-》分区器的作用之后缓存到消息累加器
send线程的作用就是:负责将消息累加器中的消息发送到kafka中。
生产者拦截器可以用来在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息,修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求。
生产者需要用序列化器将对象转换成字节数组才能通过网络发送给kafka.当然消费者需要用对应的反序列化器将kafka的字节数组转换为相应的对象。


消息发送流程

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

整个kafka生产者客户端由两条线程协调运行。这两条线程分别为主线程和sender线程(发送线程)
主线程的作用就是:由KafkaProducer创建消息,然后通过可能的拦截器-》序列化器-》分区器的作用之后缓存到消息累加器
send线程的作用就是:负责将消息累加器中的消息发送到kafka中。

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

正确。一个分区只能被一个消费者消费

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

offset+1,文件也是这样命名的

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

1)从生产者端:
ack 设置为 -1 ,Leader收到数据follower同步数据后 ,brocker准备返回ack的时候挂掉了,新选出的Leader则会出现重复发送的情况
2)从消费者端:
先消费后提交,消费完成以后offset没有提交成功,下次消费时则会导致重复

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

1)从生产者端:ack 设置为 0和1
2)从消费者端:先提交后消费时,提交后挂掉
先提交 offset 后消费,有可能造成数据的漏消费;而先消费后提交 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 的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?

可以,重分区。reblance

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

不可以,分区里面的数据不好处理

13.Kafka 有内部的 topic 吗?如果有是什么?有什么所用?

consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets

14.Kafka 分区分配的概念?

kafka的分区分配策略:RangeAssignor(默认),RoundRobinAssignor,StickyAssignor

15.简述 Kafka 的日志目录结构?

一个Topic有多个partition,一个partition对应一个目录,目录命名 ,topic-分区id。
下面分多个segment目录,命名是以topic名称和开始消息的偏移量来命名的,目录主要有两类文件log和index文件。

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

通过 offset找到对应的segment目录,目录下找到index文件,再去log文件中获取消息

17.聊一聊 Kafka Controller 的作用?

负责管理集群 broker 的上下线,所有 topic 的分区副本分配和 leader 选举等工作。 Controller 的管理工作都是依赖于 Zookeeper 的。

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

  • KafkaController选举的时候,先到先得
  • 分区的副本选Leader的时候,从ISR中获取

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

踢出ISR的那些OSR。从HW截断,然后同步Leader

20.Kafka 的哪些设计让它有如此高的性能?

分区存储,顺序读写,零拷贝
1)partition顺序读写,充分利用磁盘特性,这是基础;
2)Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入;
3)Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。

你可能感兴趣的:(Kafka问题)