Topic
Kafka中的Message,是以topic为基本单位存储信息的。每个topic可以分成不同的分区(partition),每个partition存储一部分message。请看官方图:
partition,是以文件的形式存储在集群中的文件系统中的,比如,创建一个名为connector-topic,有2个分区,那么在Kafka的数据目录中,log.dirs中就有2个这样的目录:connector-topic-0,connector-topic-1,命名规则为:<topicName>-<partitionId>,里面存储的就是这2个partition的数据。
来,看看具体的分区信息:
[hadoop@Ip kafka]$ ./bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic connector-topic
Topic:connector-topic PartitionCount:2 ReplicationFactor:2 Configs:
Topic: connector-topic Partition: 0 Leader: 1 Replicas: 2,1 Isr: 1,2
Topic: connector-topic Partition: 1 Leader: 3 Replicas: 3,2 Isr: 3,2
Partition的数据文件
Partition中的每个Message由Offset来表示他在这个partition中的偏移量,这个Offset不是该Message在partition数据文件的实际存储位置,而是逻辑上的一个数值,但就是逻辑上的数值,对我们来说,就足够了。每个Message包含三个属性,offset,messageSize,data,其中offset为Long型,MessageSize为int32,表示data有多大,data为message的具体内容
数据文件的分段
Kafka解决查询效率的手段之一是将数据文件分段,比如有100个Message,他们offset是从0到99。假设数据文件分成5段,第一段为0-19,第二段20-39,依次类推,每段放在一个单独的数据文件里面,数据文件一该段中最小的offset命名。这样再查找制定的offset的Message的时候,用二分查找就可以定位到该Message在哪个段中
为数据文件建索引
数据文件分段使得可以在一个较小的数据文件中查找对应的offset的Message了,但是这依然需要顺序扫描才能找到对应的offset的message,为了进一步提高查找的效率,Kafak为每个分段的数据文件建立索引文件,文件名与数据的名字是一样的,只是文件扩展名为.index
索引包含两个部分,分别为相对offset和position
相对offset,
position,表示该条Message在数据文件的绝对位置