Redis持久化详解与备份恢复

Redis 是支持 RDBAOF 两种持久化的机制,持久化的功能可以有效的避免当进程崩溃。退出时造成的数据损失。当进程退出后,我们下次启动的时候,利用之前持久化的文件马上就可以恢复原有的数据。我们先大致理解一下官方的介绍:
RDB 持久化的方式,是在指定条件下,能对数据库进行快照存储。比如手动触发或者自动按照时间间隔。
AOF 持久化是以记录命令为条件来完成的。
AOF 打开的时候,对Redis的所有写操作全部按照 Redis 的协议格式进行保存,把新的命令追加到文件末尾来完成 AOF 文件的保存。前边也介绍过可以通过 BGREWRITAOF 这个命令完成 AOF 文件的重写,不至于 AOF 文件过大,成为磁盘或者恢复时的负担。
Redis 还可以同时打开 RDBAOF 持久化,重启的时候优先使用 AOF 文件,因为 AOF 文件更完整。

toc

RDB详解

RDBRedis 一种持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中

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 模拟数据,需要安装 pythonpython-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

posted on 2019-11-18 18:31  云襄  阅读(574)  评论(0编辑  收藏  举报

导航