1. Topic Config

  • kafka主题内部(Internal):片段(Segment)和索引(Index);

  • kafka如何处理文件格式和索引等存储的;
    kafka handle storage such as file format and index;

2. Topic Partition and Segment

  • kafka基本存储单元是分区复制品(partition replica);

  • 当创建主题,kafka首先决定如何在broker间分配(allocate)分区;

  • 它在broker之间平均分布复制副本;
    spread replica evenly among broker;

  • kafka broker将每个分区划分为若干个段(segment),
    broker split each partition into segment;

  • 每个segment都存储在连接到broker的磁盘上的单个数据文件中;

  • 默认:每个segment包含1G数据或一周(week)的数据,以先达到的限制为准;
    whichever limit is attained first;

  • 当kakfa broker接收到分区数据时,当达到分段限制时,
    as segment limit reach,它将关闭该文件并启动一个新文件;

TopicPartitionAndSegment
  • 在任何时间点,只有一个segment处于active状态,即正在写入的
    segment,只有事先关闭一个segment,才能删除该segment;

  • segment的大小由两个broker配置控制,也可由主题级别修改;

Entry Memo

log.segment.bytes

单个segment的最大大小,单位字节,默认1G

log.segment.ms

若segment未满,kafka在提交segment之前等待的时间,默认1周

  • kafka broker为每个分区中的每个segment(甚至非活动segment),
    保留一个打开的文件句柄(file handle),这导致通常大量的打开文件句柄,
    且必须相应的调整OS(tune OS accordingly);

3. Topic Segment and Index

  • kafka允许消费者从任何可用的偏移量开始获取消息,为帮助broker快速
    定位locate给定偏移量的消息,kafka为每个segment维护两个索引:

Entry Memo

offset to position index

帮助kafka知道要读取segment的哪一部分来查找find消息

timestamp to offset index

允许kafka查找find具有特定时间戳的消息

TopicSegmentAndIndex

4. Inspecting Directory Structure

  • kafka将其所有数据存储在broker磁盘上的一个目录中,
    此目录是使用broker配置文件中的属性log.dirs指定;

# 逗号分隔多个目录列表
log.dirs = /tmp/kafka-log
  • 浏览(Explore)目录,注意每个主题分区都有一个文件夹,
    分区的所有segment都位于分区目录内;

  • 如主题product-price有三个分区,那每个分区都有一个目录,
    如product-price-0,product-price-1,product-price-2

  • 下降(Descend)到主题分区目录中,存储消息的segment和
    segment文件本身的索引:time and offset;

TopicSegmentIndex

5. Segment Configuration

5.1. log.segment.bytes

  • 当消息被生成到kafka broker时,它们被append到分区的当前segment,一旦达到
    log.segment.bytes的指定大小(默认1G),则关闭segment并打开新的segment;

  • 较小的segment意味必须更频繁的关闭和分配allocate文件,
    这会降低磁盘写入的总体效率(reduce overall efficiency);

  • 一旦某segment被关闭,它就可被视为过期expiration,若主题的
    生产效率过低(low produce rate),调整segment大小可能很重要;

  • 若segment较小,则意味kafka必须打开大量文件,可能导致"打开的文件太多"错误;

5.2. log.segment.ms

  • 此为控制segment何时关闭的另一种方式,默认1周,kafka
    将达到大小或时间限制时(以先达到为准)关闭一个segment;

  • 在使用基于时间的segment限制时,主要考虑:同时关闭多个segment时对磁盘性能的影响;

  • 决定是否要daily compaction而不是weekly compaction;