kafka夺命三十问——16-22问
16、kafka是如何做到高效读写
1、kafka本身是分布式集群,且采用分区技术,并行度高
2、读取数据使用的是稀疏索引,可以很快定位到需要的数据
3、数据是顺序写入磁盘的,减少大量的寻址时间。
4、页缓存和零拷贝技术
页缓存:类似mysql的缓冲池,kafka是根据底层操作系统中PageCache,尽可能多的将空闲内存当作磁盘的缓冲区,当内存中找不到时,才会去磁盘寻找
零拷贝技术:在传统的数据拷贝技术中,将数据发送到网络上的时,通常需要多次数据拷贝步骤。Kafka 使用零拷贝技术,通过操作系统支持的 sendfile
系统调用,将数据直接从磁盘读取并发送到网络,绕过了用户空间,降低了 CPU 使用率和内存开销。
17、Kafka集群中数据的存储是按照什么方式存储的?
首先每个topic中的每一个分区会占用一个文件夹,用于存放数据,kafka中的数据是以segment为单位进行存储的,每个segment最大占用1G,其中segment又分为index(索引)和log(数据)文件。
但是上面只是逻辑上的存储方式,实质上是没有segment相关的文件夹的,而是含有编号的index和log文件,当其存放的数据在1G左右时,会生成新的index和log文件。
18、kafka中是如何快速定位到一个offset的。
kafka会在index文件中存放一个相对的offset,用文件名来表示该文件从哪个offset开始,
因此,若想找到一个offset,先找到相对应的index文件,然后在该文件中找到相对的offset,其中也同样记录了数据的position值,去log文件中进行对比,即可定位到offset
19、简述kafka中的数据清理策略。
1、删除
kafka中的数据删除时,是以segment为单位的,当其过期时间达到,即会删除该segment
2、压缩
并不是真正的压缩,若有两条数据的key值相等,但是value不同,只会保留一个版本。
类似不同阶段的一条信息,只会保留最新的版本。
20、消费者组和分区数之间的关系是怎样的?
每个消费者组中消费者的数量必须小于等于分区数,同一个消费者组中的不同消费者是不能消费同一个分区的。
21、kafka如何知道哪个消费者消费哪个分区?
每个broker中都会有一个coordonator,用于辅助消费者组中每一个消费者的分配。
首先,会根据group_id为每一个消费者组分配一个coordonator,然后在消费者组中会出现一个leader,将分配的计划发送给对应的coordonator,最后,coordonator根据该计划制作方案,然后发送给所有的消费者,消费者执行即可。
22、kafka消费者的消费分区策略有哪些,默认是什么?
1、range
2、RoundRobin(轮询)
3、Sticky(粘性)
4、CooperativeSticky(合作的粘性)
默认是range+CooperativeSticky