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"目录结构
单节点文件存储
在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上.
由于生产者生产的消息会不断追加到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设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。