深入kafka(二)分区分配

本篇文章介绍kafka的物理存储、分区分配、文件管理、文件格式、索引、清理文件、删除事件和清理主题。

一.物理存储

分区是kafka的基本存储单元,分区无法在多个broker间进行再细分,也无法在同一个broker的多个磁盘上进行再细分。

二.分区分配

1:分区分配策略:

  1. broker间平均分配分区副本 ;
  2. 确保每个分区的每个副本分布在不同的broker上;
  3. 如果为broker指定了机架信息,那么尽可能把分区的副本分配到不同的机架的broker上;

2:假设存在5个主题,复制系数为3,broker个数为4,分配后的一种结果如下所示:
深入kafka(二)分区分配
3:新增分区策略:新的分区总是被添加分区数量最小的那个目录里。

三.文件管理

1:数据保留期限:

  1. 规定数据被删除之前保留多长时间;
  2. 规定数据被删除之前可以保留的数据大小;

2:片段:

  1. 在一个文件里查找和删除消息是费事的,也容易出错,所以把分区分成若干个片段
  2. 默认情况下,每个片段包含1GB或一周的数据,以较小的那个为准

四.文件格式

1:文件(普通消息)包含如下部分:

  1. 偏移量
  2. 消息大小
  3. 校验和
  4. 消息格式版本号
  5. 压缩算法
  6. 时间戳

2:包装(压缩)消息:

  1. 生产者将同一批次的消息压缩后发送,那么broker也会将这个消息原封不动的发送给消费者,消费者解压消息后,会看到这个批次的消息。
  2. 生产端使用了压缩功能,那么发送的批次越大,网络传输和磁盘存储方面会获得更好的性能。

3:普通消息和包装消息如图所示:前半部分是普通消息,后半部分是包装消息
深入kafka(二)分区分配

五.索引

1:索引的作用:快速定位指定偏移量
2:索引的原理:索引把偏移量映射到片段文件和偏移量在文件里的位置

六.清理文件

1:清理规则:Kafka会根据设置的时间保留数据,把超过时间的旧数据删除掉
2:特殊场景:Kafka通过改变主题的保留策略,早于保留时间的旧事件会被删除,为每一个键保留最新的值,从而达到清理的效果。

七.清理文件的工作原理

日志片段包含两个部分(干净部分和污浊部分),首先我们要清楚这两个概念:
1:干净部分:这些消息之前被清理过,每个键只有一个对应的值,这个值是上一次清理时保留下来的
2:污浊部分:这些消息是在上一次清理后写入的
深入kafka(二)分区分配
3:清理线程:负责执行清理任务。这些线程会选择污浊率较高的分区进行清理
4:map:

  1. 清理线程读取分区的污浊部分,并在内存里创建一个map。
  2. map里的每一个元素包含了消息键的散列值和消息偏移量。

5:清理过程:

深入kafka(二)分区分配

八.删除事件

下面说明如何删除某个特定键的所有消息?

1:墓碑消息:值为null的消息,称为墓碑消息。
2:删除过程:
深入kafka(二)分区分配
3:为什么不直接删除,而是过一段时间才删除?原因是方便消费者做相应的处理。

九.清理主题

1:清理策略:Kafka会在包含脏记录的主题数量达到50%时进行处理。

  1. 避免太过频繁的清理;
  2. 避免存在太多脏记录;