一、Redis持久化
由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。
Redis提供了两个不同形式的持久化方式:
- RDB(Redis DataBase)
- AOF(Append Only File)
1 持久化操作-RDB
1.1 RDB是什么?
在指定的时间间隔内将内存的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
1.2 备份过程
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
1.3 dump.rdb文件
1. RDB保存的文件,在redis.conf中配置文件名称,默认为dump.rdb。
2. rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。
redis.conf中配置文件路径
1.4 如何触发快照?
1.4.1 配置文件中默认的快照配置
1. 快照默认配置
save 3600 1:表示3600秒内(一小时)如果至少有1个key的值变化,则保存 save 300 100:表示300秒内(五分钟)如果至少有100个 key 的值变化,则保存 save 60 10000:表示60秒内如果至少有 10000个key的值变化,则保存
可以自己配置新的保存规则。
2. 例:给redis.conf添加新的快照策略,30秒内如果有5次key的变化,则触发快照。配置修改后,需要重启Redis服务。
dump.rdb默认大小是92字节,里面会有一些基本信息。
30秒内设置5个以上的值。
set k1 v1 set k2 v2 set k3 v3 set k4 v4 set k5 v5 set k6 v6 set k7 v7
dump.rdb大小已经改变。
1.4.2 flushall
执行flushall命令,也会触发rdb规则。
1.4.3 save与bgsave
手动触发Redis进行RDB持久化的命令有两种:
1. save
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止,不建议使用。
2. bgsave
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。
这两个命令是在Redis客户端中执行,并不是redis.conf中修改。
1.4.4 stop-writes-on-bgsave-error
默认值是yes。当Redis无法写入磁盘的话,直接关闭Redis的写操作。
1.4.5 rdbcompression
默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
1.4.6 rdbchecksum
默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
1.5 恢复数据
只需要将rdb文件放在Redis的启动目录,Redis启动时会自动加载dump.rdb并恢复数据。
2 持久化操作-AOF
2.1 AOF是什么?
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只允许加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
2.2 AOF持久化流程
1. 客户端的请求写命令会被append追加到AOF缓冲区内。
2. AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作同步到磁盘的AOF文件中。
3. AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量。
4. Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的。
2.3 AOF默认不开启
可以在redis.conf中配置文件名称,默认为appendonly.aof。
AOF文件的保存路径,同RDB的路径一致。
如果AOF和RDB同时启动,Redis默认读取AOF的数据。
2.4 AOF启动/修复/恢复
正常恢复
1. 启动:设置Yes:修改默认的appendonly no,改为yes。
2. 恢复:重启Redis然后重新加载。
例:设置appendonly为yes,配置修改后,需要重启Redis服务。
服务器启动后,生成appendonly.aof文件,且大小为0。
设置数据。
set k11 v11 set k12 v12 set k13 v13 set k14 v14 set k15 v15
appendonly.aof大小已经改变。
异常恢复
1. 启动:设置Yes:修改默认的appendonly no,改为yes。
2. 修复:如遇到AOF文件损坏,通过/user/local/bin/redis-check-aof --fix appendonly.aof进行恢复。
3. 恢复:重启Redis然后重新加载。
例:服务启动和数据设置同上,模拟损坏appendonly.aof文件
vi appendonly.aof
重启Redis服务,并连接。由于aof文件被破坏,导致服务器启动失败。
通过/user/local/bin/redis-check-aof --fix工具对appendonly.aof进行恢复。
./redis-check-aof --fix appendonly.aof
修复成功。再次查看aof文件,破坏的地方已经修复。再次启动服务器成功。