kafka 在acks为-1时还会丢数据的特殊情况(运维监控没做好,isr中只有leader,并且leader宕机了)
acks有三种可以设置:0,生产者只管发送数据给kafka,不需要ack确认,容易数据丢失。1,生产者发送数据给kafka,但只要leader写完数据,follower不管有没有同步完,都返回ack。如果在follower正在同步这部分数据期间,leader宕机了,那么这部分数据就会丢失。-1,生产者发送数据给kafka,leader和isr中的所有follower都同步完数据了(注意...
acks有三种可以设置:
0,生产者只管发送数据给kafka,不需要ack确认,容易数据丢失。
1,生产者发送数据给kafka,但只要leader写完数据,follower不管有没有同步完,都返回ack。如果在follower正在同步这部分数据期间,leader宕机了,那么这部分数据就会丢失。
-1,生产者发送数据给kafka,leader和isr中的所有follower都同步完数据了(注意,leader也是在isr中的),然后才返回ack。即只要isr中的所有节点都同步完数据了,那么就会返回ack。
虽然-1时基本上不会丢失数据,但是在某种极端情况下还是会的,即所有isr的副本都宕机,而另一些因为一些问题没有宕机也不在isr中的follower恢复了,就重新加入isr了,并重新选出leader,(退化到acks=1的情况了)。。。此时原本isr中的一些最新数据没有被同步到新的isr的副本节点中,那么那些数据就丢失了。
这种情况就是运维监控没做好,当有follower宕机了,就应该及时修复。。同时所有follower都宕机了,这个属于失责。
所以,要保证在最后一个副本(leader)宕机之前,修复其他follower节点,使得
isr的副本(包含leader)大于等于2才不会造成数据丢失。
更多推荐
所有评论(0)