异步复制和脑裂情况下的redis数据丢失

概述

异步复制和脑裂情况下是导致redis数据丢失的两种情况,主要发生在主备切换过程中。

异步复制情况下的数据丢失

因为master到slave的复制是异步的,所以会发生数据没全部复制到slave,master就宕机了,这导致一部分数据丢失了。

脑裂情况下的数据丢失

image.png

脑裂就是master发生网络故障,导致不能连接slave节点,但是master节点还在运行中。这时哨兵集群认为master宕机了,然后开启选举将其他slave换成了master。这个时候集群里有两个master。
此时虽然有一个slave被切换成master,但是客户端还没来得及替换到新的master,还继续写向旧master的数据可能也丢失了。
因此旧master再次恢复的时候,会被作为一个slave挂到新的master上去,自己的数据会清空,重新从新的master复制数据

解决异步复制和脑裂导致的数据丢失

redis的配置文件中,存在两个参数

min-slaves-to-write 1
min-slaves-max-lag 10
  • 第一个参数表示连接到master的最少slave数量;
  • 第二个参数表示slave连接到master的最大延迟时间;
  • 如果连接到master的slave数量小于第一个参数,且ping的延迟时间小于等于第二个参数,那么master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。

上面两个配置可以减少异步复制和脑裂导致的数据丢失

  1. 减少异步复制的数据丢失
    min-slaves-max-lag: 一旦slave复制数据和确认延时太长,就认为可能master宕机后损失的数据太多了,那么就拒绝写请求。
  2. 减少脑裂的数据丢失
    如果一个master出现了脑裂,跟其他slave丢了连接,那么上面两个配置可以确保说,如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己确认消息,那么就直接拒绝客户端的写请求。
    这样脑裂后的旧master就不会接受client的新数据,也就避免了数据丢失

你可能感兴趣的:(异步复制和脑裂情况下的redis数据丢失)