Redis 持久化
1、RDB持久化
1-1、初始化环境
配置
redis.conf
# 900秒有1个key改动,执行快照生成
save 900 1
save 300 10
save 60 10000
1-2、什么叫Redis快照
快照,顾名思义又可以理解为拍照一样,把整个内存数据映射到硬盘中,保存一份到硬盘,因此恢复数据起来比较快,把数据映射回去即可,不像AOF,一条条执行操作命令
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化方式

手动持久化方式
# 方式一
127.0.0.1:6379> save
# 方式二
127.0.0.1:6379> bgsave
save和bgsave的区别
| 命令 | save | bgsave |
|---|---|---|
| IO类型 | 同步 | 异步 |
| 是否阻塞 | 是 | 否 |
| 复杂度 | 耗时 | 耗时 |
| 优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
| 缺点 | 阻塞客户端命令 | 需要fork,消耗内存 |
查看内存
127.0.0.1:6379> info memory
1-3、优劣点
优点
- 快照保存数据速度极快,还原数据速度极快
- 适用于灾难备份
- 不会消耗额外内存
- 启动效率高
- fork子进程性能最大化
缺点
- 耗时,耗性能
- 会存在数据丢失
- 数据量比较大的情况下,会形成阻塞
1-4、定时RDB日志备份
vim
redis-rdb-copy-per-hour.sh
[root@redis-master bin]# pwd
/usr/local/redis/bin
[root@redis-master bin]# vim redis-rdb-copy-per-hour.sh
#!bin/bash
cur_date=$(date "+%Y%m%d%H%M%S")
rm -rf /usr/local/redis/snapshotting/$cur_date
mkdir -p /usr/local/redis/snapshotting/$cur_date
cp /usr/local/redis/data/dump.rdb /usr/local/redis/snapshotting/$cur_date
del_date=$(date -d -48hour "+%Y%m%d%H%M")
rm -rf /usr/local/redis/snapshotting/$del_date
chmod +x redis-rdb-copy-per-hour.sh
crontab -e
# 添加
*/1 * * * * sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 10; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 20; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 30; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 40; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 50; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
2、AOF持久化
2-1、含义
它也是Redis持久化的重要手段之一,AOF(Append Only File)只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事

2-2、RDB和AOF的区别
| 命令 | RDB | AOF |
|---|---|---|
| 启动优先级 | 低 | 高 |
| 体积 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
| 数据安全性 | 丢失数据 | 根据策略决定 |
| 轻重 | 重 | 轻 |
2-3、开启AOF
配置
redis.conf
# 配置aof
appendonly yes
appendfilename "appendonly.aof"
2-4、同步策略
3 种AOF策略
- 每秒同步(默认,每秒调用一次fsync,这种模式性能并不是很糟糕)
- 每修改同步(会极大削弱Redis的性能,因为这种模式下每次write后都会调用fsync)
- 不主动同步(由操作系统自动调度刷磁盘,性能是最好的)
# 配置redis
# 每秒钟同步一次
appendfsync everysec
# 每次有数据修改发生时都会写入AOF文件
appendfsync always
# 从不同步, 高效但是数据不会主动被持久化
appendfsync no
2-5、AOF工作原理

AOF的频率高的话肯定会对Redis带来性能影响,因为都是刷盘操作。跟mysql一样了。Redis每次都是先将命令放到缓冲区,然后根据具体策略进行刷盘操作。如果配置always,那么就是典型阻塞,如果是everysec每秒的话,那么会开一个同步线程去每秒进行刷盘操作,对主线程影响稍小
2-6、写入与恢复
AOF文件是一个只进行append操作的日志文件,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。假如一次操作只是写入了一半数据就会出现了系统奔溃问题,不用担心,在Redis下一次启动之前,我们通过redis-check-aof工具来帮助我们修复问题
AOF文件有序地保存了对数据库进行执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松
导出AOF文件也非常简单:举个例子,如果你不小心执行了FLUSHALL命令,但只要AOF文件未被重写,那么只是停止服务器,移除AOF文件末尾的FLUSHALL命令,并启动Redis,就可以将数据恢复到FLUSHALL执行之前状态
2-7、重写
Redis 可以在AOF文件体积变得过大时,自动地在后台对AOF进行rewrite。Redis以append模式不断的将修改数据写入到老磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行
因为Redis在创建新AOF文件的过程中,会继续将命令追加到现有的AOF文件里面,即使重写过程中发生停机,现有的AOF文件也不会丢失
而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新的AOF文化,并开始对新的AOF进行追加操作
# 配置redis.conf
no-appendfsync-on-rewrite no
# 当前aof文件大于多少字节后才触发重写
auto-aof-rewrite-min-size 64mb
# 当前写入日志文件的大小超过上一次的百分之多少,才触发重写
auto-aof-rewrite-percentage 100
# 如果aof文件结尾损坏,redis启动时是否依然载入AOF文件
aof-load-truncated yes
# 执行
127.0.0.1:6379> bgwriteaof
2-8、优劣点
优点
- 数据不易丢失
- 自动重新机制
- 易懂恢复
缺点
-
AOF文件恢复数据慢
-
AOF持久化效率低
3、如何选择RDB和AOF
3-1、同时开启
Redis 先加载AOF文件来恢复原始数据,因为AOF数据比RDB更完整,但是AOF存在潜在的bug,如果把错误的操作记录写入aof,会导出数据恢复失败,所以可以把RDB作为后备数据
为了考虑性能,可以只在slave上开启RDB,并且15min备份一次,如果为了避免AOF rewrite的IO以及阻塞,可以在Redis集群中不开启AOF,靠集群的备份机制来保证可用性,在启动时选取较新的RDB文件,如果集群全部奔溃,就会丢失15min前的数据
3-2、混合模式
Redis 4.x 开始支持模式,为了解决Redis在启动时通常加载AOF文件,但加载速度慢。因为RDB数据不完成,所以加载AOF
开启方式:aof-user-rdb-preamble true ,开启后,AOF在重写时会直接读取RDB中的内容,通过 bgwriteaof 完成
执行过程
- 子进程会把内存中数据以RDB的方式写入aof中
- 把重写缓冲区的增量命令以AOF方式写入到文件中
- 将含有RDB个数和AOF个数的AOF数据覆盖旧的AOF文件
- 最后新的AOF文件中,一部分数据来自RDB文件,一部分来自Redis运行过程时的增量数据
3-3、数据恢复
当开启混合模式时,启动redis依然优先加载aof文件,莫非是两种情况:
- aof 文件开头是rdb的格式,先加载rdb内容更加载剩余的aof
- aof文件开头不是rdb的格式,直接以aof格式加载整个文件
优点:既能快速备份又能避免大量数据丢失
缺点:RDB是压缩格式,AOF在读取它时可读性较差
3-4、动态切换
简介
从Redis 2.x 以上,在不重启的情况下。从RDB切换到AOF
- 为最新的dump.rdb 文件创建一个备份
- 将备份放在安全的地方
[root@redis-master data]# pwd
/usr/local/redis/data
[root@redis-master data]# cp dump.rdb dump.rdb.bak
- 执行命令
# 开启aof
redis-cli config set appendonly yes
# 关闭rdb
redis-cli config set save ""

浙公网安备 33010602011771号