先说结论:kafka的消息滞后(Lag)是指已消费的偏移量(ConsumerOffset)与水位线(HW)之间的消息差,并非分区(partition)中已消费的偏移量(ConsumerOffset)与当前分区的最高日志位移(LOG-END-OFFSET简称LEO)之间的差,也就是说,并不是生产者所见的offset与已消费的offset的差。

一方面,对kafka来说,HW是其备份和恢复的关键,kafka是根据HW来判断数据是否丢失和恢复数据,而HW与LEO之间的数据有可能会丢失,因此这部分未同步的数据实际上相当于是无效数据,这部分数据实际只对生产者有意义(已经产出的意义,生产者可以通过kafka ack的设置,记录产出的数据位置,以帮助恢复HW与LEO之间的数据,恢复方法也只是重新生产这部分数据,如果无法重新生产,则数据丢失)。

另一方面,leader收到消息更新自己的LEO,follower从再从leader处同步消息,这个时间差决定了leader和follower之间存在消息差,同时也决定了HW和各个partiton的LEO之间存在的消息差,消费者在消费消息时对LEO是无察觉的,HW决定了消费者能消费到的最大offset,而LEO仅由kafka管理。因此对消费者来说,LEO也是无意义的。

在kafka有查看消费组详情的命令:kafka-consumer-groups.sh --bootstrap-server ip:port --group groupid --describe,通过这个命令可以根据groupid查看LAG、CURRENT-OFFSET、LOG-END-OFFSET等信息,LAG是消息滞后量,CURRENT-OFFSET是指已消费的偏移量(ConsumerOffset),而此处LOG-END-OFFSET却不是partition最高日志位移LEO,而是水位线HW!!!LAG即是HW与已消费的偏移量(ConsumerOffset)的差!!!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐