kafka(七:位移主题__consumer_offsets)

新版本 Consumer 的位移管理机制就是将 Consumer 的位移数据作为一条条普通的 Kafka 消息,提交到 __consumer_offsets 中。__consumer_offsets 的主要作用是保存 Kafka 消费者的位移信息这个提交过程不仅要实现高持久性,还要支持高频的写操作

位移主题的 Key 中保存 3 部分内容:<Group ID,topic,分区号 >,value就是对应的 offset。

位移主题是怎么被创建的:

当 Kafka 集群中的第一个 Consumer 程序启动时,Kafka 会自动创建位移主题。位移主题就是普通的 Kafka 主题,它也有对应的分区数。但如果是 Kafka 自动创建的,分区数的设定要看 Broker 端参数 offsets.topic.num.partitions 的取值。它的默认值是 50,因此 Kafka 会自动创建一个 50 分区的位移主题。副本数或备份因子是 Broker 端参数 offsets.topic.replication.factor 控制的。默认值是 3。如果 Kafka 日志路径下冒出很多 __consumer_offsets-xxx 这样的目录,这是 Kafka 自动创建的位移主题。

也可以选择手动创建位移主题,在 Kafka 集群尚未启动 Consumer 之前,使用 Kafka API 创建它。手动创建的好处在于,可以创建满足你实际场景需要的位移主题。比如50 个分区太多了那么可以自己创建它,不用理会 offsets.topic.num.partitions 的值。

 Kafka Consumer 提交位移时会写入该主题, Kafka Consumer 提交位移的方式有两种:自动提交位移和手动提交位移。

Consumer 端有个参数叫 enable.auto.commit,如果值是 true,则 Consumer 在后台定期提交位移,提交间隔由参数 auto.commit.interval.ms 来控制。自动提交位移的优点就是省事,不用操心位移提交的事情,就能保证消息消费不会丢失。但这一点同时也是缺点,丧失了很大的灵活性和可控性,完全没法把控 Consumer 端的位移管理。

 

很多与 Kafka 集成的大数据框架都是禁用自动提交位移的,如 Spark、Flink 等。于是有了另一种位移提交方式:手动提交位移,即设置 enable.auto.commit = false。Kafka Consumer API 提供了位移提交的方法, consumer.commitSync ,当调用这些方法时,Kafka 会向位移主题写入相应的消息。

自动提交位移只要 Consumer 一直启动着,它就会一直向位移主题写入消息。假设 Consumer 当前消费到了某个主题的最新一条消息,位移是 100,之后该主题没有任何新消息产生,所以位移永远保持在 100。由于是自动提交位移,位移主题中会不停地写入位移 =100 的消息。这是一个注意点,否则这种消息会越来越多,最终撑爆整个磁盘。

Kafka 是怎么删除位移主题中的过期消息:

 Kafka 使用Compact 策略来删除位移主题中的过期消息。对于同一个 Key 的两条消息 M1 和 M2,如果 M1 的发送时间早于 M2,那么 M1 就是过期消息。Compact 的过程就是扫描日志的所有消息,剔除那些过期的消息,然后把剩下的消息整理在一起。图中位移为 0、2 和 3 的消息的 Key 都是 K1。Compact 之后,分区只需要保存位移为 3 的消息,因为它是最新发送的。

Kafka 提供后台线程定期地巡检待 Compact 的主题,看看是否存在满足条件的可删除数据。这个后台线程叫 Log Cleaner。如果位移主题无限膨胀占用过多磁盘空间的问题,可以去检查一下 Log Cleaner 线程的状态,通常都是这个线程挂掉了导致的。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值