Redis持久化-RDB
1.实现目标:
在redis持久化时,持久化dump.rdb文件放入到redis解压目录下的data目录下的6379目录下
2.前期准备
1.在redis-5.0.3解压目录下新建data数据目录 2.编辑前面配置的/etc/redis.conf配置文件
修改持久化文件位置
(1) 进入安装redis的目录,新建data文件夹以及端口对应文件夹
[root@VM-16-10-centos redis-5.0.3]# cd /usr/local/redis-5.0.3
[root@VM-16-10-centos redis-5.0.3]# mkdir data
[root@VM-16-10-centos redis-5.0.3]# cd data
[root@VM-16-10-centos redis-5.0.3]# mkdir 6379
(2) 修改拷贝的redis启动配置文件
vim /etc/redis.conf
修改以下配置
logfile "6380.log" #日志文件,默认会存放到配置的dir目录下
# 搜索dir修改dir存放路径
dir /usr/local/redis-5.0.3/data/6379
3.RDB数据持久化
RDB(Redis DataBase)快照(snapshot)
在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。
3.1 方式一:配置文件RDB持久化策略自动保存
以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:
save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可
3.2 方式二:redis-cli客户端save和bgsave命令
redis-cli -p 6379 #进入6379端口的redis客户端
save # 同步保存,会占用redis的线程
bgsave #异步保存,会开启一个子线程
文件生成位置:在顶部配置的dir位置
4.AOF数据持久化
以日志的形式来记录每个写操作
每隔一段时间fsync到磁盘, Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。
如何开启?修改redis.conf文件
appendonly yes
redis的同步频率设置
appendfsync always # 每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。
appendfsync everysec # 每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。
appendfsync no # 从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。
文件生成位置:在顶部配置的dir位置和RDB保持一致(默认:dir ./ 生成位置在/usr/local下的bin目录下)
4.1 AOF重写压缩策略
# 进行命令
set a a1
set b b1
# 重写过后
set a a1 b b1
AOF文件里可能有太多没用指令,所以AOF会定期根据内存的最新数据生成aof文件
1.redis.conf配置自动重写策略
auto-aof-rewrite-min-size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
auto-aof-rewrite-percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写(即128MB会再次触发)
2.手动重写
AOF还可以手动重写,进入redis-cli客户端执行命令bgrewriteaof重写AOF
AOF重写redis会fork出一个子进程去做(与bgsave命令类似),不会对redis正常命令处理有太多影响
redis4.0版本后的重写,是指把rdb快照以二进制的形式附在aof头部,作为已有的历史数据,替换掉原来的流水账操作
总结AOF持久化流程
(1)客户端的请求命令会被append追加到AOF缓存区
(2)AOF缓存区根据AOF持久化策略【always ,everysec ,no】将操作sync同步到磁盘的AOF文件中
(3)AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量
4.2 AOF和RDB同时开启,redis听谁的?
系统默认取AOF数据(因为数据不会存在丢失)
4.3 异常恢复
若遇到AOF文件损坏,通过
/usr/local/bin/redis-check-aof --fix appendonly.aof # 进行恢复
备份被写坏的AOF文件
恢复:重启redis,然后重写加载
4.4 RDB和AOF优缺点
命令 | RDB | AOF |
---|---|---|
启动优先级 | 低 | 高 |
体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 容易丢数据 | 根据策略决定 |
5.Redis 4.0 混合持久化
开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。
redis.conf 中配置开启混合持久化(必须先开启aof)
# 修改redis.conf中的以下配置
aof-use-rdb-preamble yes
在 Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,因此重启效率大幅得到提升。
6.通过持久化文件恢复数据
在我们持久化文件之后还需要对持久化文件进行备份重命名,此处在持久化目录做出以下配置
[root@VM-16-10-centos 6379]# mv dump.rdb dump.rdb.bak
[root@VM-16-10-centos 6379]# mv appendonly.aof appendonly.aof.bak
恢复数据
在redis被关闭时,redis会自己给我们做一次持久化,重启之后redis内的数据会被清空。当我们关闭redis服务再重写启动时如何获取之前备份的数据。
此处我们配置的备份数据目录为:/usr/local/redis-5.0.3/data/6379,因此进入该目录
将之前备份的数据文件:
appendonly.aof.bak 改为 appendonly.aof
dump.rdb.bak 改为 dump.rdb
[root@VM-16-10-centos 6379]# mv dump.rdb.bak dump.rdb
[root@VM-16-10-centos 6379]# mv appendonly.aof.bak appendonly.aof
客户端使用keys *查看数据已经恢复
7.redis定时任务备份数据
1.编辑定时任务
[root@VM-16-10-centos ~]# crontab -e
25 2 * * * sh /root/backup.sh # 每天2:25开始执行shell脚本
2.新建定时任务的脚本backup.sh,脚本代码如下
#! /bin/bash
PATH=/usr/local/bin:$PATH
redis-cli -h 127.0.0.1 -p 6379 -a 123456 bgsave
date=$(date +"%Y%m%d")
cp /root/dump.rdb /root/backup/$date.rdb
echo " 备份完成!"
3.查看任务执行日志
tail -f /var/log/cron