我们知道Kafka是一个Topic下有多个partition,具体结构如下:
下面我们就探究下Kafka的partition的组成到底是什么。
假定我们在指定的一个集群中有两个Broker,有2个topic(testTopic,testTopic1),每个topic的都有2个partition,在不同的partition中互为对方的Leader。
则会产生的文件目录应该为,partition的目录为:
|---testTopic-0
|---testTopic1-0
|---testTopic-1
|---testTopic1-1
从上面的分析中可以看出,kafka在文件的存储中,同一个topic下面有多个不同的partition,每一个partition对应为一个文件夹,partition的命名规则为topic+有序的序号。
partition的文件是由Segement组成,使用Segement的好处能够保证单个的文件不会很大,方便删除。文件分为两种类型,分别为log和index,二者组成了一个Segment
, Segment的大小可以通过log.segment.bytes
这个配置进行修改。
我们可以看下正式环境中的文件信息:
可以看到上面的文件信息为:
-rw-r--r--. 1 root root 8 Feb 13 22:55 00000000000000000000.index
-rw-r--r--. 1 root root 6112 Feb 13 22:55 00000000000000000000.log
-rw-r--r--. 1 root root 12 Feb 13 22:55 00000000000000000000.timeindex
-rw-r--r--. 1 root root 10485760 Feb 13 22:55 00000000000000000119.index
-rw-r--r--. 1 root root 7357 Feb 13 22:55 00000000000000000119.log
-rw-r--r--. 1 root root 10 Feb 13 22:55 00000000000000000119.snapshot
-rw-r--r--. 1 root root 10485756 Feb 13 22:55 00000000000000000119.timeindex
-rw-r--r--. 1 root root 8 Feb 13 22:17 leader-epoch-checkpoint
上面的文件一共分为5类,index
,log
,timeidex
,snapshot
和leader-epoch-checkpoint
。
Index:index文件是消息的物理地址的索引文件。 Log:是真正的消息内容。 timeindex:它是映射时间戳和相对offset snapshot:记录了producer的事务信息 leader-epoch-checkpoint:保存了每一任leader开始写入消息时的offset, 会定时更新.
想弄清出这个问题,首先需要了解Index和Log的对应关系。
首先他们的文件最后的数字是当前文件消息的最开始的地址,例如我需要找地址offset=124的消息,那需要加载00000000000000000119.index
这个索引文件, 由于消息文件不是很多, 所以寻找的速度非常快。
Index文件结构:
Index每一个索引项为8字节,其中相对offset占用4字节,消息的物理地址(position)占用4个字节
Log的文件结构:
log文件的参数说明
Index和Log的映射示意图:
当我们想找第130
的消息的时候,我们首先减去当前Index的最开始的地址(119),所以我们得到130-119=11
的Index索引,然后顺序查找Index的地址,找到11,325
这个节点后 ,325就是消息真实的偏移地址。
(本文完)