redis - 哨兵(高可用)中提过,Sentinel并不保证数据的零丢失,但是他也提供了能让数据最小丢失的方法。
第一个数据丢失的场景,如下图,数据丢失的时候,是由于redis的复制是异步的,也就是说他是ap模型的,ap模拟相对于cp模型来说,性能是更好的,但是数据的一致性就没办法保证了。所以客户端在master写入数据后就正确返回,master再异步把数据同步给slave。
第二个数据丢失的场景,如下图,出现了脑裂,虽然master是正常的,但是Sentinel集群却无法和他通信,此时就会认为master宕机了而做故障转移,但是通知客户端之前,客户端还是会一直写入数据到旧master,而旧master在网络处理后,重启连接到新master,会删除旧的数据,导致这部分的数据丢失。
redis提供了以下两个配置来最大程度的减少数据丢失:
min-replicas-to-write 1
min-replicas-max-lag 10
这个意思是至少有1个slave已经有10秒没有同步,则master暂停接收请求。所以不会说master一直写入数据,而slave没有同步,如果发生以上两个场景,最多丢失10秒的数据。从另外一方面说,10秒后降低了可用性,提高了数据的一致性,从ap模型暂时的变成了cp模型。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。