文件存储与清理
Kafka内部消息是通过Log文件存储的。每个Partition就是一个物理目录,用于存放Log文件,假设一个Topic有两个Partition,那目录名就是topic_0和topic_1。Log文件是用Log文件中第一个消息的offset命名的,比如0000000.kafka。
所有的Log文件只允许追加写入,不允许从中间插入或者对已经写入的内容作任何修改,至于原因后面会提到。
Kafka不是数据库,不可能一直存储所有的Log文件,可以通过配置清理策略进行文件清理,支持文件占用空间和生成时间进行配置。配置了清理策略后就会按照策略删除Log文件,而不是一条条删除消息。
每条消息格式
Kafka文件中每条记录的格式是8 byte offset + 4 byte 消息长度+ 消息内容。
每条消息都由多个部分组成,最开始4byte是用CRC32对消息进行校验,以防信息传输过程中,消息格式中包含时间戳信息,如果配置了按照时间删除策略,就是利用了这里的时间戳。
如果消息真实的内容只有1 byte,那么每条消息长度至少是27byte,所以大量极短的消息是不合算的。