Ack机制
ack=0
生产者发送消息到leader后,就继续发送其他的消息,不需要等待leader的ack
缺点是数据可能丢失
ack=1
生产者发送消息到leader后,leader会将消息落地到磁盘,然后就向生产者发送ack
缺点是
数据可能丢失(leader落地了,并ack,但是follwer还未同步,数据不全)
数据可能重复(leader落地了,但是ack失败了,生产者再次发送消息 ,所以可能重复)
ack=-1 或者all
生产者发送消息到leader后,leader会将消息落地到磁盘,follwer会同步leader里的消息然后落地,全部落地完成后leader向生产者发送ack
缺点是
数据可能重复(leader落地了,但是ack失败了,生产者再次发送消息 ,所以可能重复)
总结:
任何一种ack都不能保证数据不丢失或者数据重复
ack+幂等机制可以保障不重复,不丢失
ISR机制(in-sync replica set)
比如ack=-1 时,需要所有的follwer都要同步成功后,leader才会向生产者发送ack,但是可能某一个follwer宕机了,那么生产者就会迟迟收不到leader的ack信息,耽误下一条信息的发送.
因此kafka提供了ISR机制,即ISR是一个存活的所有副本,当某一个follwer迟迟没有向leader汇报,就将此follwer踢出ISR,这样就可以避免耽误下一条消息的发送~
leader宕机怎么做?
如果Leader宕机了,controller会从ISR列表中所有的副本中选出一个leader,继续工作.follwer为了保证数据的一致性,会将高于水位线的消息截取掉,重新从新leader同步数据.
follwer宕机怎么做?
如果follwer宕机了,leader将其踢出ISR列表.回复后,会将高于水位线的消息截取掉,重新从leader同步数据.当同步成功后,重新加入ISR.
一次正好(exactly Once)
acks取值-1 +幂等机制 = exactly Once
保证数据不丢失,不重复
使用时,只需将enable.idempotence属性设置为true(在生产者的位置),kafka自动将acks属性设为-1。
幂等性如何实现?
Kafka引入了Producer ID(即PID)和Sequence Number。
1 topic和分区都一样,消息的Sequence Number就是一样的.
2 如果生产者由于未收到ack而导致重复发送数据
3由于该消息的Sequence Number和Producer ID和leader上的某条信息完全一样,所以该数据不会被接受!因此broker上也就不会有重复信息了