kafka的ack有三种:
0:
producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据;
例如:当leader挂了,producer仍然往这个leader发送消息,就会造成数据丢失
1:
producer等待broker 的ack,partition的leader落盘成功后返回ack,如果在 follower同步成功之前leader 故障,那么将会丢失数据;
例如:当leader已经将收到的数据写入磁盘然后发送ack,但是follower还没有同步消息,那么此时leader挂了的话,这些数据将会丢失。
-1:
producer等待broker的ack,partition的 leader和 follower全部落盘成功后才返回ack。但是如果在 follower同步完成后,broker发送ack 之前,leader 发生故障,那么会造成数据重复。
例如:follower刚刚同步完成,此时leader还没有发送ack,leader挂了之后,重新选出新的leader,而producer没有收到ack,于是重发消息,此时新leader又收到了相同的消息,产生数据重复的问题。
发生故障数据同步:
1、follower发生故障:
follower发生故障后会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log 文件高于HW的部分截取掉,从HW开始向leader进行同步。等该follower的LEO大于等于该Partition的HW,即 follower追上 leader之后,就可以重新加入ISR了。v
2、leader发生故障:
leader 发生故障之后,会从ISR中选出一个新的leader,之后,为保证多个副本之间的数据一致性,其余的follower会先将各自的 log文件高于HW的部分截掉,然后从新的leader同步数据。