Redis持久化详解与备份恢复
Redis 是支持 RDB 和 AOF 两种持久化的机制,持久化的功能可以有效的避免当进程崩溃。退出时造成的数据损失。当进程退出后,我们下次启动的时候,利用之前持久化的文件马上就可以恢复原有的数据。我们先大致理解一下官方的介绍:
RDB 持久化的方式,是在指定条件下,能对数据库进行快照存储。比如手动触发或者自动按照时间间隔。
AOF 持久化是以记录命令为条件来完成的。
AOF 打开的时候,对Redis的所有写操作全部按照 Redis 的协议格式进行保存,把新的命令追加到文件末尾来完成 AOF 文件的保存。前边也介绍过可以通过 BGREWRITAOF
这个命令完成 AOF 文件的重写,不至于 AOF 文件过大,成为磁盘或者恢复时的负担。
Redis 还可以同时打开 RDB 和 AOF 持久化,重启的时候优先使用 AOF 文件,因为 AOF 文件更完整。
RDB详解
RDB 是 Redis 一种持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中
在 Redis 配置文件 SNAPSHOTTING 板块内容中
## 前面常用配置提到过,忘记的可以出门左转看一下
## 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
save 900 1
save 300 10
save 60 10000
## 指定本地数据库文件名,一般采用默认的 dump.rdb
dbfilename dump.rdb
## 指定本地数据库存放目录
dir /soft/redis/data/
## 开启数据压缩(默认开启,建议开启)
rdbcompression yes
实战演习
这里用 Python 模拟数据,需要安装 python
和 python-redis
包
因为 Linux 自带 Python ,所以这里就只安装 python-redis
包
## 安装python-redis包
[root@Redis ~]# yum install python-redis -y
## 写一个Python脚本
[root@Redis ~]# vim edit_redis.py
#!/usr/bin/python
import redis
## 连接redis
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
## 使用for循环,插入1-500000条记录
for i in range(1,500000):
r.set('name%d' %i, 'sgy%d' %i)
## 用Python执行一下脚本
[root@Redis ~]# python edit_redis.py
## 异步保存到dump.rdb文件中
[root@Redis ~]# /soft/redis/bin/redis-cli -h 127.0.0.1 -p 6379 bgsave
## 查看dump.rdb行数(太多,就不看内容了)
[root@Redis ~]# wc -l /soft/redis/data/dump.rdb
400000 /soft/redis/data/dump.rdb
## 复制一份放到其他的目录(生产环境会保存到其他服务器)
[root@Redis ~]# cp /soft/redis/data/dump.rdb ~/
## 删除所有数据
[root@Redis ~]# /soft/redis/bin/redis-cli -h 127.0.0.1 -p 6379 flushall
## 关闭Redis服务
[root@Redis ~]# systemctl stop redis
## 用备份文件覆盖数据文件
[root@Redis ~]# \cp dump.rdb /soft/redis/data/dump.rdb
## 开启Redis服务
[root@Redis ~]# systemctl start redis
AOF详解
Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。但是AOF文件会记录到我们每一次调用的记录。这样会导致我们的AOF文件比较臃肿,因为前边的数据记录对于我们来讲没有意义。这个时候我们可以通过 BGREWRITEAOF 进行重写。
和RDB相同调用子进程来完成,不影响父进程处理其他请求。重新完成后,新的文件会替换旧文件。
在 Redis 配置文件 APPEND ONLY MODE 板块内容中
## 开启AOF,默认不开启
appendonly yes
## 指定本地数据库文件名
appendfilename "appendonly.aof"
## 指定更新日志条件
# appendfsync always ## 同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差当数据完整性比较好(慢,安全)
appendfsync everysec ## 出厂默认推荐,每秒异步记录一次(默认值)
# appendfsync no ## 不同步
## 配置重写触发机制(当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
实战演习
## 用Python执行一下脚本
[root@Redis ~]# python edit_redis.py
## 模拟数据丢失,删除所有数据
[root@Redis ~]# redis-cli -h 127.0.0.1 -p 6379 flushall
OK
## 关闭Redis服务
[root@Redis ~]# systemctl stop redis
## 查看AOF文件最后十行,可以看到记录删除命令(删除最后三行)
[root@Redis ~]# tail -10 /soft/redis/data/appendonly.aof
*3
$3
SET
$10
name499999
$9
sgy499999
*1 ## 删除这和下面共三行
$8
flushall
## 启动Redis服务
[root@Redis ~]# systemctl start redis