赞
踩
Kafka中的消息是以主题为基本单位进行,各个主题在逻辑上相互独立,每个主题又可以分为一个或多个分区。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配唯一的序列号,即偏移量(Offset),如下图
如果分区规则设置得合理,消息可以均匀地分布到不同的分区中,从而可以实现水平扩展。在不考虑多副本的情况, 一个分区对应一个日志(Log),为防止Log过大,Kafka引入了日志分段(LogSegment)的概念,将Log切分为多个LogSegment,相当于一个巨型文件被平均分配为多个相对较小的文件,方便消息的维护与清理。Log在物理上只以文件夹的形式存储,而每个LogSegment对应磁盘上的一个日志文件和两个索引文件,以及可能的其它文件(比如以“.txnindex”为后缀的事务索引文件)。
举个例子,一个名为“log-test”的主题,有3个分区,则在物理上分为3个文件夹存储:
- drwxr-xr-x 2 root root 4096 Jan 9 21:38 log-test-0
- drwxr-xr-x 2 root root 4096 Jan 9 21:41 log-test-1
- drwxr-xr-x 2 root root 4096 Jan 9 21:41 log-test-2
向Log中追加消息时是顺序写入的,只有最一个LogSegment才能执行写入操作,在之前所有的LogSegment都不能被写入数据。在消息不断写入的同时,Kafka会根据一定条件生成新的LogSegment,之后追加的消息将写入新的LogSegment。
为了便于消息的检索,每个LogSement中的日志文件(以“.log”为文件后缀)都有对应的两个索引文件:偏移量索引文件(以“.index”为文件后缀)和时间戳索引文件(以“.timeindex"为文件后缀)。每个LogSegment都有一个基准偏移量baseOffset,用来表示当前LogSegment中第一条消息的offset。偏移量是一个64位的长整型数,日志文件和两个索引文件都是根据基准偏移量(baseOffset)命名的,名称固定为20位数据,没有达到的则用0填充,如
- -rw-r--r-- 1 root root 10485760 Jan 9 21:38 00000000000000000000.index
- -rw-r--r-- 1 root root 143 Jan 9 21:41 00000000000000000000.log
- -rw-r--r-- 1 root root 10485756 Jan 9 21:38 00000000000000000000.timeindex
- -rw-r--r-- 1 root root 10485760 Jan 9 21:38 00000000000000000144.index
- -rw-r--r-- 1 root root 143 Jan 9 21:41 00000000000000000144.log
- -rw-r--r-- 1 root root 10485756 Jan 9 21:38 00000000000000000144.timeindex
- -rw-r--r-- 1 root root 10485760 Jan 9 21:38 00000000000000000480.index
- -rw-r--r-- 1 root root 143 Jan 9 21:41 00000000000000000480.log
- -rw-r--r-- 1 root root 10485756 Jan 9 21:38 00000000000000000480.timeindex
示例中第2个LogSegment对应的基准位移是144,也说明了该LogSegment中的第一条消息的偏移量为143,同时可以反映出第一个LogSegment中共有144条消息(偏移量从0至143的消息)
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。