Kafka核心理论要点
问题01:什么是消息队列?
- 消息队列就是用于当两个系统之间或者两个模块之间实现消息传递时,基于队列机制实现数据缓存的中间件
问题02:消息队列有什么好处?
- 实现解耦,将高耦合转换为低耦合
- 通过异步并发,提高性能,并实现最终一致性
问题03:Kafka是什么?
- Kafka是一个基于订阅发布模式的高性能、高吞吐的实时消息队列系统
问题04:Kafka在大数据中用于什么场景下?
- 用于实时架构中,实现将实时数据采集的数据进行实时存储,供于SparkStreaming或者Flink等工具实现实时数据消费处理
问题05:请简述Kafka的集群架构
- Kafka是一个分布式主从架构集群
- 主节点:Kafka Controller:一种特殊的Broker,由ZK辅助实现从所有Broker中选举,负责集群管理,管理Topic及分区副本等
- 从节点:Kafka Broker:负责实现Kafka集群的数据存储
- Kafka依赖于Zookeeper实现集群辅助管理
- 基于Zookeeper辅助选举Controller
- 基于Zookeeper存储元数据
问题06:Kafka中消费者与消费者组的关系是什么?
- 消费者组负责订阅Topic,消费者负责消费Topic分区的数据
- 消费者组中可以包含多个消费者,多个消费者共同消费数据,增加消费并行度,提高消费性能
- 消费者组的id由开发者指定,消费者的id由Kafka自动分配
问题07:Kafka中Topic和Partition是什么,如何保证Partition数据安全?
- Topic:逻辑上实现数据存储的分类,类似于数据库中的表概念
- Partition:Topic中用于实现分布式存储的物理单元,一个Topic可以有多个分区
- 每个分区可以存储在不同的节点,实现分布式存储
- 保证数据安全通过副本机制:Kafka中每个分区可以构建多个副本【副本个数 <= 机器的个数】
- 将一个分区的多个副本分为两种角色
- leader副本:负责对外提供读写请求
- follower副本:负责与leader同步数据,如果leader故障,follower要重新选举一个成为leader
- 选举:由Kafka Crontroller来决定谁是leader
问题08:Kafka中的Segment是什么?
- Segment是对分区内部的数据进行更细的划分,分区段,文件段
- 规则:按照文件产生的时间或者大小
- 目的:提高写入和查询性能
- 文件名称可以用于检索数据:用offset命名的
- 组成:每个Segment由两个文件组成
- .log:存储的数据
- .index:对应.log文件的索引信息
问题09:Kafka中的Offset是什么?
- Offset是kafka中存储数据时给每个数据做的标记或者编号
- 分区级别的编号,每个分区从0开始编号
- 功能:消费者根据offset来进行消费,保证顺序消费以及消费数据的一次性语义
问题10:请简述如何使用Kafka Simple Java API 实现数据生产?描述具体的类及方法
- step1:构建生产者连接对象:KafkaProducer
- 需要配置对象:管理配置,例如连接地址:Properties
- step2:KafkaProducer:send:生产数据到Kafka中
- 需要构建一个生产的数据对象:ProducerRecord
- ProducerRecord(Topic,Value)
- ProducerRecord(Topic,Key,Value)
- ProducerRecord(Topic,Partition,Key,Value)
问题11:请简述如何使用Kafka Simple Java API 实现数据消费?描述具体的类及方法
- step1:构建消费者连接对象:KafkaConsumer
- 需要配置对象:管理配置,例如连接地址:Properties
- step2:消费者需要订阅Topic
- KafkaConsumer:subscribe(List)
- step3:消费数据
- KafkaConsumer:poll:实现拉取消费数据
- ConsumerRecords:拉取到的所有数据集合
- ConsumerRecord:消费到的每一条数据
- topic:获取数据中的Topic
- partition:获取数据中的分区编号
- offset:获取数据的offset
- key:获取数据中的Key
- value:获取数据中的Value
问题12:请简述Kafka生产数据时如何保证生产数据不丢失?
- acks机制:当接收方收到数据以后,就会返回一个确认的ack消息
- 生产者向Kafka生产数据,根据配置要求Kafka返回ACK
- ack=0:生产者不管Kafka有没有收到,直接发送下一条
- 优点:快
- 缺点:容易导致数据丢失,概率比较高
- ack=1:生产者将数据发送给Kafka,Kafka等待这个分区leader副本写入成功,返回ack确认,生产者发送下一条
- 优点:性能和安全上做了平衡
- 缺点:依旧存在数据丢失的概率,但是概率比较小
- ack=all/-1:生产者将数据发送给Kafka,Kafka等待这个分区所有副本全部写入,返回ack确认,生产者发送下一条
- 优点:数据安全
- 缺点:慢
- 如果使用ack=all,可以搭配min.insync.replicas参数一起使用,可以提高效率
- min.insync.replicas:表示最少同步几个副本以后,就返回ack
- ack=0:生产者不管Kafka有没有收到,直接发送下一条
- 如果生产者没有收到ack,就使用重试机制,重新发送上一条消息,直到收到ack
问题13:请简述Kafka生产数据时如何保证生产数据不重复?
- 数据重复的场景:Kafka写入数据,返回ack,但是ack丢失,生产者没有收到ack,重新写入数据,导致Kafka数据重复
- Kafka中使用幂等性机制来保证生产数据不重复
- step1:发送数据时,给每条数据增加一个数据id的编号,每次下一条数据的编号自增1
- step2:Kafka将数据写入,并记住写入的数据id
- step3:如果下一条数据的id与上一次的数据id一致,就不写入,直接返回ack
问题14:Kafka中生产者的数据分区规则是什么,如何自定义分区规则?
- 如果指定了分区:就写入指定的分区
- 如果没有指定分区,就判断是否指定了Key
- 如果指定了Key:根据Key的Hash取余分区
- 如果没有指定Key:根据黏性分区来实现
- 自定义分区
- 开发一个类实现Partitioner接口
- 实现partition方法
- 在生产者中指定分区器的配置
问题15:Kafka中消费者消费数据的规则是什么?
- 消费者根据Offset对Topic中的分区进行消费
- 第一次消费:根据auto.offset.reset属性进行消费
- latest:从最新的位置开始消费
- earliest:从头开始消费
- 第二次消费:根据上一次的offset 1继续消费
问题16:如果消费者遇到故障,Kafka怎么保证不重复不丢失?
- Kafka通过消费者commit Offset机制将每个消费者每次消费的位置存储在__consumer_offset中来保证每个消费者如果故障,依旧能从上一次的位置继续消费
问题17:一个消费者组中有多个消费者,消费多个Topic多个分区,分区分配给消费者的分配规则有哪些?
问题18:Kafka写入数据过程是什么?
- step1:生产者构建批次,提交给Kafka集群
- step2:Kafka根据分区规则,检索元数据,将请求转发给Leader副本对应Broker
- step3:先写Broker的PageCache
- step4:后台实现将PageCache中顺序写同步到磁盘中:.log文件
- step5:Follower同步Leader副本的数据
问题19:Kafka读取数据过程是什么?
- step1:消费者请求读取数据:Topic Partition Offset
- step2:Kafka根据元数据,找到对应分区的leader副本进行检索
- step3:先检索PageCache
- 如果有,就通过零拷贝机制从PageCache中读取数据
- 如果没有,就读取Segment文件段
- step4:先根据Offset找到对应的Segment的一对文件
- step5:先读index,找到offset对应的数据在.log文件中的最近位置
- step6:根据位置,读取.log文件
问题20:为什么Kafka读写会很快?
- 写很快
- 应用了PageCache的页缓存机制
- 顺序写磁盘的机制
- 读很快
- 优先基于PageCache内存的读取,使用零拷贝机制
- 按照Offset有序读取每一条
- 构建Segment文件段
- 构建index索引
问题21:为什么要设计Segment?
- 加快查询效率:将数据划分到多个小文件中,通过offset匹配可以定位某个文件,从小数据量中找到需要的数据
- 提高删除性能:以Segment为单位进行删除,避免以每一条数据进行删除,影响性能
问题22:什么是AR、ISR、OSR?
- AR:all replicas
- 所有副本 = ISR OSR
- ISR:In-sync-replicas
- 表示正在同步的副本 =》 可用副本分区
- 如果Leader故障,会从ISR中选举一个新的leader
- OSR:Out-sync-replicas
- 表示不健康的副本 =》 不可用副本
- 判断依据 #如果这个从副本在这个时间内没有与leader副本同步数据,认为这个副本是不正常的 replica.lag.time.max.ms = 10000
问题23:什么是HW、LEO?
- HW:表示当前leader副本中所有Follower都已经同步的位置 1,高水位线
- LEO:表示当前leader副本最新的数据位置 1
- 消费者能消费到的位置是HW:为了保证消费者消费分区数据的统一性
问题24:什么是一次性语义?
- at-most-once:最多一次
- at-least-once:至少一次
- exactly-once:有且仅有一次
问题25:Kafka如何保证消费者消费数据不重复不丢失?
- Kafka消费者通过Offset实现数据消费,只要保证各种场景下能正常实现Offset的记录即可
- 保证消费数据不重复需要每次消费处理完成以后,将Offset存储在外部存储中,例如MySQL、Zookeeper、Redis中
- 保证以消费分区、处理分区、记录分区的offset的顺序实现消费处理
- 如果故障重启,只要从外部系统中读取上一次的Offset继续消费即可