RDB(Redis DataBase)
AOF(Append Only File)
AOF重写
auto-aof-rewrite-min-size
:如果 AOF 文件大小小于该值,则不会触发 AOF 重写。默认值为 64 MB;auto-aof-rewrite-percentage
:执行 AOF 重写时,当前 AOF 大小(aof_current_size)和上一次重写时 AOF 大小(aof_base_size)的比值。如果当前 AOF 文件大小增加了这个百分比值,将触发 AOF 重写。将此值设置为 0 将禁用自动 AOF 重写。默认值为 100。
AOF 重写(rewrite) 是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有 AOF 文件进行任何读入、分析或者写入操作。
Redis 的 AOF(Append-Only File)持久化方式通过将写命令追加到文件中来记录数据库状态。随着 Redis 接受更多的写操作,AOF 文件会持续增长。为了防止文件过大以及优化存储效率和恢复速度,Redis 提供了 AOF 重写机制。
AOF 重写过程的原理如下:
-
触发重写:
- 可以手动触发通过执行
BGREWRITEAOF
命令。 - 也可以配置自动触发,当 AOF 文件大小达到一定阈值或增长比例时,Redis 自动发起重写。
- 可以手动触发通过执行
-
创建子进程:
- Redis 主进程 fork 出一个子进程来执行重写操作,保证主进程不受影响,继续处理客户端请求。
-
读取当前数据集:
- 子进程遍历当前数据库中的所有键及其关联的数据结构,并根据这些数据结构生成一系列最小化的、能够重建当前数据库状态的命令。
-
写入新文件:
- 子进程将这些最小化命令序列化为字符串形式,并写入到一个新的临时 AOF 文件中。这个新文件仅包含重建当前数据集所需的最少命令集合,消除了不必要的冗余。
-
增量写入:
- 在子进程进行重写的同时,主进程依然接收并处理客户端的写命令,这些新的命令会被追加到内存中的 AOF 缓冲区。
- 当子进程完成重写后,它会将这段时间积累在缓冲区中的增量命令追加到新的 AOF 文件末尾。
-
原子切换文件:
- 子进程完成上述步骤后通知父进程,父进程在确认无误的情况下,用新生成的 AOF 文件替换旧的 AOF 文件,通常是一个原子的操作(例如 rename() 系统调用)。
-
清理与压缩:
- 替换完成后,旧的 AOF 文件可能被删除,确保空间回收。
通过这种机制,Redis 能够保持数据的一致性和完整性,同时有效地控制 AOF 文件的大小,提高重启时的数据加载速度。
如何选择?
1、RDB + AOF同时开启
2、混合持久化
开启 RDB 持久化:
RDB 是默认启用的,但你可以检查并设置相关参数以满足你的需求,例如更改保存间隔时间、数据库大小阈值等。
# 保存快照的频率,可以是保存 N 秒内有至少 M 个键被改动的情况
save <seconds> <changes>
# 示例:在900秒内至少有一个key发生变化时,生成一次RDB快照
save 900 1
# 设置 RDB 文件的路径
dbfilename dump.rdb
# 设置数据持久化目录
dir /path/to/your/directory
开启 AOF 持久化:
AOF 需要手动开启,并且可以配置同步策略。
# 开启 AOF 功能
appendonly yes
# 设置 AOF 文件名称
appendfilename appendonly.aof
# 设置 AOF 同步策略:
# always - 每次写命令都会同步到磁盘,最安全但性能开销最大
# everysec - 默认配置,每秒同步一次,兼顾性能与安全性
# no - 不主动进行同步,交给操作系统决定何时同步,性能最好但数据安全性最差
appendfsync everysec # 或者 appendfsync always,或 appendfsync no
# 触发 AOF 文件重写的最小文件尺寸(单位可为 MB 或 GB)
auto-aof-rewrite-min-size 64mb # 可以根据实际情况调整
# 当前 AOF 文件相对于上一次重写后的增长百分比
auto-aof-rewrite-percentage 100 # 建议值为100,表示当AOF文件增长超过原大小的一倍时触发重写
混合持久化