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

1、前提准备

集群名称 broker ip
kafka集群 broker1 127.0.0.1

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

创建两个topic

topic名称 分区数 副本数
kafkaTopic1 2 1
kafkaTopic2 2 1
#创建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"

目录结构
Kafka(五)------Kafka文件储存特点_第1张图片

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流动如图所示:

Kafka(五)------Kafka文件储存特点_第2张图片
2、当集群中新增2节点,Partition增加到6个,分布情况如下

Kafka(五)------Kafka文件储存特点_第3张图片

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文件)

Kafka(五)------Kafka文件储存特点_第4张图片

每个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设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

你可能感兴趣的:(kafka,kafka,java)