最近在搞redis备份,所以就记录一下。大家都知道redis持久化有两种方式RDB与
AOF。RDB就是按照一定规则,符合规则就执行快照,如果在下一次执行快照执行前服务
器挂了,那就惨了,距离上一次快照到当前服务器挂掉这一段时间的数据就没了,所以
RDB适合做一些不太重要的数据备份;AOF就是当客户端输入命令时,redis在执行命令
同时会将该命令写入备份文件中,实时性备份,不会像RDB那样丢数据,但是性能可能
比RDB稍弱,不过都在可接受范围内。RDB与AOF备份的文件夹是同一个文件夹以及
RDB与AOF备份后的文件名,在redis配置文件(redis.conf)可以查看:
dir /usr/local/redis/db/ //RDB、AOF备份文件夹
dbfilename dump.rdb //RDB备份文件名
appendfilename "appendonly.aof" //AOF备份文件名
1 RDB:当符合一定条件时,redis会自动生成快照,会在以下几种情况生成
快照:
1)根据规则自动生成快照(用户自定义的条件,在redis.conf配置)
2)用户执行SAVE或BGSAVE
3)执行flushall
4)执行主从复制的时候(replication)
解释
1) 自定义条件,可以在redis的配置文件(redis.conf)中配置,
找到如下代码:
save 900 1 //900秒内至少执行1次,就会生成快照
save 300 10 //300秒内至少执行10次,就会生成快照
save 60 10000 //60秒内至少执行10000,就会生成快照
【注】:这里可以配置多个条件,但是他们之间都是“或”的关系,
当配置好这些条件后,redis自动会判断,达到这些条件会自动生成
快照。
2)在终端执行redis-cli,然后执行SAVE或者BGSAVE,redis会
立即去生成快照,在做定时备份的时候,其实脚本中核心备份代码,
也是"redis-cli SAVE"或"redis-cli BGSAVE" 。SAVE与
BGSAVE的区别在于,SAVE:同步阻塞,在执行SAVE命令时,redis
直接就去执行备份同时不会接受执行客户端发来的请求;而BGSAVE则
会异步在后台去执行备份,客户端发来请求接受执行不影响,如何查
看BGSAVE是否完成,执行LASTSAVE返回最后一次备份完成时间戳。
3)flushall,会删除redis库中所有内容,同时不管你是否触发在
redis中自定的多个save条件,只要自定义条件不是空,redis就会
执行一次快照。
【注】:这里flushall快照指的是,会将备份文件中所有内容也全部
同步删除,所以执行这个命令一定要注意,当然,如果你开启了aof,
这个时候还是可以恢复的,这个后面讲。
4)在执行主从复制初始化的时候,无论是否设置自定义条件,都会生
成快照,这个详细的我会写在主从复制那篇文章。
2 AOF:当客户端执行一条命令时候,同时会把该命令写入AOF的备份文
件中,等重启redis时候,会执行该备份文件中所有命令同步到内存中,
对重要的数据可以用到此备份方式,当然性能会比RDB稍弱,不过都在可
接受范围内,默认redis是不会开启AOF备份的,想要开启就要去
redis.conf中找到如下:
appendonly no -->appendonly yes //改为yes,开启AOF
appendfilename "appendonly.aof" //aof备份文件
关于AOF同步硬盘数据的问题:客户端每次执行操作时候,AOF都会将命令记录在
AOF备份文件中,事实上由于操作系统缓存机制,数据并没有真正写入磁盘,而是
进入了系统的硬盘缓存,默认情况下系统30秒执行一次同步,如果30秒内系统异常
退出,则会导致内容丢失,一般启用AOF持久化都很难容忍这样的损失,这就要求
redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中,在redis配置文件
中通过参数:
appendfsync everysec //每秒执行一次同步操作(推荐,默认)
appendfsync always //每次执行写入都会同步,最慢
appendfsync no //系统自己处理,30秒一次
【注】:如果同时开启了RDB与AOF,当恢复数据的时候会优先以AOF,这里有人可
能会问,如果之前一直没有开启AOF而是用了一段时间RDB之后才想起来去开启AOF,
那之前的数据AOF是不是会丢失?这里也有解决办法,开启AOF时候,先将以前数据
同步到AOF备份文件中,然后后面数据会自动追加到该文件后面。
命令开启:redis-cli config set appendonly yes,**不会丢**
修改配置文件开启:appendonly yes, 会丢
方法一:先备份RDB的备份文件,然后执行命令开启,
redis-cli config set appendonly yes,然后会将以前数据操作同步AOF
备份文件,这时去修改redis配置文件appendonly yes,然后重启redis
方法二:先备份RDB的备份文件,然后执行bgrewriteaof手动同步以前数据到 AOF备份文件,然后停止redis,这时去修改redis配置文件appendonly yes,
然后重启redis
【题外话】flushall在AOF备份模式下恢复,上面我提到如果没有开启AOF,单单使
用了RDB情况下使用了flushall,那备份快照中内容也会被删除,但是如果开启了
AOF,由于AOF只是记录命令,就算你执行了flushall命令,也不会删除AOF备份文
件中保存的命令,只会在AOF备份文件中新加一条命令,flushall,这个时候你去
AOF备份文件中将此命令删除,然后重启redis,redis会重新读取AOF备份内容加载
到内存,数据又回来了!!!虚惊一场~~~,不过还是不要在服务器上使用flushall
这个命令。