Kafka(五)------Kafka文件储存特点

    技术2022-07-11  108

    1、前提准备

    集群名称brokeripkafka集群broker1127.0.0.1

    log.dirs=F://kafka_2.12-2.5.0/data/kafka

    创建两个topic

    topic名称分区数副本数kafkaTopic121kafkaTopic221 #创建topic .\bin\windows\kafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic "kafkaTopic1" .\bin\windows\kafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic "kafkaTopic2"

    目录结构

    2、topic中partiton存储特点

    单节点文件存储

    在Kafka文件存储中,同一个topic下有多个不同partition,每个partition单独为一个目录。

    partiton命名规则:topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。

    多节点kafka集群文件存储

    转载:https://blog.csdn.net/lizhitao/article/details/41778193

    1、下面以一个Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication;数据Producer流动如图所示:

    2、当集群中新增2节点,Partition增加到6个,分布情况如下

    3、副本分配逻辑规则如下:

    在Kafka集群中,每个Broker都有均等分配Partition的Leader机会。

    上述图Broker Partition中,箭头指向为副本,以Partition-0为例:broker1中parition-0为Leader,Broker2中Partition-0为副本。

    上述图种每个Broker(按照BrokerId有序)依次分配主Partition,下一个Broker为副本,如此循环迭代分配,多副本都遵循此规则。

    4、副本分配算法如下:

    将所有N Broker和待分配的i个Partition排序.

    将第i个Partition分配到第(i mod n)个Broker上.

    将第i个Partition的第j个副本分配到第((i + j) mod n)个Broker上.

    3、partition中segment 文件存储特点

    由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment(逻辑概念,等于index+log文件)

    每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等的segment(片段)数据文件中(每个segment文件中消息数量不一定相等),这种特性也方便old segment的删除,即方便已被消费的消息的清理,提高磁盘的利用率。每个partition只需要支持顺序读写就行,segment的文件生命周期由服务端配置参数(log.segment.bytes,log.roll.{ms,hours}等若干参数)决定。

    每个segment对应三个文件

    #索引文件,便于利用二分查找快速定位message位置 .index #数据文件 .log #0.8版本之后引入timeindex文件,标识具体时间日志 .tiemindex

    命令规则

    从partition全局的第一个segment从0开始,后续每个segment文件名以当前segment的第一条消息的offset命名,数值大小为64位,20位数字字符长度,没有数字用0填充。

    在partition中如何通过offset查找message

    .index索引文件存储大量的索引信息,.log数据文件存储大量消息数据(Message),索引文件中的元数据指向对应数据文件中Message的物理偏移地址。

    第一步:需要定位到哪个segment file 00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0;第二个文件00000000000000368770.index的起始偏移量为368770,依次类推。以起始偏移量命名并排序这些文件,只要根据offset二分查找文件列表,就可以快速定位到具体文件。

    当offset=368776时,定位到00000000000000368770.index|log。

    第二步:通过Segment File 查找Message 通过第一步定位到Segment File,当offset=368776时,依次定位到00000000000000368770.index的元数据物理位置和00000000000000368770.log的物理偏移地址,然后再通过00000000000000368770.log顺序查找,直到offset=368776为止。

    Segment Index File采取稀疏索引存储方式,可以减少索引文件大小,通过Linux mmap接口可以直接进行内存操作。稀疏索引为数据文件的每个对应Message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

    Processed: 0.011, SQL: 9