笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程
RDB是什么
备份是如何执行的
作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
在 Linux 程序中,fork() 会产生一个和父进程完全相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,Linux 中引入了 “写时复制技术”
一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程
RDB持久化流程
dump 文件名字
在 redis.conf 中配置文件名称,默认为 dump.rdb。
dump 保存位置
rdb 文件的保存路径可以修改。默认为 Redis 启动时命令行所在的目录下。
stop-writes-on-bgsave-error
当 redis 无法写入磁盘,直接关闭 redis 的写操作。推荐 yes。
rdbcompression 压缩文件
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis 会采用 LZF 算法 进行压缩。
如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能。推荐 yes。
rdbchecksum 检查完整性
在存储快照后,还可以让 redis 使用 CRC64 算法 来进行数据校验。
但是这样做会增加大约 10%10\%10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。推荐 yes。
RDB 持久化主要是通过save
和bgsave
两个命令对Redis数据库中当前的数据做snapshot(快照)
并生成 rdb 文件来实现的。在 Redis 启动的时候会检测 rdb 文件,然后载入 rdb 文件中未过期的数据到服务器中。
save
时只管保存,其它不管,全部阻塞。手动保存。bgsave
是非阻塞的,通过 fork 了一个子进程来完成的。save 和 bgsave 的区别
rdbSave
函数 ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。rdbSave
函数,并在保存完成之后向主进程发送信号,通知保存已完成。bgsave
执行期间仍然可以继续处理客户端的请求。RDB 可以通过向服务器提供配置信息来自动间隔性保存。如默认情况下服务器满足以下 333 个条件中任意一个条件就会触发 bgsave 命令:
格式:
save 秒钟 写操作次数
save 900 1 // 服务器在900s(15min)之内,对数据库进行了至少1次修改
save 300 10 // 服务器在300s(5min)之内,对数据库进行了至少10次修改
save 60 10000 // 服务器在60s(1min)之内,对数据库进行了至少10000次修改
RDB 是整个内存的压缩过的 Snapshot,RDB 的数据结构,可以配置复合的快照触发条件。
默认是 111 分钟内改了 100001000010000 次,或 555 分钟内改了 101010 次,或 151515 分钟内改了 111 次。
这种持久化方式被称为快照 snapshotting。
禁用
不设置 save 指令,或者给 save 传入空字符串
动态停止 RDB:redis-cli config set save ""
# save后给空值,表示禁用保存策略
可以通过lastsave
命令获取最后一次成功执行快照的时间。
执行flushall
命令,也会产生dump.rdb
文件,但里面是空的,无意义。
rdb的备份
先通过config get dir
:查询 rdb 文件的目录
将*.rdb
的文件拷贝到别的地方
cp dump.rdb dump2.rdb
rdb 的恢复
cp dump2.rdb dump.rdb
以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,如果 Redis 重启就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
AOF 持久化流程
客户端的请求写命令会被 append 追加到 AOF 缓冲区内;
AOF 缓冲区根据 AOF 持久化策略 [always,everysec,no]
将操作 sync 同步到磁盘的 AOF 文件中;
AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 Rewrite 重写,压缩 AOF 文件容量;
Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的。
AOF 和 RDB 同时开启时,系统默认读取 AOF 的数据(数据不会存在丢失)。
AOF 默认不开启
文件名字
redis.conf
中配置文件名称,默认为 appendonly.aof
AOF 启动/修复/恢复
AOF 的备份机制和性能虽然和 RDB 不同,但是备份和恢复的操作同 RDB 一样,都是拷贝备份文件,需要恢复时再拷贝到 Redis 工作目录下,启动系统即加载。
/usr/local/bin/redis-check-aof--fix appendonly.aof
进行恢复AOF 同步频率设置
AOF 采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当 AOF 文件的大小超过所设定的阈值时,Redis 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。
执行命令 bgrewriteaof,Redis 会将 AOF 文件的内容压缩,生成一个新的 AOF 文件,只保留可以恢复数据的最小指令集。
set k1 v1
set k2 v2↓
set k1 v1 k2 v2
重写原理,如何实现重写
no-appendfsync-on-rewrite:
yes
,不写入 aof 文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)no
, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)触发机制,何时重写
重写流程
save 900 1
这条规则。