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,它将关闭该文件并启动一个新文件;
-
在任何时间点,只有一个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具有特定时间戳的消息 |
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;
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必须打开大量文件,可能导致"打开的文件太多"错误;