求大神讲解,在设置acks=-1后。是否应当leader的HW,LEO值将会永远一致才对。 另外,有没有可以查看当前HW,LEO值的方法,或者其他判断follower追赶leader进度的方法也行。网上查了半天没查到,有说看replication-offset-checkpoint文件值是否一样,但是实际看着也不太对。
最近在看这一块的知识,刚好也遇到这个疑问,我的理解是,HW是水位线,类似木桶效应,它的值一直是所有副本中最低的那个值,LEO 是当前数据最大offset值。因为副本同步过程是需要时间的,所以两者不可能是一直相等,只有=-1,且发送成功时,是相等。对于=-1来说,只是发送消息是否所有副本进行了保存,成功就是都是存好了,失败就是没存好。
kafka 0.11之前副本机制主要依赖hw的概念,而0.11后采用了leader epoch来标识进度,内容太长了,给你个连接吧:
https://www.cnblogs.com/huxi2b/p/7453543.html
你提供的链接已拜读,已经对LEO和HW的更新机制有了基本了解。但还是有点疑问,就是ack=-1的解释是producer只有收到分区内所有副本的成功写入的通知才认为成功,这里的所有副本“成功写入”指的是follow的LEO更新成功的时机么,还是leader的remote LEO更新成功,还是什么?
原提问的第二个问题大神有指导么,有没有可以查看当前HW,LEO值的方法呢。我之前搜到一个帖子说查看replication-offset-checkpoint中的值就是HW,但是我在实际环境中看,follower的这个文件值有大于leader的情况,搞得我也不清楚这个是否正确。
首先LEO是消费者看不到的,ack=-1只是leader确认接收到消息会返回响应,但是replica还是会同步数据,所以leader的LEO和HW不一样(除非你没有replica)。HW是可以通过jmx监控指标看到的,指标名:kafka.log:type=Log,name=LogEndOffset,topic=xxxxx,partition=10,这个指标名看起来是LEO但是实际上是HW。jmx还有一个指标kafka.server:type=FetcherLagMetrics,name=ConsumerLag,clientId=ReplicaFetcherThread-0-19,topic=xxxxxx,partition=29 这个可以看到每个分区的一个追赶lag
我看解释是说ack=-1表示所有ISR都接收成功才能认为producer成功。你说ack=-1只是leader确认接收到消息会返回响应,那么和ack=1的区别是什么?
不好意思,看错了,ack=-1是主副都写入才会确认成功接收消息
需要明确一点,ack是为了保证数据完整性,即上传部分不出现问题,hw是为了保证数据一致性,即consumer消费数据不出现问题,两者功能看着相似,但作用不冲突。我也想了好久才缓过来。
你的答案