技术分享
redis 脑裂与异步复制导致的数据丢失问题
2021-06-02
在学习redis的时候,遇到了这么一个问题,在开启redis持久化的情况下,脑裂与异步复制是否真的会造成数据丢失?
声明!!!以下内容是本人自己的想法,不具备正确性!
学习笔记中关于这两个问题的,中华石衫的笔记如下:
首先脑裂与异步复制导致数据丢失的业务场景是:
1、脑裂问题出现的情况:
当master脱离正常网络,与slave断开连接,但master并没有宕机,此时sentinel 认为master宕机了,然后开始选举新的master,这个时候,集群中就会有两个master,就是所谓的脑裂。
此时虽然某个slave转换成了master,但可能client还没有来得及切换到新的master,还在继续向旧的master写数据,就会丢失数据了。
因为旧master再次连接集群的时候,会被作为一个slave挂到新的master上去,自己的数据会被情况,重新从新的master复制数据。
2、异步复制问题:
由于master向slave的复制是异步的,所以有可能部分数据还没复制到slave,master就宕机了,导致这部分数据丢失。
我自己的思考。
此时思考一个问题:
假设本 redis主从集群,master开启了持久化AOF与RDB,那么数据是否会真的丢失?
1、脑裂造成的数据丢失问题,是由于一个主从中有两个master,新旧master,当旧的master网络恢复以后,连接集群,会被当作一个slave挂到新的master上去,自己的数据会被清空,重新从新的master复制数据,那么这段时间client写入旧master的数据就会丢失。
也就是说此时旧的master的持久化没用,会被清理掉,重新从新的master去进行一次full resynchronization 。
2、异步复制问题:
当部分数据没有复制到slave的时候,master宕机,哨兵机制会用30秒去确定是否选举新的master,而此时会遇到两种情况:
master宕机,sentinel集群选举了新的master,此时会造成数据丢失,本质还是master宕机后,哨兵机制选举新的master造成的数据丢失问题。
master宕机后,在哨兵选举之前,重启,此时丢失的数据其实是clinet在master宕机的这段时间发送给master的写请求数据。而此时,通过min-salves-max-log 10设置,也只会让redis丢失10秒的数据。
min-slaves-to-write 1 min-slaves-max-lag 10 要求至少有1个slave,数据复制和同步的延迟不能超过10秒 如果说一旦所有的slave,数据复制和同步的延迟都超过了10秒钟,那么这个时候,master就不会再接收任何请求了
此时思考一个问题。redis主从集群且开启了哨兵机制,对master进行持久化的意义到底是什么?
只有说是在redis主从集群,全部同时挂掉的时候,此时的master持久化就会有用了,master可以通过rdb或者Aof文件进行数据恢复。 可以防止数据丢失。
- 标签:
-
网络安全