Redis的持久化
Redis 为什么要持久化?
Redis 中的数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。与 Memcached 一样,为了保证效率,数据都是缓存在内存中。
对,数据都是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据都会消失殆尽,再也找不回来了。所以,为了让数据能够长期保存,就要将 Redis 放在缓存中的数据做持久化存储。
Redis提供了2种不同形式的持久化方式
RDB(Redis Database)
AOF (Append Of File)
RDB
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复是将快照文件直接读到内存里。
备份如何执行的
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换
到上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据恢复操作,且对于
数据恢复的完整性不是很敏感,那么RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失(正常退出如shutdown会完整保存)。
关于fork
在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会被exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”(需要写的时候再复制),
一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
RDB的保存文件
在redis.conf中配置文件名称,默认为dump.rdb
dbfilename dump.rdb
rdb文件的保存路径,也可以修改,默认为./,也就启动redis的当前路径下
rdb的保存策略
save seconds changes 多少秒之内完成对数据库的多少次更改之后就会持久化
save 900 1 在900秒完成一次对数据库的更改就会进行持久化
命令save
只管保存,其他不管,对Redis的所有操作全都阻塞
stop-writes-on-bgsave-error yes
当Redis无法写入磁盘的话,直接关掉Redis的写操作。
rdbcompression yes
进行rdb保存时,将文件压缩
rdbchecksum yes
在存储快照后,还可以将Redis用CRC64算法来进行数据的校验,以检查数据是否准确,但这样会增加大约10%的性能消耗,如果希望获取到最大性能,可以关闭此功能
rdb的备份
先通过config get dir 查询rbd文件的目录
将*.rbd的文件拷贝到别的地方
rdb的恢复
关闭Redis
先把备份的文件拷贝到工作目录下
启动Redis,备份文件会直接加载
rdb的优点:
节省磁盘空间
恢复速度快
rdb的缺点:
虽然使用了写时拷贝技术,但数据太大时还是会消耗性能
备份周期在一定间隔时间做一次备份,如果Redis意外down掉,就会丢失最后一次快照后的所有修改,就是我之前所说的RDB的缺点是最后一次持久化后的数据可能丢失
rdb与aof
rdb保存的数据,aof保存的指令
AOF
以日志的形式来记录每个写操作,通过执行日志文件的指令完成数据恢复工作
AOF默认不开启,需要手动在配置文件中配置
appendonly no
可以在redis.conf中配置文件名称,默认为appendonly.aof
appendfilename "appendonly.aof"
AOF文件的保存路径,同rdb文件一致
dir ./ #这个配置对rdb有用,对aof也有用#
aof和rdb同时开启,Redis会听谁的?
以AOF为准
AOF文件故障备份
AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载
AOF和RDB同时开启,系统默认取AOF的数据
AOF文件故障恢复
AOF文件的保存路径与RDB文件的保存路径一致
如遇到AOF文件损坏,可通过
redis-check-aof --fix appendonly.aof 进行恢复(基本没啥屌用)
AOF同步频率设置
始终同步,每次Redis的写入都会立刻记入日志
每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失
不主动进行同步,把同步时机交给OS(操作系统)
appendfsync always 始终同步
appendfsync everysec 每秒同步
appendfsync no 不主动进行同步
Rewrite
AOF采用文件追加方式,由于指令的增多,文件会越来越大,为避免出现此种情况,新增重写机制,当AOF文件大小超过所设定的阈值时
Redis就会启动AOF文件的内容压缩,只保留可恢复数据的最小指令集,可以使用命令bgrewriteaof
AOF优点
备份机制更稳定,丢失数据概率低
可读的日志文本,通过操作AOF,可以处理误操作,比如flushdb就是写指令
AOF的缺点
比RDB占用更多的磁盘空间
恢复备份速度更慢
每次读写都同步的话,有一定性能压力
存在个别BUG,可能会造成不恢复