From 15 消费者组到底是什么?
Consumer Offset 保存位置:
- 老版本的 Consumer Group 把位移保存在 ZooKeeper 中,减少 Broker 端的状态保存开销,做成无状态的,方便扩缩。
- 由于 ZooKeeper 这类元框架不适合频繁的写操作,而 Consumer Offset 是频繁更新的写操作,会拖慢 ZooKeeper 集群性能。最终将其保存在内部主题
__consumer_offsets。- Kafka 采用
hash(consumerGroupId) % __consumer_offsets主题的分区数来计算我们的偏移量提交到哪一个分区。因为偏移量也是保存到主题中的,所以保存的过程和生产者生产数据的过程基本相同。
From 16 揭开神秘的“位移主题”面纱
__consumer_offsets—— 记录消费端 offset,属于 Kafka 的内部主题。可以创建、修改、删除,但是消息格式是 Kafka 固定住的。三种信息:
消费主体的 Key:消费者组 ID + Topic + 分区编号构成,Value 可以简化为位移值。
用于保存 Consumer Group 信息的消息
用于删除 Group 过期位移甚至是删除 Group 的消息
__consumer_offsets的分区数目:Broker 端参数offsets.topic.num.partitions,默认 50;
__consumer_offsets的副本数目:offsets.topic.replication.factor,默认 3。也可以在创建 Consumer 之前,先创建
__consumer_offsetstopic,选择少一些或者多一些的分区数,不用理会offsets.topic.num.partitions的值。提交分为自动&手动提交。自动提交时,每隔
auto.commit.interval.ms会提交到__consumer_offsets中,进而可能导致__consumer_offsets占用磁盘较大的问题。为此,Kafka 有个 Compact 策略,删除每个 Key 的过期数据,只留最新数据,由 Log Cleaner 后台线程进行。Kafka Compact 策略Kafka 中控制使用 Compact 策略来删除位移主题(如
__consumer_offsets主题)中过期消息的参数是offsets.retention.minutes。这个参数指定的是在 Compact 日志中保留数据的最长时间,单位是分钟。从 Kafka 2.8.0 开始,offsets.retention.minutes参数已经被offsets.retention.duration.ms所替代。