Redis 数据的持久化
# 一、基本介绍
- Redis 数据是存储在内存中的,当 Redis 进程退出或崩溃后,内存中的数据需要持久化到磁盘才能避免数据丢失问题,在下次重启时利用之前持久化的文件即可实现数据恢复;
- Redis 部署常常是主从模式的,主从之间的全量复制、节点崩溃后的恢复等都需要从持久化的文件中获取数据;
- Redis 主要的持久化方式是 RDB 和 AOF,即内存快照和命令追加;
# 二、RDB 方式
- 将当前内存中数据生成快照保存在硬盘上,可以手动触发和自动触发;
- Redis 默认采用LZF算法对生成的 RDB 文件做压缩处理,压缩后的文件远远小于内存大小,默认开启,可以通过参数
config set rdbcompression{yes|no}
动态修改;
# 手动触发:
- save 命令:阻塞当前 Redis 服务,直到 RDB 过程完成为止,内存使用较多时会造成长时间阻塞,线上环境不建议使用;
- bgsave 命令:Redis 进程执行 fork 操作创建子进程,子进程负责 RDB 持久化过程,完成后自动结束,阻塞只发生在 fork 阶段,一般时间很短;
# 自动触发:
- 使用 save 相关配置,如
save m n
,表示 m 秒内数据集存在 n 次修改时,自动触发 bgsave; - 如果从节点执行全量复制操作,主节点自动执行 bgsave 生成 RDB 文件并发送给从节点;
- 默认情况下执行 shutdown 命令时,如果没有开启 AOF 持久化功能则自动执行 bgsave;
# 优缺点
- 优点:RDB 是一个紧凑压缩的二进制文件,Redis 加载 RDB 文件恢复数据远远快于 AOF,非常适合备份、全量复制等场景;
- 缺点:无法做到实时持久化,频繁执行RDB备份成本较高,可能会丢失最后一次备份之后的数据;
# 三、AOF 方式
- 以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中的命令达到恢复数据的目的;
- AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式,默认是不开启的;
# 工作流程
- append:所有的写入命令会先追加到 aof_buf 缓冲区中,避免直接写磁盘有性能瓶颈;
- sync:aof_buf 缓冲区根据对应的策略向硬盘做同步操作,将缓冲区的命令同步到磁盘;
- rewrite:随着 AOF 文件越来越大,需要把Redis进程内的数据转化为写命令同步到新的 AOF 文件,达到压缩的目的;
- load:当 Redis 服务器重启时,可以加载AOF文件进行数据恢复;
# 同步策略
- Always:每个写命令都要同步到磁盘,即使是一条写命令也会执行同步操作;这种策略可以确保数据的完整性和持久性,但会导致频繁的磁盘写入,影响性能;
- Everysec:默认的 AOF 同步策略,Redis 每秒钟执行一次同步操作,将缓冲区中的写命令同步到磁盘;这种策略可以在一定程度上保证数据的完整性,同时减少了磁盘写入的频率,对性能影响较小;因为存在追加阻塞的问题,最多会丢失 2 秒钟的数据;
- No:Redis 不主动进行 AOF 的同步操作,完全依赖操作系统进行异步写入;这种策略可能导致系统崩溃时数据丢失,不推荐在生产环境中使用;
# 重写机制
- Redis 进程中有已经过期的数据、AOF 文件中有无效的命令(先set再delete)、有可以合并的多个命令,所以 AOF 文件重写后,体积会更小,能够更快被 Redis 加载;
- AOF 文件重写能够被手动触发或自动触发,直接调用 bgrewriteaof 命令触发重写,或是根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数自动触发(文件体积和两次触发的体积比);
# 重写过程
- 1)执行 AOF 重写请求;
- 2)父进程执行 fork 创建子进程,开销等同于 bgsave 过程;
- 3.1)主进程 fork 操作完成后,继续响应其他命令,所有修改命令依然写入 AOF 缓冲区并根据同步策略同步到硬盘,保证原有 AOF 机制正确性;
- 3.2)由于 fork 操作运用写时复制技术,子进程只能共享 fork 操作时的内存数据,父进程依然响应命令,Redis 使用 “AOF重写缓冲区” 保存这部分新数据,防止新 AOF 文件生成期间丢失这部分数据;
- 4)子进程根据内存快照,按照命令合并规则写入到新的 AOF 文件;每次批量写入硬盘数据量由配置 aof-rewrite-incremental-fsync 控制,默认为 32MB,防止单次刷盘数据过多造成硬盘阻塞;
- 5.1)新 AOF 文件写入完成后,子进程发送信号给父进程,父进程更新统计信息,具体见 info persistence 下的 aof_* 相关统计;
- 5.2)父进程把AOF重写缓冲区的数据写入到新的AOF文件;
- 5.3)使用新 AOF 文件替换老文件,完成 AOF 重写;
编辑 (opens new window)
上次更新: 2024/07/18, 15:36:38