Redis5.0+——持久化——RDB&AOF

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客户端
127.0.0.1:6379> save # 同步保存,会占用redis的线程
127.0.0.1:6379> 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 混合持久化

Redis5.0+——持久化——RDB&AOF_第1张图片

开启了混合持久化,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服务再重写启动时如何获取之前备份的数据。
恢复流程:修改备份数据名称为redis持久化文件名称–>再启动redis服务和客户端

1.此处我们配置的备份数据目录为:/usr/local/redis-5.0.3/data/6379,因此进入该目录
将之前备份的数据文件:
  appendonly.aof.bak 改为 appendonly.aof
  dump.rdb.bak 改为 dump.rdb
  [root@VM-16-10-centos 6379]# cp dump.rdb.bak  dump.rdb
  [root@VM-16-10-centos 6379]# cp  appendonly.aof.bak  appendonly.aof
  ##登录客户端
  [root@VM-16-10-centos ~]# redis-server /etc/redis.conf 
[root@VM-16-10-centos ~]# redis-cli -p 6379
客户端使用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

你可能感兴趣的:(redis,数据库,redis,缓存)