Redis 提供了两种不同的持久化方法来将数据存储在硬盘中。
1、快照(snapshotting)它可以将存在于某一时刻的所有数据都写入硬盘里面。(适用于容灾备份)
2、只追加文件(append-only file,AOF)它会在执行写命令时,将被执行的写命令复制到硬盘里
这两种方法即可同时使用,也可以单独使用
缺点
(互补关系就不写优点了)
快照:如果系统发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。
AOF:Redis不断的将被执行的写命令记录到AOF文件里面,随着Redis不断运行,AOF文件体积也会不断增长。还有一个问题就是,Redis重启之后需要重新执行AOF文件记录的所有写命令还原数据,AOF文件过大,导致还原执行的时间可能过长(解决方法重写/压缩AOF文件,见AOF主要配置)Redis加载RDB恢复数据远远快于AOF的方式
配置文件
/etc/redis/redis.conf(Ubuntu18.04,redis4.0.9)
快照主要配置:
客户端通过发送BGSAVE命令来创建一个快照(fork一个子进程负责写入快照,父进程继续处理命令请求)
或者通过发送SAVE命令创建快照,SAVE命令在快照创建完毕前不再响应其他任何命令(不常用)
1、save 60 1000
当“60秒内有1000次写入”这个条件被满足是,Redis会自动触发BGSAVE命令,如果设置了多个save配置选项,那么任意一个save配置选项满足,就会触发一次BGSAVE命令
2、dbfilename dump.rdb
快照文件命名
AOF主要配置:
通过BGREWRITEAOF命令,移除AOF文件中的冗余命令来重写文件,工作原理和BGSAVE相似(创建子进程)
1、appendonly no
是否使用AOF持久化 yes打开
2、appendfsync everysec
AOF文件同步,选项 always、everysec、no
always 每个Redis写命令都同步写入硬盘,严重减低Redis速度(可能影响固态硬盘寿命)
everysec 每秒执行一次同步,显示地将多个写命令同步到硬盘
no 让操作系统决定何时进行同步(崩溃后丢失数据不定量,不推荐)
3、auto-aof-rewrite-percentage 100
4、auto-aof-rewrite-min-size 64mb
当AOF文件体积大于64MB并且体积比上次重写后的体积大了至少100%的时候,Redis将执行BGREWRITEAOF命令。若重写过于频繁可将auto-aof-rewrite-percentage选项配置设为100以上,可以让AOF文件体积更大些才执行重写操作,不过重启还原数据集所需时间将变长。
共享配置:
dir /var/lib/redis
快照文件和AOF文件保存位置
RDB切换为AOF的正确步骤:
由于启用AOF之后,重启Redis,默认会从aof恢复数据,就会忽略dump.rdb中的数据,造成重启之前数据丢失,
因此Redis从RDB向AOF切换的时候要使用如下步骤
- 配置文件启用AOF,appendonly设置为yes
- 执行save,把数据全部写入dump.rdb,这是一步备份操作。万一aof失败,还能从dump.rdb中把数据恢复回来
- 执行bgrewriteaof ,把数据写入.aof,便于以aof启动的时候加载数据
- 重启Redis服务器