Kafka的日志存储

1、文件目录布局

        不考虑多副本的情况,一个分区对应一个日志(log)。为了防止log过大,Kafka还引入了日志分段(LogSegment)的概念,将log切分为多个LogSegment。

        Log对应了一个命名形式为<topic>-<partition>的文件夹。

        向Log中追加消息时时顺序写入的,只有最后一个LogSegment才能执行写入操作。

        为了方便消息的检索,每个LogSegment中的日志文件,以“.log”为文件后缀的都有两个索引文件:偏移量索引文件(“.index”)和时间戳索引文件(".timeindex")。每个LogSegment都有一个基准偏移量baseOffset,用来表示当前LogSegment中第一条消息的offset。

2、日志索引

        偏移量索引文件用来建立消息索引量(offset)和物理地址之间的映射关系,方便快速定位消息所在的物理文件位置。时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。

          Kafka的索引文件以稀疏索引的方式构建消息的索引,它并不保证每个消息在索引文件中都有对应的索引项。每当写入一定量的消息时,偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和时间戳索引项,增大或减少log.index.interval.bytes的值,对应地可以缩小或增加索引项的密度。

        稀疏索引的方式是在磁盘空间、内存空间、查找时间等多方面之间的一个折中,使用二分法来快速定位偏移量的位置。        

2.1、偏移量索引

        每个索引量占据8个字节。relativeOffset是相对偏移量,表示消息相对于baseOffset的偏移量,占据4个字节。position是物理地址,也就是消息在日志分段文件中对应的物理位置。

        没有使用绝对偏移量而使用相对偏移量,是为了节省索引文件所占的空间。绝对偏移量占8和字节,相对偏移量占用4个字节。

        例如:如何查找偏移量是268的消息。首先是定位到baseOffset为251的日志分段,然后计算出relativeOffset=268-251=17,之后再在对应的索引文件中找到不大于17的索引项,最后找到根据索引项中的position定位到具体的日志分段文件位置开始查找目标消息。那么如何查找baseOffset为251的日志分段呢?这里不是顺序查找,而是使用了跳跃表的结构。

2.2、时间戳索引

        timestamp:时间戳索引,当前日志分段最大的时间戳。

        relativeOffset:时间戳所对应的消息的相对偏移量。

        每当消息写入一定量的时候,就会在偏移量索引和时间戳索引文件中分别增加一个偏移量索引项和时间戳索引。两个文件增加的索引项的操作是同时进行的。

        如果要查找timeStamp=15682185885开始的消息,首先是找到不小于指定时间戳的日志分段。这里无法再使用跳跃表定位到对应的日志分段了。

        步骤1:将target和每个日志分段中的最大时间戳largestTimeStamp逐一对比,直到找到不小于target的多对应的日志分段。

        步骤2:找到对应的日志分段后,在时间戳索引文件中使用二分查找算法找到对应的偏移量。

        步骤3:在偏移量索引文件中使用二分查找到不大于此的索引量。

        步骤4:从步骤1中找到日志分段文件中的838的物理位置开始查找不小于target的消息。

3、日志清理

        Kafka将消息存储在磁盘中,为了控制磁盘所占空间的不断增加就需要对消息做一定的清理。两种策略:

        日志删除:按照一定的保留策略直接删除不符合条件的日志分段。三种,基于时间、基于日志大小、基于日志起始偏移量。

        日志压缩:针对每个消息的key进行整合,对于有相同key的不同value值,只保留最后一个版本。

        通过设置broker端的参数log.cleanup.policy来设置日志清理策略,默认值delete,日志压缩是compact。可以同时启用两种方式,“delete,compact”。

4、磁盘存储

        Kafka依赖磁盘来做存储和缓存消息。在我们的印象中,磁盘处于一个尴尬的位置,不是很快。在传统的消息中间件RabbitMQ中,就使用内存作为默认的存储介质。然而,事实上磁盘可以比我们预想的要快,也可能比我们预想的要慢,这取决于我们怎么使用它。

        一项研究表明,磁盘的顺序写入速度和随机写入速度相差6000倍。操作系统可以针对线性读写做深层次的优化,比如预读和后写。顺序写盘的速度不仅比随机写盘的速度快,而且比随机写内存的速度也快。

        Kafka在设计时采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且也不允许修改以写入的消息,这是属于典型的顺序写盘的操作。

4.1、页缓存

        页缓存是操作系统实现的一种主要的磁盘缓存,以此来减少磁盘I/O的操作。具体来说,就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。

        当一个进程准备读写磁盘上的文件内容时,操作系统会先查看读取的数据所在的页(page)是否在页缓存(pagecache)中,如果命中则直接返回数据,从而避免了对物理磁盘的I/O操作。如果没有命中,则操作系统会向磁盘发起读取请求并将读取的数据页存入页缓存中,之后再将数据返回给进程。同样,如果一个进程需要将数据写入磁盘,那么操作系统也会将检测数据对应的页是否在页缓存中,如果不存在,则会先在页缓存中添加相应的页,最后将数据写入页对应的页。被修改后的页也就变成了脏页,操作系统会在合适的时间将脏页中的数据写入磁盘,以保持数据的一致性。

        Kafka中大量使用了页缓存,这是Kafka实现高吞吐的重要因素之一。

4.2、零拷贝

        除了消息顺序追加、页缓存等技术,Kafka还使用零拷贝(Zero-Copy)技术来进一步提升性能。

        所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容