赞
踩
目录
13、Kafka 的每个分区只能被一个消费者线程,如何做到多个线程同时消费一个分区?
18、Kafka创建Topic时如何将分区放置到不同的Broker中?
22、Kafka Producer 是如何动态感知主题分区数变化的?
24、如何为Kafka集群选择合适的Topics/Partitions数量?
27、阐述下 Kafka 中的领导者副本(Leader Replica)和追随者副本 (Follower Replica)的区别
30、Kafka 的哪些场景中使用了零拷贝(Zero Copy)?
32、Kafka目前有哪些内部topic,它们都有什么特征?各自的作用又是什么?
1、实现负载均衡,方便在集群中扩展,每个partition可以通过调整以适应它所在的机器,而一个topic又可以有多个partition组成,因此可以以partition为单位读写了。
2、可以提高并发,因为可以以partition为单位读写了。
kafka 中的每个 partition 中的消息在写入时都是有序的,而且单独一个 partition 只能由一个消费者去消费,可以在里面保证消息的顺序性。但是分区之间的消息是不保证有序的。
基本上从Producer往Broker发送消息、Topic分区副本以及Leader的选举来回答。详情请看(https://blog.csdn.net/Stray_Lambs/article/details/117250197)
主要通过HW机制以及ISR机制来实现,有点类似于木桶原理。
https://blog.csdn.net/Stray_Lambs/article/details/117250197
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。
可能producer发送的消息还没写入磁盘,而broker(leader)返回ack后,直接宕机,那么就有可能造成数据丢失。
基本上也就是问Kafka如何实现高可靠性,无非就是分区副本,ack机制的那三个值,ISR机制中leader的选举等,可以参考问题6。
每个消费者从属于一个消费者组。组内可能只有一个消费者或者多个。
可以采用平衡分区算法(具体怎么样,我有点还没有领悟,这里只能弱弱的放个大佬的博客)
一个分区能同时被一个消费组的多个消费者消费。而kafka中消费者是以pull拉取数据的,一般是拉取方提供offset,数据方根据offset返回数据。如果是数据方维护offset,会增加获取offset的通信开销,consumer端维护就涉及多个消费者之间offset同步问题,增加了复杂性。好处就是实现分区的分布式消费 但多个分区已经实现了主题的分布式消费,权衡下kafka选择了一个分区只能被一个消费组的一个消费者消费。
Airbnb 是如何通过 balanced Kafka reader 来扩展 Spark streaming 实时流处理能力的
数据传输的事务定义通常有以下三种级别:
更多请看http://www.jasongj.com/kafka/transaction/
Kafa consumer消费消息时,向broker发出fetch请求去消费特定分区的消息,consumer指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer拥有了offset的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的。
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阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发)
brokerList
选择的;nextReplicaShift
决定的,而这个数也是随机产生的。详情可以看Kafka创建Topic时如何将分区放置到不同的Broker中
我们知道,在启动 Kafka 集群之前,我们需要配置好 log.dirs
参数,其值是 Kafka 数据的存放目录,这个参数可以配置多个目录,目录之间使用逗号分隔,通常这些目录是分布在不同的磁盘上用于提高读写性能。当然我们也可以配置 log.dir
参数,含义一样。只需要设置其中一个即可。
如果 log.dirs
参数只配置了一个目录,那么分配到各个 Broker 上的分区肯定只能在这个目录下创建文件夹用于存放数据。
但是如果 log.dirs
参数配置了多个目录,那么 Kafka 会在哪个文件夹中创建分区目录呢?答案是:Kafka 会在含有分区目录最少的文件夹中创建新的分区目录,分区目录名为 Topic名+分区ID。注意,是分区文件夹总数最少的目录,而不是磁盘使用量最少的目录!也就是说,如果你给 log.dirs
参数新增了一个新的磁盘,新的分区目录肯定是先在这个新的磁盘上创建直到这个新的磁盘目录拥有的分区目录不是最少为止。
详情可以看新建分区存放在哪个目录
在Kafka中,当有新消费者加入或者订阅的topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消费者)机制,Rebalance顾名思义就是重新均衡消费者消费。Rebalance的过程如下:
第一步:所有成员都向coordinator节点发送请求,请求入组。一旦所有成员都发送了请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader。
第二步:leader开始分配消费方案,指明具体哪个consumer负责消费哪些topic的哪些partition。一旦完成分配,leader会将这个方案发给coordinator。coordinator接收到分配方案之后会把方案发给各个consumer,这样组内的所有成员就都知道自己应该消费哪些分区了。
所以对于Rebalance来说,Coordinator起着至关重要的作用。
具体请看Kafka分区分配策略
在启动Kafka Producer往Kafka的Broker发送消息的时候,用户修改了该Topic的分区数,Producer可以在最多topic.metadata.refresh.interval.ms
的时间之后感知到,此感知同时适用于async
和sync
模式,并且可以将数据发送到新添加的分区中。下面附上topic.metadata.refresh.interval.ms
参数的解释:
The producer generally refreshes the topic metadata from brokers when there is a failure (partition missing, leader not available...). It will also poll regularly (default: every 10min so 600000ms). If you set this to a negative value, metadata will only get refreshed on failure. If you set this to zero, the metadata will get refreshed after each message sent (not recommended) Important note: the refresh happen only AFTER the message is sent, so if the producer never sends a message the metadata is never refreshed.
Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失。kafka主要使用了以下几个方式实现了超高的吞吐率:
具体请看如何为Kafka集群选择合适的Topics/Partitions数量
0.11版本的 Kafka,引入了幂等性:producer 不论向 server 发送多少重复数据,server 端都只会持久化一条。
要启用幂等性,只需要将 producer 的参数中 enable.idompotence 设置为 true 即可。开启幂等性的 producer 在初始化时会被分配一个 PID,发往同一 partition 的消息会附带 Sequence Number。而 borker 端会对 <PID,Partition,SeqNumber> 做缓存,若三个主键都相同则表示重复数据,否则就是不同数据,当具有相同主键的消息提交时,broker 只会持久化一条。
但是 PID 重启后就会变化,同时不同的 partition 也具有不同主键,所以幂等性无法保证跨分区会话的 Exactly Once,即可能宕机之后重新加入,则可能存在重复数据。
我们可以使用 bin/kafka-topics.sh 命令对 Kafka 增加 Kafka 的分区数据,但是 Kafka 不支持减少分区数。
Kafka 分区数据不支持减少是由很多原因的,比如减少的分区其数据放到哪里去?是删除,还是保留?删除的话,那么这些没消费的消息不就丢了。如果保留这些消息如何放到其他分区里面?追加到其他分区后面的话那么就破坏了 Kafka 单个分区的有序性。如果要保证删除分区数据插入到其他分区保证有序性,那么实现起来逻辑就会非常复杂。
具体请看:https://blog.csdn.net/Stray_Lambs/article/details/117250197
这道题表面上是考核你对 Leader 和 Follower 区别的理解,但很容易引申到 Kafka 的同步机制上。因此,我建议你主动出击,一次性地把隐含的考点也答出来,也许能够暂时把面试 官“唬住”,并体现你的专业性。
你可以这么回答:Kafka 副本当前分为领导者副本和追随者副本。只有 Leader 副本才能对外提供读写服务,响应 Clients 端的请求。Follower 副本只是采用拉(PULL)的方式,被动地同步 Leader 副本中的数据,并且在 Leader 副本所在的 Broker 宕机后,随时准备应聘 Leader 副本。
通常来说,回答到这个程度,其实才只说了 60%,因此,我建议你再回答两个额外的加分项。
任何 Java 进程 JVM 堆大小的设置都需要仔细地进行考量和测试。一个常见的做法是,以默认的初始 JVM 堆大小运行程序,当系统达到稳定状态后,手动触发一次 Full GC,然后通过 JVM 工具查看 GC 后的存活对象大小。之后,将堆大小设置成存活对象总大小的 1.5~2 倍。对于 Kafka 而言,这个方法也是适用的。不过,业界有 个最佳实践,那就是将 Broker 的 Heap Size 固定为 6GB。经过很多公司的验证,这个大小是足够且良好的。
在生产环境中,你一定碰到过“某个主题分区不能工作了”的情形。使用命令行查看状态的话,会发现 Leader 是 -1,于是,你使用各种命令都无济于事,最后只能用“重启大 法”。
但是,有没有什么办法,可以不重启集群,就能解决此事呢?这就是此题的由来。
我直接给答案:删除 ZooKeeper 节点 /controller,触发 Controller 重选举。 Controller 重选举能够为所有主题分区重刷分区状态,可以有效解决因不一致导致的 Leader 不可用问题。
Zero Copy 是特别容易被问到的高阶题目。在 Kafka 中,体现 Zero Copy 使用场景的地方有两处:基于 mmap 的索引和日志文件读写所用的 TransportLayer。
先说第一个。索引都是基于 MappedByteBuffer 的,也就是让用户态和内核态共享内核态的数据缓冲区,此时,数据不需要复制到用户态空间。不过,mmap 虽然避免了不必要的拷贝,但不一定就能保证很高的性能。在不同的操作系统下,mmap 的创建和销毁成本可能是不一样的。很高的创建和销毁开销会抵消 Zero Copy 带来的性能优势。由于这种不确定性,在 Kafka 中,只有索引应用了 mmap,最核心的日志并未使用 mmap 机制。
再说第二个。TransportLayer 是 Kafka 传输层的接口。它的某个实现类使用了 FileChannel 的 transferTo 方法。该方法底层使用 sendfile 实现了 Zero Copy。对 Kafka 而言,如果 I/O 通道使用普通的 PLAINTEXT,那么,Kafka 就可以利用 Zero Copy 特 性,直接将页缓存中的数据发送到网卡的 Buffer 中,避免中间的多次拷贝。相反,如果 I/O 通道启用了 SSL,那么,Kafka 便无法利用 Zero Copy 特性了。
首先,Follower 发送 FETCH 请求给 Leader。接着,Leader 会读取底层日志文件中的消息数据,再更新它内存中的 Follower 副本的 LEO 值,更新为 FETCH 请求中的 fetchOffset 值。最后,尝试更新分区高水位值。Follower 接收到 FETCH 响应之后,会把消息写入到底层日志,接着更新 LEO 和 HW 值。
Leader 和 Follower 的 HW 值更新时机是不同的,Follower 的 HW 更新永远落后于 Leader 的 HW。这种时间上的错配是造成各种不一致的原因。
__consumer_offsets:作用是保存 Kafka 消费者的位移信息
__transaction_state:用来存储事务日志消息
太长了…… 还是放篇比较详细的博客。
https://blog.csdn.net/weixin_44723515/article/details/107583213
还有一些没有还没找答案的,现存一波题目…… 有空就去补上答案。如果答案存在问题,欢迎大佬提出来。
Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?
失效副本是指什么?有那些应对措施?
多副本下,各个副本中的HW和LEO的演变过程
为什么Kafka不支持读写分离?
Kafka在可靠性方面做了哪些改进?(HW, LeaderEpoch)
Kafka中怎么实现死信队列和重试队列?
Kafka中的延迟队列怎么实现(这题被问的比事务那题还要多!!!听说你会Kafka,那你说说延迟队列怎么实现?)
Kafka中怎么做消息审计?
Kafka中怎么做消息轨迹?
Kafka中有那些配置参数比较有意思?聊一聊你的看法
Kafka中有那些命名比较有意思?聊一聊你的看法
Kafka有哪些指标需要着重关注?
怎么计算Lag?(注意read_uncommitted和read_committed状态下的不同)
Kafka的那些设计让它有如此高的性能?
Kafka有什么优缺点?
还用过什么同质类的其它产品,与Kafka相比有什么优缺点?
为什么选择Kafka?
在使用Kafka的过程中遇到过什么困难?怎么解决的?
怎么样才能确保Kafka极大程度上的可靠性?
聊一聊你对Kafka生态的理解
有空一定补上!
https://www.iteblog.com/archives/category/kafka/page/2/
https://www.jianshu.com/p/511962462e58
暂时先附上这么多……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。