Redis持久化和数据恢复的坑
redis
提供了rdb
和aof
两种持久化机制,rdb
默认开启,aof
默认关闭。
当两种持久化机制都开启时,redis
重启恢复数据时加载aof
持久化的appendonly.aof
文件,而rdb
持久化的dump.rdb
文件不会被加载到内存中。
情景:开启
rdb
,关闭aof
通过redis-cli SHUTDOWN
这种方式停掉redis
,这是一种安全的退出方式,redis
会在退出的时候将内存中的数据立即生成一份完整的rdb
快照。
通过kill -9
杀死redis
进程,这种方式会导致redis
异常退出,从而导致内存中的数据没有到达save
指定的检查点,进而丢失内存中的数据。-
情景:开启
rdb
,关闭aof
,待dump.rdb
有数据后,再开启aof
redis
持久化dump.rdb
后,启用aof
持久化,再重启redis
,redis
只会加载aof
持久化的appendonly.aof
文件,如果它不存在,那会创建一个新的空的文件,从而导致内存中丢失dump.rdb
的数据。解决方式:停止
redis
,关闭aof
,重启redis
,确保dump.rdb
数据恢复在内存中,使用命令行热修改redis
配置的方式打开aof
,此时redis
就会以aof
持久化的形式将内存中的数据写入appendonly.aof
文件,然后停止redis
,修改配置文件将aof
手动打开。 情景:主从架构的
master
关闭rdb
和aof
持久化,slave
作为master
的数据热备
在采用master-slave
的水平扩展架构的时候,格外的需要注意:master
必须要开启持久化,不建议用slave
节点作为master
节点的数据热备。
我们知道主从复制的架构中,所有的写操作交由master
负责,slave
分担读的操作,slave
中的数据是从master
同步过来的。假如master
的rdb
和aof
都关闭了,数据全部在内存中,那么master
宕机重启时,发现本地没有可以恢复的数据,导致master
内存数据为空,然后master
将空的数据集同步到slave
节点,导致slave
的数据全部清空。因此master
必须要开启持久化!
即使我们采用高可用机制的哨兵模式,即master
宕机时,slave
节点通过选举转变为master
节点,在这种情况下,可能哨兵模式还没检测到master
节点宕机,master
节点就自动重启了,因此还是可能导致所有slave
节点数据清空。