Kafka的消息是如何被写入到磁盘的?

Kafka 消息的分区(Partition)是物理上对消息的分组,每个分区对应一个日志文件。分区的主要作用是:

  1. 扩展性:通过增加分区数可以线性扩展Kafka的性能。
  2. 负载均衡:分区可以散布在不同的Broker上,实现消息的负载均衡。
  3. 并行:分区可以由不同的消费者并行消费,提高吞吐量。
  4. 容错:每个分区都有副本,当某副本失效时,其他副本可以继续提供服务。

例如,一个主题有3个分区,其中分区0和1在Broker1上,分区2在Broker2上。生产者发布的消息会按照分区规则映射到不同的分区,从而存储到不同的Broker上。

例如,消费者Group有3个消费者,每个消费者消费一个分区的消息,那么可以实现3个分区消息的并行消费。

Kafka 的消息是以追加的方式写入磁盘的。具体过程是:

  1. Kafka以分区为单位组织消息,每个分区对应一个日志文件。
  2. 生产者发送的消息会被不断追加到对应分区的日志文件末尾。
  3. 日志文件采用预分配的方式扩展,每个日志文件默认1GB,扩展时大小翻倍。
  4. 日志文件内部采用稳定的存储格式,支持消息的快速追加和读取。
  5. 日志文件会周期性地进行压缩和删除过期数据,以控制磁盘使用量。
  6. Kafka会为每个日志文件创建索引文件,加速消息的查找和读取。
  7. 日志文件通过Page Cache加载到内存,最近读取的数据会被缓存,避免频繁读盘。

理解 Kafka 消息的分区与日志存储机制,有助于我们更好地设计消息的产生和消费方案。