Kafka学习笔记:位移主题Offsets Topic

__consumer_offsets 在 Kafka 源码中有个更为正式的名字,叫位移主题,即 Offsets Topic

位移主题就是普通的 Kafka 主题。它的消息格式却是 Kafka 自己定义的,不能修改,不能随意向里面写数据.

如果位移主题是 Kafka 自动创建的,那么该主题的分区数是 50,副本数是 3。

Consumer 的位移管理机制 是 将 Consumer 的位移数据作为一条条普通的 Kafka 消息,提交到 __consumer_offsets 中。可以这么说,__consumer_offsets 的主要作用是保存 Kafka 消费者的位移信息。

位移主题的三种消息格式:

1.保存消费者消费位移的消息. Key 中应该保存 3 部分内容:[ Group ID , 主题名 , 分区号 ]

2.用于保存 Consumer Group 信息的消息。   注册 Consumer Group使用.

3.用于删除 Group 过期位移甚至是删除 Group 的消息。 也叫 tombstone 消息,即墓碑消息,也称 delete mark。主要特点是它的消息体是 null,即空消息体。一旦某个 Consumer Group 下的所有 Consumer 实例都停止了,而且它们的位移数据都已被删除时,Kafka 会向位移主题的对应分区写入 tombstone 消息,表明要彻底删除这个 Group 的信息。

当 Kafka 集群中的第一个 Consumer 程序启动时,Kafka 会自动创建位移主题。

Broker 端参数 offsets.topic.num.partitions 的取值了。它的默认值是 50,因此 Kafka 会自动创建一个 50 分区的位移主题。

副本数或备份因子 offsets.topic.replication.factor  默认值 3 

Kafka Consumer 提交位移的方式有两种:自动提交位移手动提交位移

Consumer 端有个参数叫 enable.auto.commit,如果值是 true,则 Consumer 在后台默默地为你定期提交位移,提交间隔由一个专属的参数 auto.commit.interval.ms 来控制。然而 只要 Consumer 一直启动着,它就会无限期地向位移主题写入消息。

手动提交位移,即设置 enable.auto.commit = false。

一旦设置了 false,作为 Consumer 应用开发的你就要承担起位移提交的责任。

Kafka Consumer API 为你提供了位移提交的方法,如 consumer.commitSync 等。

假设 Consumer 当前消费到了某个主题的最新一条消息,位移是 100,之后该主题没有任何新消息产生,故 Consumer 无消息可消费了,所以位移永远保持在 100。由于是自动提交位移,位移主题中会不停地写入位移 =100 的消息。显然 Kafka 只需要保留这类消息中的最新一条就可以了,之前的消息都是可以删除的。这就要求 Kafka 必须要有针对位移主题消息特点的消息删除策略,否则这种消息会越来越多,最终撑爆整个磁盘。

Kafka 使用 Compact 策略来删除位移主题中的过期消息,避免该主题无限期膨胀。

如何定义 Compact 策略中的过期?

对于同一个 Key 的两条消息 M1 和 M2,如果 M1 的发送时间早于 M2,那么 M1 就是过期消息。Compact 的过程就是扫描日志的所有消息,剔除那些过期的消息,然后把剩下的消息整理在一起。

图中位移为 0、2 和 3 的消息的 Key 都是 K1。Compact 之后,分区只需要保存位移为 3 的消息,因为它是最新发送的。

Kafka 提供了专门的后台线程定期地巡检待 Compact 的主题,看看是否存在满足条件的可删除数据。这个后台线程叫 Log Cleaner。很多实际生产环境中都出现过位移主题无限膨胀占用过多磁盘空间的问题,如果你的环境中也有这个问题,我建议你去检查一下 Log Cleaner 线程的状态,通常都是这个线程挂掉了导致的。


引用:

Kafka核心技术与实战 - 胡夕

发布了295 篇原创文章 · 获赞 783 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/103709021