Redis 的RDB和AOF的对比总结
RDB持久化(Redis DataBase)
Redis是内存数据库,一旦服务器进程退出,服务器中的数据库状态也会消失不见。重点在于save和bgsave命令。
RDB文件的创建与载入
- save命令:阻塞Redis服务器进程,直到知道RDB文件创建为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。
- bsave命令:派生出子线程,由子线程创建RDB文件,父线程继续处理请求。
创建RDB文件实际 rdb.c/rdbLoad 函数完成的。
自动间隔性保存
Redis服务器会通过用户配置save选项,每隔一段时间去执行一下bgsave命令;默认的配置文件redis.conf,关于rdb部分的配置如下:
# 自动save(关闭自动save配置)
# 服务器在900秒之内,对数据库至少修改了1次
save 900 1
# 服务器在300秒之内,对数据库至少修改了10次
save 300 10
# 服务器在60秒之内,对数据库至少修改了10000次
save 60 10000
# 设置RDB文件名字
# 设置对应的端口号,在充分引用多核的情况下避免文件冲突覆盖
dbfilename dump-${port}.rdb
# 文件存储路径
# 选择一个比较大的硬盘路径、或者分盘
dir /bigdiskpath
# bgsave时发生错误停止写入(默认是yes)
stop-writes-on-bgsave-error yes
# RDB文件是否采用压缩格式(默认是yes)
rdbcompression yes
# RDB文件是否校验和的检验(默认是yes)
rdbchecksum yes
优缺点
- 优点:
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高
- 缺点:
- 会丢失最后一次修改的数据
- fork会产生额外消耗
AOF持久化(Append Only File)
与RDB通过键值对来记录数据库状态不同,AOF是通过Redis服务器所执行的写命令来记录数据库状态的。
AOF持久化的实现
AOF持久化功能的实现可以分为命令==追加(append)、文件写入、文件同步(sync)==三个步骤。
aof在redis.conf配置文件的:
# 开启aof,默认是no
appendonly yes
# aof文件命名
appendfilename "appendonly-${port}.aof"
# 设置aof策略
appendfsync everysec
# aof文件存储路径
dir /bigdiskpath
#yes : 在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
#no : 在日志重写时,命令追加操作照常进行
no-appendfsync-on-rewrite yes
#AOF文件增长率,默认为100%
auto-aof-rewrite-percentage
#AOF文件重写需要的尺寸,默认为1MB
auto-aof-rewrite-min-size
AOF重写
随着服务器时间的流逝,文件的体积越来越大,体积过大的AOF文件对redis服务器、甚至整个宿主计算机造成影响。并且AOF文件的体积越大,使用AOF文件进行数据还原所需的时间越多。
为了解决AOF文件体重膨胀的问题,redis提供了AOF文件重写(rewrite)的功能。
- 触发机制:redis会记录上次重写时AOF的大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且大于64M;默认配置如下:
- auto-aof-rewrite-percentage 100
- auto-aof-rewrite-min-size 64mb
优缺点
- 优点:
- 配置灵活,可以选择多种方式进行持久化。
- 缺点:
- 相同数据集的数据而言,aof文件要远大于rdb文件,恢复速度慢于rdb。
详细原理:
企业级Redis开发运维从入门到实践 (15)— 持久化的作用
企业级Redis开发运维从入门到实践 (16)— RDB
企业级Redis开发运维从入门到实践 (17)— AOF
企业级Redis开发运维从入门到实践 (18)— RDB和AOF的抉择