kafka面试题及答案
所属分类 kafka
浏览量 1705
Kafka 特点
使用场景
架构简介及关键术语
分区的目的
如何做到消息的有序性
高可靠性如何实现
数据一致性原理
ISR、OSR、AR 是什么
LEO、HW、LSO、LW 是什么
消费者和消费组之间的关系
数据传输的事务有几种
如何指定分区消费消息
消费消息是 Pull模式 还是 push 模式
消息文件存储特点
创建Topic时如何将分区放置到不同的Broker中
再均衡机制
分区分配策略
Producer如何动态感知主题分区数变化
如何实现高性能高吞吐量
监控手段有哪些
如何选择合适的Partitions数量
Kafka 事务 和 幂等
kafka缺点
新旧消费客户端的区别
分区数可以增加或减少吗
offset保存机制
Kafka 特点
高吞吐量、低延迟
可扩展性
持久性、可靠性 消息持久化到本地磁盘,支持数据副本备份防止数据丢失
容错性 支持多个副本 热备
高并发
使用场景
日志收集
消息系统 解耦
用户活动跟踪 订阅者实时分析 或 写入 hadoop、数据仓库 做离线分析
流式处理
架构简介及关键术语
Producer
Consumer
Topic
ConsumerGroup
Broker
Partition
offset
分区的目的
集群 实现负载均衡
消费者 提高并发度 提升效率
如何做到消息的有序性
每个 partition 消息写入有序
一个 partition只能由一个消费者消费
单个 partition 有序
高可靠性如何实现
副本机制
发送端 消息发送确认机制 acks ,同步发送
Leader 副本 选举
controller 宕机时会触发 controller failover
kafka高可用机制简介
数据一致性原理
不论是老的 Leader 还是新选举的 Leader,Consumer 都能读到一样的数据
High Water Mark HW
HW 取决于 ISR 列表里面偏移量最小的副本
Consumer 只能看见 HW之前的消息 消息可见性
类似木桶原理 水位
副本复制消息时允许的最大延迟时间 replica.lag.time.max.ms
ISR、OSR、AR 是什么
ISR In-Sync Replicas
OSR Out-of-Sync Replicas
AR Assigned Replicas
ISR由leader维护
副本复制消息时允许的最大延迟时间 replica.lag.time.max.ms
超出阈值 剔出 ISR, 放入OSR
AR=ISR+OSR
LEO、HW、LSO、LW 是什么
LEO LogEndOffset
HW high watermark ISR中 最小的 LEO 作为 HW ,HW之前的消息对consumer可见
LSO LastStableOffset
对于未完成的事务,LSO 等于事务中第一条消息的位置(firstUnstableOffset)
对于已完成的事务,与 HW 相同
LW Low Watermark AR 集合中最小的 logStartOffset
消费者和消费组之间的关系
Consumer 消息消费者,consumer从 topic 拉取消息
ConsumerGroup 消费组,一个ConsumerGroup可以包含一个或多个consumer ,同一个消费组内,一条消息只能被一个消费者消费
每一个分区只能被同一个消费组中的一个消费者消费
三种策略
RangeAssignor RoundRobinAssignor StickyAssignor
默认 RangeAssignor
对于每个主题,以数字顺序排列可用分区,以字典顺序排列消费者。
将分区数量除以消费者总数, 整除则平均分配 ,否则排在前面的消费者分配一个额外的分区
数据传输的事务有几种
最多一次 At most once
最少一次 At least once
精确的一次 Exactly once
如何指定分区消费消息
consumer消费消息时,向broker发出fetch请求去消费特定分区的消息,
consumer指定消息在日志中的偏移量(offset),消费从这个位置开始的消息,
customer拥有offset的控制权,可以向后回滚重新消费之前的消息
消费消息是 Pull模式 还是 push 模式
producer将消息推送到broker,consumer从broker拉取消息
消息文件存储特点
存储机制
每个分区一个文件夹
topicName-partitionID
分区序号从0开始
每个分区多个segment
xxx.index xxx.log
xxx 为 message在partition中的起始偏移量
log.segment.bytes=1073741824
索引文件
0.10以后的版本中 有两个索引文件
xxx.index
xxx.timeindex
稀疏索引
log.index.interval.bytes 设置索引跨度
index 索引内容
offset,position
时间戳索引文件
索引内容
timestamp,offset
创建Topic时如何将分区放置到不同的Broker中
Kafka中的分区分配
再均衡机制
触发再平衡
consumer group consumer成员变化
consumer订阅的topic发生变化
consumer订阅的topic新增分区
三种策略
RangeAssignor RoundRobinAssignor StickyAssignor
默认 RangeAssignor
对于每个主题,以数字顺序排列可用分区,以字典顺序排列消费者。
将分区数量除以消费者总数, 整除则平均分配 ,否则排在前面的消费者分配一个额外的分区
StickyAssignor
尽量保证均衡
尽量保证当前未宕机的consumer所消费的分区不会被分配给其他的consumer
Kafka中的分区分配
分区分配策略
Kafka中的分区分配
Producer如何动态感知主题分区数变化
private Future doSend(ProducerRecord record, Callback callback) {
TopicPartition tp = null;
try {
// first make sure the metadata for the topic is available
ClusterAndWaitTime clusterAndWaitTime = waitOnMetadata(record.topic(), record.partition(), maxBlockTimeMs);
DefaultPartitioner
List partitions = cluster.partitionsForTopic(topic);
List availablePartitions = cluster.availablePartitionsForTopic(topic);
如何实现高性能高吞吐量
partition 并行处理
顺序写磁盘
利用操作系统 Page Cache 提高 磁盘I/O 效率
零拷贝 mmap 文件映射 sendfile,磁盘文件读到 OS 内核缓冲区后,转到 NIO buffer 网络发送
kafka高性能要点
监控手段有哪些
JMX
jmx_prometheus_javaagent
自带的工具
kafka运维常用命令
第三方工具
Kafka Eagle
Kafka Web Console
Kafka Manager
KafkaOffsetMonitor
如何选择合适的Partitions数量
分区 并行 提高吞吐量
分区 文件句柄资源消耗
分区过多,会影响可用性和消息延迟
只有在消息提交之后,才对消费者可见 , HW机制
in-sync副本列表同步完成后才可见
in-sync副本复制时间是端对端延迟的主要部分
Kafka 事务 和 幂等
Kafka幂等和事务
kafka缺点
批量发送,非实时 , 可改为立即发送
对mqtt协议不支持
不支持物联网传感数据直接接入
仅支持统单一分区内消息有序,无法实现全局消息有序
监控不完善,需要安装插件
依赖zookeeper进行元数据管理
新旧消费客户端的区别
旧API 主要包括 SimpleConsumer(简单消费者) 和 ZookeeperConsumerConnectir(高级消费者)
SimpleConsumer 可以从特定的分区和偏移量开始读取消息
|
旧版高级API |
新版 |
连接 |
ZK |
kafka集群 |
分区分配 |
ZK监听器 |
协调者 |
消费消息 |
ConsumerInterator |
ConsumerRecords |
偏移提交 |
ZK/协调者 |
协调者 |
分区数可以增加或减少吗
只能增不能减
不能减的原因
减少的分区其数据放哪里?
把数据追加到其他分区?
offset 保存机制
offset 更新到 kafka自带的topic __consumer_offsets 下面
0.10版本后,引入 __consumer_offsets ,写入消息key由groupid topic partition 组成,value是offset
清理策略compact ,保留最新的key
一般情况,每个key的offset缓存在内存中,查询的时候不用遍历partition,
如果没有缓存,第一次会遍历partition建立缓存,然后查询返回
consumer group位移信息写入__consumers_offsets的哪个partition,具体计算公式
__consumers_offsets partition =
Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount)
//groupMetadataTopicPartitionCount 由 offsets.topic.num.partitions 指定,默认50个分区
消息格式的演变
偏移量的演变
参考资料
kafka高可用机制简介
kafka核心知识点
kafka高性能要点
kafka运维常用命令
kafka集群搭建
Kafka中的分区分配
Kafka幂等和事务
kafka消费者offset记录位置和方式
上一篇
下一篇
Kafka中的分区分配
linux OOM Killer 如何破
Kafka幂等和事务
深入理解Kafka:核心设计与实践原理 读书笔记
管理学精髓:4大管理定律、4大管理法则、5大管理效应
80后经典老歌