redis集群发生数据丢失的情况
一、redis集群脑裂
- 一般redis集群如果有很多设备,一主多从,比如master与其他的slaves的网络连接出现故障了,然后没有master的那些哨兵节点,由于与master失去了联系,然后就会自行选举出一个新的master出来,所以这样会存在一个集群里面两个master,无论新过来的写请求在哪一个master上,另外一个master将不会去同步这些信息,尤其是当网络恢复的时候,哨兵集群会将原来的master节点降级为salve,如果在网络尚未恢复期期间,新的数据写入仍然是基于原来的master的,那么网络恢复后,原来的master降级为slave后它的新增的那些数据也将会丢失,不能同步到其他的节点上去。
二、master宕机
- 由于redis主从之间是采用异步的方式来进行数据同步的,所以可能某些数据还没有同步到slave上,master就宕机了,然后slave自动提升为主节点,这样就会导致最后这一部分没来得及同步的数据丢失了。
三、解决方案
- 不能完全阻止redis数据的丢失,但是可以适当的减少可能丢失的数据,可以调整min-slaves-to-write参数为1和min-slaves-max-lag参数位10,这表示,要保证至少有一个slave连接上了,且这个slave的数据同步的延迟在10秒之内,否则这个master将会拒绝提供写入服务
- 这样的话,对于脑裂来说,一旦检测到master与slaves失去联系了,只会丢失从最近一次发送数据到slaves的时候到检测到与slaves失去联系的一段时间的数据,之后就会拒绝写入请求,但是同时也会使该master变得不可用。
- 而对于master宕机导致主备切换,也最多只会丢失10秒的数据量。