Kafka中的模块概念:
Broker:Broker是Kafka的实例,每台服务器都有一个或多个Broker,Borker端不维护数据的消费状态,直接用磁盘存储数据,线性读写,提高效率。
Producer:发布者,将消息推送给Broker
Consumer:消费者,从Broker端拉取消息
Topic:发送到Broker的消息都是以Topic主题分类的
Partition:Topic的分区,是物理上的概念
Consumer Group:将多个消费者组成一个消费者组,在Kafka中,一个主题中的数据只能被消费者组中的一个消费者消费,而每个消费者可以消费同一个topic中不同分区的数据,也是为了提高Kafka的吞吐量
Topic与Partition:每条消息都有一个指定的Topic,为了提高Kafka吞吐量,物理上把Topic分成一个或者多个partition,每个partition在物理上对应一个文件夹,这个文件夹存储这个partition的所有消息和索引
Kafka常见面试题
-
1.Kafka 中的 ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么?
ISR:为了保证数据可靠性提供的副本机制,所有跟leader保持同步的副本集合称为ISR;当有follow副本同步滞后太多或超时,将被移出ISR,被归为OSR;AR即所有副本的集合。所以ISR+OSR=AR -
2.Kafka 中的 HW、LEO 等分别代表什么?
HW:标识了一个特定的消息偏移量,消费者只能拉取到这条offset之前的数据
ISR分区副本中最后一条消息的待写位置,就是每个副本最大消息+1=LEO
-
3.Kafka 中是怎么体现消息顺序性的?
生产者通过分区的leader副本顺序写入,保证消息顺序性
消费者只能保证分区中数据消费的顺序性,无法保证分区间消费顺序。 -
4.Kafka 中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
拦截器:按照kafka规则过滤数据是否符合要求
序列化器:将key,value转换成字节数组可在网络中传输,将消息数据序列化
分区器:如果ProducerRecoder指定分区,则不需要通过分区器,如果没有指定,则执行partition()方法计算该消息的分区
先执行拦截器,再是序列化器,最后分区器 -
5.Kafka 生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?
Kafka生产者客户端主要由main线程和sender线程组成,先由主线程执行拦截器,序列化器,分区器后将数据推送到消息累加器中,消息累加器缓存好后批量发送到sender线程里,sender负责将数据推送到kafka cluster中。 -
6.消费者组中消费者数量多少合适
一个topic中的分区只能被一个组中的一个消费者消费,反之一个消费者可以消费多个分区的数据。所以消费者的数量不要大于分区数,否则也是浪费。 -
7.消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?
offset+1 -
8.有哪些情形会造成重复消费?如何避免
1)强行kill线程,消费者已经消费但没有来得及提交offset
2)消费完后的数据,还没有提交,与partition断开连接。比如某条消息消费时间超过kafka的session默认timeout30秒,那么可能会触发kafka的re-blance重平衡机制
为了避免重复消费,可以设置手动提交offset,将消费消息和提交offset作为一个原子操作,要么都成功要么都失败。同时在producer推送消息的时候绑定一个sequnceid,在server端接收校验,重复的丢弃 -
9.那些情景会造成消息漏消费?如何避免
消费者设置为自动提交offset时,如果消费者拿到数据还未处理而自动提交offset,此时kafka被kill掉,数据将被漏消费。设置为手动提交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 的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?
可以增加,在增加分区的时候,会通知订阅topic的消费者组触发re-reblace重平衡事件 -
12.topic 的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?
不可以减少分区数,如果减少将会影响数据的顺序性,事务性等问题 -
13.Kafka 有内部的 topic 吗?如果有是什么?有什么所用?
在_consumer_offsets中,保存消费者的offset -
14.Kafka 分区分配的概念?
一个topic多个分区,一个消费者组有多个消费者,每个分区只被一个消费者组中的一个消费者消费 -
15.简述 Kafka 的日志目录结构?
每个partition下的文件夹,有index下标,log数据。生产者将消息追加到log中,index记录offset偏移量 -
16.如果我指定了一个 offset,Kafka Controller 怎么查找到对应的消息?
通过二分查找法定位offset在哪个index文件中,再通过二分查找法找到offset小于或等于索引条目中最大的那个offset,拿到这条offset后得到它在message中的位置,再去message中找到这条数据,取出offset+1这条消息就是
-
17.聊一聊 Kafka Controller 的作用?
主要依靠zookeeper完成集群broker和分区的管理,还有分区中ISR的选举 -
18.Kafka 中有那些地方需要选举?这些地方的选举策略又有哪些?
分区中ISR的leader需要选举,默认为ISR集合中第一个follow -
19.失效副本是指什么?有那些应对措施?
OSR中的副本就是失效副本。同步策略是首先将当前记录的HW之后的消息删除,然后和leader同步,当存储消息的offset大于ISR中的HW后,重新回到ISR中 -
20.Kafka 的哪些设计让它有如此高的性能?
1、顺序写入磁盘,顺序读写比随机读写效率提升很多
2、Memory Mapped File,即内存映射文件,利用操作系统的分页存储,来实现文件映射到物理内存,完成映射之后操作系统会对物理内存的操作同步到磁盘中 -
21.Kafka是如何清理日志数据的
Kafka的数据清理和consumer消费无关,只关乎server.properties中的两个消费规则
log.retention.hours=48 #数据最多保存48小时
log.retention.bytes=1073741824 #数据最多1G
- 22.ACK应答机制
为了保证producer发送消息的可靠性,每个partition在收到消息后都要返回ack确认包,producer收到后继续发送下一批数据,否则重发。ack有三种机制
ack=0:producer只管发送,不管是否接收成功,对于数据可靠性要求不高
ack=1:kafka默认机制,producer要等待leader副本接收到返回ack确认包后,认为消息发送成功
ack=-1:producer要等待所有副本写入成功返回ack后,认为消息推送成功 - 23.为什么kafka效率这么高?
kafka将所有消息都收集为一个批量文件,并且批量压缩减少网络IO损耗,写入的时候由于是追加文件末尾的方式速度最优,读取的时候配合sendfile直接暴力输出。