首页  

kafka面试题及答案     所属分类 kafka 浏览量 1695
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<RecordMetadata> doSend(ProducerRecord<K, V> 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<PartitionInfo> partitions = cluster.partitionsForTopic(topic); List<PartitionInfo> 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后经典老歌