ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kafka面试题整理

2022-04-08 16:02:09  阅读:181  来源: 互联网

标签:面试题 分区 Kafka topic offset 整理 kafka leader


目录

1.kafka数据可靠性怎么保证?ack

topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。所以引出ack机制

acks:大白话
0:生产者不接收返回值(leader挂或不挂都可能丢失数据)
1:leader收到消息后,返回ack(leader挂了会丢失数据)
-1:等待ISR集合中全部收到数据,返回ack。(leader挂了,可能重复数据)

2.Kafka 中的 ISR是什么?AR是什么?

ISR:与leader保持同步的follower集合
AR:分区的所有副本

当ack=-1时,kafka全部完成同步才发送ack: 
 设想以下情景:leader收到数据,所有follower都开始同步数据,但有一个follower,因为某种故障,迟迟不能与leader进行同步,那leader就要一直等下去,直到它完成同步,才能发送ack。这个问题怎么解决呢?

  Leader维护了一个动态的in-sync replica set (ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给follower发送ack。如果follower长时间未向leader同步数据,则该follower将被踢出ISR,该时间阈值由

replica.lag.time.max.ms参数设定。Leader发生故障之后,就会从ISR中选举新的leader。

3.Kafka中数据一致性怎么保证?HW、LEO 等分别代表什么?

LEO:每个副本的最后条消息的offset
HW:一个分区中所有副本最小的offset

HW作用:控制所有副本数据一致性
注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。
eg:
比如leader挂了,此时选了其中一个follower当leader。此时hw=12,通知其他的副本以新的leader的offset开始同步,多退少补。实现所有副本数据一致性。

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

处理顺序:拦截器-->序列化器-->分区器

分区器:hash计算分区分区号,决定写入的分区
序列化器:生产者把对象转换成字节数组才能通过网络发送给Kafka,消费者需要反序列化
拦截器:在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息、修改消息的内容等

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

2个线程,一个mian线程处理数据,走拦截器,序列化器,分区器。一个send线程,真正的发送数据

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

正确。
一个分区只能被同一个消费组的一个消费者消费,如果想要一个分区被多个消费者消费,可以使用多个消费者组
经测试:一个消费者组下的消费者数量<=topic分区数

Kafka消费能力不足怎么处理:
如果是消费能力不足:
1.增加分区数,提升消费者数量。消费者数=分区数

如果是下游数据处理能力不足:
1.提高每批次拉取的数量
2.提升消息处理能力,业务优化,代码优化

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

offset+1
终端测试:创建一个topic,一个生产者,一个消费者。生产一条数据,查看zookeeper数据:
命令:get /consumers/console-consumer-11235/offsets/topicName/0
结果:offset=1。

结论:没有消费数据之前,分区offset都是0,消费一条数据offset变为1。说明是offset+1

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

1.第一步先处理数据,第二步在再提交offset,有肯能重复消费。因为第一步处理完数据,第二步可能没有提交offset
2.不同消费者组的消费者,消费相同的topic

9.有哪些情况会造成消息漏消费?

和上面问题相反。
1.第一步先提交offset,第二步再处理数据。因为提交了offset可能未处理数据。

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

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

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

分区数可以增加
--alter参数修改
[root@sg-15 bin]# ./kafka-topics.sh --zookeeper 192.168.0.215:2181 --topic topic_name --alter --partitions 4

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

分区数不可以减少,因为产生的数据没法处理。
我们可以使用 bin/kafka-topics.sh 命令对 Kafka 增加 Kafka 的分区数据,但是 Kafka 不支持减少分区数。 Kafka 分区数据不支持减少是由很多原因的,比如减少的分区其数据放到哪里去?是删除,还是保留?删除的话,那么这些没消费的消息不就丢了。如果保留这些消息如何放到其他分区里面?追加到其他分区后面的话那么就破坏了 Kafka 单个分区的有序性。如果要保证删除分区数据插入到其他分区保证有序性,那么实现起来逻辑就会非常复杂。

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

有__consumer_offsets。0.11版本之后可以不依赖于zookeeper写入offset。
作用:给消费者写入offset,写入内入的topic中

14.Kafka 分区分配的概念?

一个消费者组中有多个消费者,一个topic有多个分区,所以必然会涉及到partition的分配问题,即确定那个partition 由哪个consumer来消费。
两种方式:1)RoundRobin 2)Range
Range:面向topic处理,分配给订阅了该主题的人
RoundRobin:面向消费者组处理,分配给某个消费者组

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

每个分区对应一个文件夹,文件夹的命名为topic-0,topic-1,内部为.log和.index文件

.log:存放数据的文件
.index:存放索引信息文件,索引文件中的元数据指向对应数据文件中message的物理偏移地址。

通过index文件快速定位到消费的位置:
第一步:通过二分查找发定位到.index文件
第二步:扫描index文件,找到数据在.log文件中具体的物理偏移量

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

通过index文件快速定位到消费的位置:
第一步:通过二分查找发定位到.index文件
第二步:扫描index文件,找到数据在.log文件中具体的物理偏移量

17.聊一聊 Kafka Controller 的作用?

Controller:
 1.负责管理集群Broker的上下线,所有Topic的分区副本分配和leader选举等工作
 2.直接跟zookeeper打交道,元数据更新都由Controller获取,并通知其他的kafka节点保持一致

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

1.Controller:通过抢资源方式,谁先抢到谁就是Controller。
2.ISR中的leader:通过isr选举:
 0.9版本之前(老版本):2个条件,与之前leader同步时间最短,同步消息数最多的就是新leader。
 0.9版本之后(新版本):1个条件,与之前leader同步时间最短的就是新leader。

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

ISR中的follower长时间未向leader同步数据,则该follower将被踢出ISR。
Leader发生故障之后,就会从ISR中选举新的leader。

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

kafka高效的原因有:
1.分布式的(有分区概率,可以并发读写,但是单机器效率也很高)
2.顺序读写磁盘
3.零复制技术(零拷贝技术)

21.kafka可以脱离zookeeper单独使用吗?为什么?

2.8版本以后可以脱离zookeeper单独使用。
2.8版本以前kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协调kafka的节点服务器。

22.kafka有几种数据保留的策略?

两种:
1.按照过期时间保留:log.retention.hours=168 //超过168小时就清理数据
2.按照存储的消息大小保留:忘记了,不常用

23.什么情况会导致kafka运行变慢?

1.cpu性能瓶颈
2.磁盘读写瓶颈
3.网络瓶颈

24.为什么要用消息队列?

消息队列主要作用:
 1.解偶
 2.削峰,缓冲
 3.异步
 4.暂存数据

25.为什么选择kafka?不选择RabbitMQ?

根据业务场景选择:
RabbitMQ:
 1.交易数据,金融场景。具有较高的严谨性,数据丢失的可能性更小,同时具备更高的实时性;
 2.消息应当尽可能的小,处理关键且可靠消息
kafka:
 1.高吞吐量,虽然可以通过策略实现数据不丢失,但从严谨性角度来讲,大不如rabbitmq;

26.kafka为什么要分区?

方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了。
可以提高并发,因为可以以Partition为单位读写。

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

分区内消息是有序的。
每个分区内,每条消息都有一个offset,故只能保证分区内有序

28.kafka如何增加单条日志传输大小?

修改配置文件:server.properties
replica.fetch.max.bytes: 1048576  broker可复制的消息的最大字节数, 默认为1M
message.max.bytes: 1000012   kafka 会接收单个消息size的最大限制, 默认为1M左右
message.max.bytes必须小于等于replica.fetch.max.bytes,否则就会导致replica之间数据同步失败

29.Exactly Once(既不重复也不丢失)语义?启动幂等性?

acks:0  At Most Once(最多一次),生产者发送数据最多发送一次,不接受ack。可以保证数据不重复,但是不能保证数据不丢失。

acks:-1 At least Once(最少一次),生产者发送数据最少一次,接受到ack为止,可能多次发送,造成数据重复。可以保证不丢数据,但是不能保证数据不重复。

Exactly Once(既不重复也不丢失)语义:0.11版本以前kafka对此无能为力,只能保证数据不丢失,然后在下游(消费者)对数据做全局去重,对性能造成很大的影响。

0.11 版本的 Kafka,引入了一项重大特性:幂等性。所谓的幂等性就是指Producer 不论向 Server 发送多少次重复数据,Server 端都只会持久化一条。幂等性结合 At Least Once 语义,就构成了Kafka 的Exactly Once 语义。
即:At Least Once + 幂等性 = Exactly Once

启动幂等性:将 Producer 的参数中 enable.idompotence 设置为 true 即可

标签:面试题,分区,Kafka,topic,offset,整理,kafka,leader
来源: https://www.cnblogs.com/guyouyin123/p/16117647.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有