kafka读书笔记---日志存储
1 log在物理上就是一个文件夹,LogSegment对应一个日志文件和两个索引文件
kafka的日志目录结构:
1、一个主题可以有多个分区
2、每个分区可以有多个副本
3、每个分区副本占用一个磁盘目录
4、每个分区副本的磁盘目录下,存放这个分区的日志文件
5、每个日志文件被分成多个日志分段,防止日志文件过大不便维护
6、每个日志分段文件,对应一个偏移量索性文件和时间戳索引文件,以及其他文件
7、写入消息时,消息只能追加到活跃的日志分段中
每 LogSegment 都有 个基准偏移 baseOffset ,用来表示当前 LogSegment
中第一条消息的 offset 偏移量是一个 64 位的长整型数,日志文件和两个索引文件都是根据基
准偏移量( baseOffset )命名的,名称固定为 20 位数字,没有达到的位数则用 填充 比如第
一个 LogSegment 的基准偏移量为 ,对应的日志文件为 00000000000000000000.log
每一个根目录都会包含最基本的4个检查点文件( xxx-checkpoint )和 meta.properties 文件 。
===========================================================================================
V0消息格式
下面具体陈述一下消息格式中 的各个字段,从 crc32 开始算起,各个字段的解释如下。
crc32 (4B ) : crc32 校验值。校验范围为 ma gic value 之间
magic (1B):消息格式版本号 此版本的 magic 值为
attributes ( 1B 消息的属性。总共占 个字节 位表示压缩类型: 表示 NONE 表示 GZIP 表示 SNAPPY 表示 LZ4 LZ4 Kafka 0.9.x 引入),余位保留。
key length 4B 表示消息的 key 的长度。如果为-1 ,则表示没有设置 key ,即key= null
key :可选 如果没有 key 则无此宇段。
value length 4B 实际消息体的长度。如果为-1,则表示消息为空。
value :消息体。可以为空,比如墓碑( tombstone )消息。
v0 版本中一个消息的最小长度( RECORD_OV fEAD_VO )为 crc32 + magic + attributes + key length+ value length= 4B + 1B + 1B + 4B + 4B 14B 就是说, vO 版本中一条消息长度为 14B ,如果 于这个值,那么这就是一条破损的消息而不被接收。
==============================================================================
V1的消息格式
版本的 magic 字段的值为1. v1 版本的 attributes 字段中的低 3位和 V0版本的一样,还是表示压缩类型,而第 4个位( bit )也被利用了起来: 0表示 timestamp 类型为 CreatTime, 而1 表示 timestamp 类型为 LogAppendtime ,其他位保留。 timestamp 类型由 broker 端参数 log.message.timestamp.type 来配置,默认值为 Createtime 即采用生产者 建消息 时的时间戳。如果在创建 ProducerRecord 时没有显式指定消息的时间戳,那么 KafkaProducer会在发送这条消息前自动添加上。
v1 版本的消息的最小长度(RECORD_OVERHEAD_V1 )要比V0 版本的大 8个字节,即22B 如果像 v0 版本介绍的 样发送一条 key =”key”、 value =~alue ”的 消息,那么此条版本中会占 42B 具体测试步骤参考 版的相关介绍。
===================================================================================
kafka-dump-log.sh 这个脚本可以dump出一个logSegment的有用信息