聊聊Kafka的ACK、ISR、HW、exeact_once

	ACK的生成这向Kafka集群生成数据时Kafka集群给生产者响应策略,acks有三种取值:0、1、-1(all)。
	当acks=0的时候,如果follow的数据和leader的数据不一致的时候leader挂掉,这个时候重新选择leader,follow还没来得及同步leader的数据就丢掉了;还有一种情况是当leader没挂也会丢数据,即当网络动荡的时候,数据在网络传输过程中丢掉,就算leader没挂也会丢数据。
	当acks=1的时候,如果follow的数据和leader的数据不一致的时候当leader挂掉,并且挂掉之前已经给生产者发送ack了,这个时候重新选择leader,follow还没来得及同步leader的数据就丢掉了。
	当acks=-1的时候,当isr队列里只有leader的时候,leader挂掉,就会跟				acks=1的时候那样丢数据。当然这种情况比较极端。acks=-1更多的是数据重复,当follow同步了一部分leader的信息的时候,leader挂掉,从follow里重新选取leader,由于还没有发送ack,所以生产者再发一次数据,就造成了数据重复。
	当acks=-1的时候,涉及到了follower,这里的follower不是指kafka全部的follower,而是指在ISR的follower,ISR就是副本同步队列的意思。在0.9版本以前有两种策略维持ISR,一种是基于时间的,默认是10s,一种是基于条数的,默认是10000条。但是到了0.9版本及以后,只有保留了基于时间的同步ISR策略,原因是防止一批次发送来的数据超过了10000条,ISR的follower就会频繁地从ISR中移进移出。

hw保证的是数据的一致性问题,跟丢不丢数据没有关系,包括消费的一致性和存储的一致性。ack才是跟丢不丢数据有关系的。

leo:每个副本的最后的offset
hw:所有副本中最小的leo,hw是对消费者可见的最大的offset
hw有两个作用:一个是保证消费的一致性,如果没有hw,如果leader的leo是19,f1的leo是15,当消费者消费到leader的19后,leader挂掉了,然后去f1找20的offset的时候就找不到了。还有一个作用是保证存储的一致性问题,当leader挂掉之后,f1称为新的leader之后,就会把其他的follower中大于hw的数据砍掉。

Kafka如何保证精准一次性消费问题?
聊聊Kafka的ACK、ISR、HW、exeact_once_第1张图片

一个topic有多个分区,生产者发送到哪个分区?
1)如果生产者再发送数据的时候指定了哪个分区就直接发送到那个分区;
2)如果生产者没有指定哪个分区,但是指定了key,那么就对求出该key的hash值,然后对该topic的分区数取模,得到的数字就是要发送的分区;
3)如果生产者生产数据的时候既没有指定分数也没有指定key,那么就按照轮询的方式去发送数据到各个分区,刚开始的时候是随机发送到一个分区。

你可能感兴趣的:(kafka)