首页 新闻 会员 周边

Kafka 中一类是系统运行日志(用于排查故障),另一类是业务数据文件(用于存储实际消息)。

0
[已关闭问题] 关闭于 2026-06-18 15:36

1. 业务数据目录(Data Directory)
● 配置项:由 server.properties 配置文件中的 log.dirs 参数指定。
● 常见路径:通常会被规划到服务器磁盘空间最大的独立数据盘,例如 /data/kafka-logs
●       存放内容:存储 Kafka 的核心业务数据(即生产者发送的海量消息)。里面会包含大量以  Topic名称-分区号  命名的文件夹,以及  .log (数据)、 .index (偏移量索引)和  .timeindex (时间索引)等文件

Kafka 数据文件(业务消息存储)
这是 Kafka 的核心存储机制。Kafka 采用追加式日志结构来存储消息,数据按 Topic -> Partition -> Segment 的层级组织。
1. 存储位置
数据文件的路径由配置文件 server.properties 中的 log.dirs 属性决定(例如 /data/kafka-logs )。
2. 目录结构
每个 Partition(分区)对应一个独立的文件夹,命名规则为 topic名称-分区序号 (如 test-0 )。在该文件夹下,数据被切分为多个 Segment(段),每个 Segment 包含以下核心文件:
● .log 文件(数据文件):实际存储消息内容的二进制文件。消息被顺序追加到文件末尾。
● .index 文件(偏移量索引):稀疏索引文件,记录消息偏移量(Offset)与 .log 文件中物理位置的映射关系,用于加速消息检索。
● .timeindex 文件(时间索引):记录时间戳与 Offset 的映射关系,方便根据时间查找消息。
● 其他元数据文件:如 leader-epoch-checkpoint 、 partition.metadata 等,用于记录副本状态和分区元数据。

3. 查看方式
由于  .log  文件是二进制格式,直接使用  cat  命令查看会出现乱码。必须使用 Kafka 提供的专用工具:

# 使用 DumpLogSegments 工具解析并查看数据文件内容
./bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /path/to/kafka/logs/my_topic-0/00000000000000000000.log --print-data-log
```[[source_group_web_8]]

问题补充:

此图就是系统运行日志在kafka启动脚本中

 

2.系统运行日志(文本格式)

方法一:临时生效(命令行指定)
在启动 Kafka 之前,先设置环境变量 LOG_DIR :

export LOG_DIR=/var/log/kafka
bin/kafka-server-start.sh config/server.properties &

方法二:永久生效(修改脚本或配置文件)
● 修改 kafka-run-class.sh :直接在脚本开头添加 export LOG_DIR=/你的新路径 。
● 或者修改 kafka-server-start.sh :在这个启动脚本的最前面加上 export LOG_DIR=/你的新路径 (推荐这种方式,因为不破坏基础库脚本)。

●       系统日志( server.log ,  controller.log  等):由  kafka-run-class.sh  中的  LOG_DIR  控制。

*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1762
提问于:2026-06-18 15:29
< >
分享
所有回答(1)
0

●       业务数据(Topic 的消息文件):依然由  config/server.properties  中的  log.dirs  控制。

●       系统日志( server.log ,  controller.log  等):由  kafka-run-class.sh  中的  LOG_DIR  控制。是不是很像

*Tesla* | 园豆:1762 (小虾三级) | 2026-06-18 15:35

(6500, 81920)  这个“路标”就被永远地刻在了  .index  文件

1. 写数据:Kafka 把消息追加写入到 .log 文件中。假设这条消息刚好写到了 .log 文件的第 81920 个字节处。
2. 算相对值:Kafka 知道当前这个 .log 文件的起始 Offset 是 12345 。当前消息的绝对 Offset 是 18845 。Kafka 用 18845 - 12345 ,算出相对偏移量是 6500。
3. 写索引:Kafka 立刻在对应的 .index 索引文件中追加写入一条记录:前 4 个字节存相对偏移量 6500 ,后 4 个字节存物理位置 81920

支持(0) 反对(0) *Tesla* | 园豆:1762 (小虾三级) | 2026-06-19 11:13

(物理存储)
在硬盘上, .index 文件其实就是一个极其简单的、连续的数组(底层使用了内存映射 MMap 技术)。它没有任何复杂的表头或元数据,就是紧挨着的 8 字节组合:

[相对Offset(4B)] [物理位置(4B)] | [相对Offset(4B)] [物理位置(4B)] | ...
[ 6400 ] [ 73728 ] | [ 6500 ] [ 81920 ] | ...

支持(0) 反对(0) *Tesla* | 园豆:1762 (小虾三级) | 2026-06-19 11:30

这个“物理位置”指的是文件在磁盘上的“字节偏移量(Byte Offset)”,而绝对不是“内存地址”。

● 当 Kafka 把消息写入磁盘时,它是按字节顺序追加(Append)的。
● 假设第一条消息占 100 字节,第二条消息占 200 字节。那么第二条消息在 .log 文件中的“物理位置”就是 100。
● 这个 100 代表的是:从文件开头算起,跳过 100 个字节。它是一个与内存无关的、纯粹针对磁盘文件的“相对坐标”。

●       在索引文件中记录的:是纯粹的磁盘字节偏移量(比如  81920  字节)。

支持(0) 反对(0) *Tesla* | 园豆:1762 (小虾三级) | 2026-06-19 12:53

Offset(偏移量)是完全根据“消息条数”自增的,与消息的字节大小没有任何关系。

正如你所说,每条消息的字节数肯定是不一样的(有的只有几十字节,有的可能高达几 MB),但 Kafka 在分配 Offset 时,完全无视了这种大小差异。

1. 核心规则:按条递增,无视大小
Kafka 的 Offset 是一个 64 位的长整型(Long)数字。每当生产者往某个分区写入一条新消息时,Broker 就会把当前的 Offset 加 1。
● 第一条消息写入,Offset = 0
● 第二条消息写入,Offset = 1
● 第三条消息写入,Offset = 2
无论第二条消息是 100 字节还是 100MB,第三条消息的 Offset 永远都是 2。

你之所以会有这个疑问,很可能是因为 “Offset(偏移量)” 和 “物理位置(Position)” 这两个词在字面上太像了。在 Kafka 中,它们代表着完全不同的两套坐标系:
● Offset(逻辑偏移量):代表“这是这个分区里的第几条消息”。它是逻辑上的,按条数 +1 递增。
● 物理位置(Physical Position):代表“这条消息在 .log 文件里的第几个字节”。它是物理上的,按字节数累加。

支持(0) 反对(0) *Tesla* | 园豆:1762 (小虾三级) | 2026-06-19 13:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册