目录
一、RDB快照原理
以下是RDB相关的配置参数:
################################ SNAPSHOTTING ################################
# 内存数据持久化到磁盘
# 触发持久
save 900 1 # 900s内至少1个key被修改,触发保存
save 300 10 # 300s内至少15个key被修改,触发保存
save 60 10000 # 60s内至少10000个key被修改,触发保存
# bgsave(全量保存)发生错误时,停止持久化
stop-writes-on-bgsave-error yes
# dump*.rdb文件以LZF压缩
rdbcompression yes
# 校验*.rdb文件
rdbchecksum yes
# *.rdb文件
dbfilename dump6384.rdb
# rdb文件删除时是否复制文件
rdb-del-sync-files no
# *.rdb文件存放的目录
dir ./
如上图及配置所示,需注意问题:
1. RDB持久化操作:当key修改触发bgsave时,主线程调用fork函数创建一个异步子线程,主子线程共享数据段,修改的key复制一份出来:主线程做修改,而子线程进行持久化操作
2. "快照":复制一份要被修改的数据(COW_Copy On Write)
3. RDB持久时出现修改操作:主线程做修改产生AOF日志,bgsave操作完成时,再执行AOF(RDB期间产生的AOF)
二、AOF日志原理
以下是AOF相关的配置参数:
############################## APPEND ONLY MODE ###############################
# 启用AOF
appendonly yes
# appendonly*.aof文件
appendfilename "appendonly6384.aof"
# 是否调用fsync()函数
# appendfsync always #写指令时,执行同步操作
appendfsync everysec #处于always与no之间,每秒执行同步操作
# appendfsync no
# 其他配置
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 # 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写
auto-aof-rewrite-min-size 64mb # 允许重写的最小AOF文件大小
aof-load-truncated yes
aof-use-rdb-preamble yes
如上图及配置所示,需注意问题:
1. AOF日志:redis操作日志,只记录修改指令(增修删)
2. 重写AOF:长时间使用,AOF日志很庞大,redis重启时需重放AOF,启动漫长。重写AOF就是为AOF瘦身
3. fsync函数目的:强制文件内容刷新到磁盘中,避免日志丢失
三、RDB&AOF比较
内容 | RDB | AOF |
文件内容 | 记录内存数据二进制序列化 | 记录修改指令 |
文件 | *.rbd | *.aof |
备份量 | 当前内存的一次全量备份 | 连续的增量备份 |
调用函数 | fork函数 | fsync函数 |
缺点 | 遍历整个内存 | 日志庞大,重启时漫长 |
混合持久化:RDB文件内容 + 增量AOF日志存在一起 |
混合持久化:RDB文件内容 + 增量AOF日志存在一起