redis - 哨兵(高可用)中提过,Sentinel并不保证数据的零丢失,但是他也提供了能让数据最小丢失的方法。
第一个数据丢失的场景,如下图,数据丢失的时候,是由于redis的复制是异步的,也就是说他是ap模型的,ap模拟相对于cp模型来说,性能是更好的,但是数据的一致性就没办法保证了。所以客户端在master写入数据后就正确返回,master再异步把数据同步给slave。
image.png
第二个数据丢失的场景,如下图,出现了脑裂,虽然master是正常的,但是Sentinel集群却无法和他通信,此时就会认为master宕机了而做故障转移,但是通知客户端之前,客户端还是会一直写入数据到旧master,而旧master在网络处理后,重启连接到新master,会删除旧的数据,导致这部分的数据丢失。
image.png
redis提供了以下两个配置来最大程度的减少数据丢失:

min-replicas-to-write 1
min-replicas-max-lag 10

这个意思是至少有1个slave已经有10秒没有同步,则master暂停接收请求。所以不会说master一直写入数据,而slave没有同步,如果发生以上两个场景,最多丢失10秒的数据。从另外一方面说,10秒后降低了可用性,提高了数据的一致性,从ap模型暂时的变成了cp模型。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆