考虑如下一个问题:
某个topic下的某个partition, 假设他有3个副本(1个leader,2个follower);
在某个时刻,leader里有100条数据, 第1个follower里有80条数据, 第2个follower里有90条数据;
场景1:某个时刻leader挂掉了,从follower重新选举一个leader出来,如果恰好选出来有80条记录的那个follower当了新的leader ,那么问题来了, 此时新leader只有80条数据, 而follower却拥有90条数据;
场景2:某个时刻leader挂掉了,从follower重新选举一个leader出来,如果恰好选出来有90条记录的那个follower当了新的ledaer,那么问题来了, 当之前的那个旧的leader重新活过来了,身份却从leader变成了follower, 导致leader有90条数据,而follower却拥有100条数据;
这个就是kafka数据一致性问题;
两个概念:
LEO(Log End Offset):指每个副本的最大offset;
HW(High Water):高水位,ISR队列里最小的LEO;
针对上面的例子, 三个partition的LEO分别是100、80、90,而三个partition的HW都是80(ISR队列中的最小的LEO);
处理方式是新官上任三把火,当leader发生故障,重新选举新的leader后,新的ledaer要求其余follower将高于HW的数据接去掉,然后从新的leader重新同步数据;
注:这个只能保证副本之间数据的一致性,并不能保证数据不丢失或者不重复,数据丢失与否或者重复与否,是ack的值(0、1、或-1)来管的;