redis - 哨兵(高可用)中提过,Sentinel并不保证数据的零失落,然而他也提供了能让数据最小失落的办法。
第一个数据失落的场景,如下图,数据失落的时候,是因为redis的复制是异步的,也就是说他是ap模型的,ap模仿绝对于cp模型来说,性能是更好的,然而数据的一致性就没方法保障了。所以客户端在master写入数据后就正确返回,master再异步把数据同步给slave。
第二个数据失落的场景,如下图,呈现了脑裂,尽管master是失常的,然而Sentinel集群却无奈和他通信,此时就会认为master宕机了而做故障转移,然而告诉客户端之前,客户端还是会始终写入数据到旧master,而旧master在网络解决后,重启连贯到新master,会删除旧的数据,导致这部分的数据失落。
redis提供了以下两个配置来最大水平的缩小数据失落:
min-replicas-to-write 1min-replicas-max-lag 10
这个意思是至多有1个slave曾经有10秒没有同步,则master暂停接管申请。所以不会说master始终写入数据,而slave没有同步,如果产生以上两个场景,最多失落10秒的数据。从另外一方面说,10秒后升高了可用性,进步了数据的一致性,从ap模型临时的变成了cp模型。