32道常见的Kafka⾯试题及答案
1、Kafka 都有哪些特点?
⾼吞吐量、低延迟:kafka每秒可以处理⼏⼗万条消息,它的延迟最低只有⼏毫秒,每个topic可以分多个partition, consumer group 对partition进⾏consume操作。
可扩展性:kafka集⽀持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且⽀持数据备份防⽌数据丢失
容错性:允许集中节点失败(若副本数量为n,则允许n-1个节点失败)?⾼并发:⽀持数千个客户端同时读写
2、请简述下你在哪些场景下会选择 Kafka?
⽇志收集:⼀个公司可以⽤Kafka可以收集各种服务的log,通过kafka以统⼀接⼝服务的⽅式开放给各种consumer,例如hadoop、HBase、Solr等。?消息系统:解耦和⽣产者和消费者、缓存消息等。
⽤户活动跟踪:Kafka经常被⽤来记录web⽤户或者app⽤户的各种活动,如浏览⽹页、搜索、点击等活动,
这些活动信息被各个服务器发布到kafka 的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
运营指标:Kafka也经常⽤来记录运营监控数据。包括收集各种分布式应⽤的数据,⽣产各种操作的集中反馈,⽐如报警和报告。
流式处理:⽐如spark streaming和 Flink
3、 Kafka 的设计架构你知道吗?
简单架构如下
详细如下
Kafka 架构分为以下⼏个部分
Producer :消息⽣产者,就是向 kafka broker 发消息的客户端。?Consumer :消息消费者,向 kafka broker 取消息的客户端。
Topic :可以理解为⼀个队列,⼀个 Topic ⼜分为⼀个或多个分区,?Consumer Group:这是 kafka ⽤来实现⼀个 topic 消息的⼴播(发给所有的consumer)和单播(发给任意⼀个 consumer)的⼿段。⼀个 topic 可以有多个 Consumer Group。
Broker :⼀台 kafka 服务器就是⼀个 broker。⼀个集由多个 broker 组成。
⼀个 broker 可以容纳多个 topic。
Partition:为了实现扩展性,⼀个⾮常⼤的 topic 可以分布到多个 broker上,每个 partition 是⼀个有序的队列。partition 中的每条消息都会被分配⼀个有序的id(offset)。将消息发给 consumer,kafka 只保证按⼀个 partition 中的消息的顺序,不保证⼀个 topic 的整体(多个 partition 间)的顺序。?Offset:kafka 的存储⽂件都是按照 offset.kafka 来命名,⽤ offset 做名字的好处是⽅便查。例如你想位于 2049 的位置,只要到 2048.kafka 的⽂件即可。当然 the first offset 就是00000000000.kafka。
4、Kafka 分区的⽬的?
分区对于 Kafka 集的好处是:实现负载均衡。分区对于消费者来说,可以提⾼并发度,提⾼效率。
5、你知道 Kafka 是如何做到消息的有序性?
kafka 中的每个 partition 中的消息在写⼊时都是有序的,⽽且单独⼀
个 partition 只能由⼀个消费者去消费,可以在⾥⾯保证消息的顺序性。但是分区之间的消息是不保证有序的。
6、Kafka 的⾼可靠性是怎么实现的?
数据可靠性
Kafka 作为⼀个商业级消息中间件,消息可靠性的重要性可想⽽知。本⽂从 Producter 往 Broker 发送消息、Topic 分区副本以及 Leader 选举⼏个⾓度介绍数据的可靠性。
Topic 分区副本
在 Kafka 0.8.0 之前,Kafka 是没有副本的概念的,那时候⼈们只会⽤Kafka 存储⼀些不重要的数据,因
为没有副本,数据很可能会丢失。但是随着业务的发展,⽀持副本的功能越来越强烈,所以为了保证数据的可靠性,Kafka 从 0.8.0 版本开始引⼊了分区副本(详情请参见 KAFKA-50)。也就是说每个分区可以⼈为的配置⼏个副本(⽐如创建主题的时候指
定 replication-factor,也可以在 Broker 级别进⾏配
置 plication.factor),⼀般会设置为3。
Kafka 可以保证单个分区⾥的事件是有序的,分区可以在线(可⽤),也可以离线(不可⽤)。在众多的分区副本⾥⾯有⼀个副本是 Leader,其余的副本是 follower,所有的读写操作都是经过 Leader 进⾏的,同时 follower 会定期地去 leader 上的复制数据。当 Leader 挂了的时候,其中⼀个 follower 会重新成为新的 Leader。通过分区副本,引⼊了数据冗余,同时也提供了Kafka 的数据可靠性。
Kafka 的分区多副本架构是 Kafka 可靠性保证的核⼼,把消息写⼊多个副本可以使 Kafka 在发⽣崩溃时仍能保证消息的持久性。
7、请谈⼀谈 Kafka 数据⼀致性原理⼀致性就是说不论是⽼的 Leader 还是新选举的 Leader,Consumer 都能读到⼀样的数据。
假设分区的副本为3,其中副本0是 Leader,副本1和副本2是follower,并且在 ISR 列表⾥⾯。虽然副本0已经写⼊了Message4,但是Consumer 只能读取到 Message2。因为所有的 ISR 都同步了 Message2,只有High Water Mark 以上的消息才⽀持 Consumer 读取,⽽ High Water Mark 取
决于 ISR 列表⾥⾯偏移量最⼩的分区,对应于上图的副本2,这个很类似于⽊桶原理。
这样做的原因是还没有被⾜够多副本复制的消息被认为是“不安全”的,如果 Leader 发⽣崩溃,另⼀个副本成为新 Leader,那么这些消息很可能丢失了。如果我们允许消费者读取这些消息,可能就会破坏⼀致性。试想,⼀个消费者从当前 Leader(副本0)读取并处理了 Message4,这个时候
Leader 挂掉了,选举了副本1为新的 Leader,这时候另⼀个消费者再去从新的 Leader 读取消息,发现这个消息其实并不存在,这就导致了数据不⼀致性问题。
当然,引⼊了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达
消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数
www.doczj/doc/e535488f16791711cc7931b765ce050876327590.html g.time.max.ms 参数配置,它指定了副本在复制消息时可被允许的最⼤延迟时间。
8、ISR、OSR、AR 是什么?
ISR:In-Sync Replicas 副本同步队列
OSR:Out-of-Sync Replicas
AR:Assigned Replicas 所有副本
ISR是由leader维护,follower从leader同步数据有⼀些延迟(具体可以参见图⽂了解 Kafka 的副本复制机制),超过相应的阈值会把 follower 剔除出ISR, 存⼊OSR(Out-of-Sync Replicas )列表,新加⼊的follower也会先存放在OSR中。
AR=ISR+OSR。
9、LEO、HW、LSO、LW等分别代表什么
LEO:是 LogEndOffset 的简称,代表当前⽇志⽂件中下⼀条
HW:⽔位或⽔印(watermark)⼀词,也可称为⾼⽔位(high watermark),通常被⽤在流式处理领域(⽐如Apache Flink、Apache Spark等),以表征元素或事件在基于时间层⾯上的进度。在Kafka中,⽔位的概念反⽽与时间⽆关,⽽是与位置信息相关。严格来说,它表⽰的就是位置信息,即位移
(offset)。取 partition 对应的 ISR中最⼩的 LEO 作为 HW,consumer 最多只能消费到 HW 所在的位置上⼀条信息。
LSO:是 LastStableOffset 的简称,对未完成的事务⽽⾔,LSO 的值等于事务中第⼀条消息的位置(firstUnstableOffset),对已完成的事务⽽⾔,它的值同 HW 相同
LW:Low Watermark 低⽔位, 代表 AR 集合中最⼩的 logStartOffset 值。
10、Kafka 在什么情况下会出现消息丢失?
11、怎么尽可能保证 Kafka 的可靠性
12、消费者和消费者组有什么关系?
每个消费者从属于消费组。具体关系如下:
网页app
13、Kafka 的每个分区只能被⼀个消费者线程,如何做到多个线程同时消费⼀个分区?
14、数据传输的事务有⼏种?
数据传输的事务定义通常有以下三种级别:
(1)最多⼀次: 消息不会被重复发送,最多被传输⼀次,但也有可能⼀次不传输
(2)最少⼀次: 消息不会被漏发送,最少被传输⼀次,但也有可能被重复传输.
(3)精确的⼀次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被
15、Kafka 消费者是否可以消费指定分区消息?
Kafa consumer消费消息时,向broker发出fetch请求去消费特定分区的消息,consumer指定消息在⽇志中的偏移量(offset),就可以消费从这个位置开始的消息,customer拥有了offset的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的。
16、Kafka消息是采⽤Pull模式,还是Push模式?
Kafka最初考虑的问题是,customer应该从brokes拉取消息还是brokers 将消息推送到consumer,也就
是pull还push。在这⽅⾯,Kafka遵循了⼀种⼤部分消息系统共同的传统的设计:producer将消息推送到broker,consumer从broker拉取消息。
⼀些消息系统⽐如Scribe和Apache Flume采⽤了push模式,将消息推送到下游的consumer。这样做有好处也有坏处:由broker决定消息推送的速率,对于不同消费速率的consumer就不太好处理了。消息系统都致⼒于让consumer以最⼤的速率最快速的消费消息,但不幸的是,push模式下,当broker推送的速率远⼤于consumer消费的速率时,consumer恐怕就要崩溃了。最终Kafka还是选取了传统的pull模式。Pull模式的另外⼀个好处是consumer可以⾃主决定是否批量的从broker拉取数据。Push模式必须在不知道下游consumer消费能⼒和消费策略的情况下决定是⽴即推送每条消息还是缓存之后批量推送。如果为了避免consumer崩溃⽽采⽤较低的推送速率,将可能导致⼀次只推送较少的消息⽽造成浪费。Pull模式下,consumer就可以根据⾃⼰的消费能⼒去决定这些策略。Pull有个缺点是,如果broker没有
可供消费的消息,将导致consumer不断在循环中轮询,直到新消息到t达。
为了避免这点,Kafka有个参数可以让consumer阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发
17、Kafka 消息格式的演变清楚吗?
18、Kafka 偏移量的演变清楚吗?
19、Kafka ⾼效⽂件存储设计特点
Kafka把topic中⼀个parition⼤⽂件分成多个⼩⽂件段,通过多个⼩⽂件段,就容易定期清除或删除已经消费完⽂件,减少磁盘占⽤。
通过索引信息可以快速定位message和确定response的最⼤⼤⼩。
通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。
通过索引⽂件稀疏存储,可以⼤幅降低index⽂件元数据占⽤空间⼤⼩
20、Kafka创建Topic时如何将分区放置到不同的Broker中
副本因⼦不能⼤于 Broker 的个数;
第⼀个分区(编号为0)的第⼀个副本放置位置是随机从brokerList 选择的;?其他分区的第⼀个副本放置位置相对于第0个分
区依次往后移。也就是如果我们有5个 Broker,5个分区,假设第⼀个分区放在第四个 Broker 上,那么第⼆个分区将会放在第五个 Broker 上;第三个分区将会放在第⼀个 Broker 上;第四个分区将会放在第⼆个 Broker 上,依次类推;
剩余的副本相对于第⼀个副本放置位置其实是由 nextReplicaShift 决定的,⽽这个数也是随机产⽣的
21、Kafka新建的分区会在哪个⽬录下创建
在启动 Kafka 集之前,我们需要配置好 log.dirs 参数,其值是 Kafka 数据的存放⽬录,这个参数可以配置多个⽬录,⽬录之间使⽤逗号分隔,通常这些⽬录是分布在不同的磁盘上⽤于提⾼读写性能。
当然我们也可以配置 log.dir 参数,含义⼀样。只需要设置其中⼀个即可。
如果 log.dirs 参数只配置了⼀个⽬录,那么分配到各个 Broker 上的分区肯定只能在这个⽬录下创建⽂件夹⽤于存放数据。
但是如果 log.dirs 参数配置了多个⽬录,那么 Kafka 会在哪个⽂件夹中创建分区⽬录呢?答案是:Kafka 会在含有分区⽬录最少的⽂件夹中创建新的分区⽬录,分区⽬录名为 Topic名+分区ID。注意,是分区⽂件夹总数最少的⽬录,⽽不是磁盘使⽤量最少的⽬录!也就是说,如果你给 log.dirs 参数新增了⼀个新的磁盘,新的分区⽬录肯定是先在这个新的磁盘上创建直到这个新的磁盘⽬录拥有的分区⽬录不是最少为⽌。
22、谈⼀谈 Kafka 的再均衡
在Kafka中,当有新消费者加⼊或者订阅的topic数发⽣变化时,会触发Rebalance(再均衡:在同⼀个消费者组当中,分区的所有权从⼀个消费者转移到另外⼀个消费者)机制,Rebalance顾名思义就是重新均衡消费者消费。
Rebalance的过程如下:
第⼀步:所有成员都向coordinator发送请求,请求⼊组。⼀旦所有成员都发送了请求,coordinator会从中选择⼀个consumer 担任leader的⾓⾊,并把组成员信息以及订阅信息发给leader。
第⼆步:leader开始分配消费⽅案,指明具体哪个consumer负责消费哪些topic的哪些partition。⼀旦完成分配,leader会将这个⽅案发给
coordinator。coordinator接收到分配⽅案之后会把⽅案发给各个consumer,这样组内的所有成员就都知道⾃⼰应该消费哪些分区了。所以对于
Rebalance来说,Coordinator起着⾄关重要的作⽤
23、谈谈 Kafka 分区分配策略
24、Kafka Producer 是如何动态感知主题分区数变化的?
25、 Kafka 是如何实现⾼吞吐率的?
Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写⼊速度低容量⼤的硬盘,以此来换取更强的存储能⼒,但实际上,使⽤硬盘并没有带来过多的性能损失。kafka主要使⽤了以下⼏个⽅式实现了超⾼的吞吐率:
顺序读写;
零拷贝
⽂件分段
批量发送
数据压缩。
27、如何为Kafka集选择合适的Topics/Partitions数量
28、谈谈你对 Kafka 事务的了解?
29、谈谈你对 Kafka 幂等的了解?
30、Kafka 缺点?
由于是批量发送,数据并⾮真正的实时;
对于mqtt协议不⽀持;
不⽀持物联⽹传感数据直接接⼊;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论