技术分享 | Redis 持久化之 RDB 与 AOF
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
作者贲绍华
爱可生研发中心工程师负责项目的需求与维护工作。其他身份柯基铲屎官。
本文来源原创投稿
*爱可生开源社区出品原创内容未经授权不得随意使用转载请联系小编并注明来源。
一、RDBRedis Database简介
RDB持久化方式能够在指定的时间间隔内N秒内有M次改动时对实例的数据进行快照存储也就是全备的意思。
二、RDB - 特性
2.1 优点
- 单一文件方便传输适合灾备
- 恢复大数据集时效率会比AOF快一些
- 备份时会由fork出的子进程操作父进程不需要其他IO操作性能相对AOF来说占优。
2.2 缺点
- 在间隔其间发生意外宕机会造成数据大量丢失
- 数据量非常大时fork子进程非常耗时可能会影响业务正常响应。
三、RDB - 策略
RDB的备份触发方式有两种类型五种触发条件分别为
3.1 自动触发
- 根据conf内配置的save规则进行保存
- 执行FLUSHALL删除所有数据库里面的所有数据命令会触发
- 主动退出Redis会触发。
3.2 手动触发
- SAVE「同步执行」保存数据至磁盘
- BGSAVE「异步执行」保存数据至磁盘。
3.3 操作流程
1.fork一个子进程,创建子进程时并不会发生数据复制提高了复制速度降低了所需空间大小内核级的系统调用:fork()
2.子进程获得所有数据指向地址的指针
3.此时如有数据继续增加则触发写时复制父进程指向新值地址子进程依旧指向原值地址COWcopy-on-write 写时复制
4.将指针指向的值写入备份
5.备份完成。
四、RDB - 配置
配置项 | 说明 |
---|---|
save | N秒内有M次改动时保存触发的是BGSAVE异步执行 |
stop-writes-on-bgsave-error | 快照出错时是否禁止写入操作 |
rdbcompression | 是否压缩RDB文件 |
rdbchecksum | 是否开启RC64校验 |
dbfilenameRDB | 文件保存名称 |
dirRDB | 文件保存目录 |
五、RDB - 其他
5.1 时点性
当Redis在指定时间点触发全备时如果此后数据库依然有修改则值还是会保留在未修改前的时间点这样保证了不会发生时点混乱。
5.2 阈值建议
建议Redis使用内存控制在10-15G以内过大的话会影响RDB落盘的速度。
5.3 RDB文件损坏该怎么办
在Redis的安装目录内提供了redis-check-rdb工具用于对损坏的备份文件进行修复。
六、AOFAppend Only File简介
AOF持久化方式即增备记录每次对服务器写的操作当服务器重启的时候会重新执行这些命令来恢复原始的数据。
AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行重写压缩使得AOF文件的体积不至于过大。
6.1 AOF文件协议
下面列举一段AOF文件内容进行说明
# 假设此时客户端执行了语句SET KEY VALUE则AOF内容如下
*3
$3
SET
$3
KEY
$5
VALUE
上述内容中看似比较杂乱但理解一下其实很简单
*表示跳过$行时往下一次读几行
$表示下一行有多少个字符
七、AOF - 特性
7.1 优点
- 异常宕机损失较小能够做到数据不丢失或最多丢失1秒
7.2 缺点
- 对比RDB在恢复数据的效率上表现不高
- AOF文件会比RDB文件更大
- 根据所使用的 fsync 策略不同AOF 的速度可能会慢于 RDB
八、AOF - 策略
AOF同样分为两种触发方式根据配置项appendfsyncAOF持久化策略的不同对应的执行时机也不同
8.1 自动触发
- no从不 fsyncbuffer写满了就落盘速度快
- everysec「默认」每一秒保存一次
- always每次都fsync速度慢可靠性高
8.2 手动触发
BGREWRITEAOF「异步执行」重写AOF文件
九、AOF - 配置
配置项 | 说明 |
---|---|
appendonly | 是否开启AOF |
AOFappendfilename | AOF文件名 |
appendfsync | AOF持久化策略 |
no-appendfsync-on-rewrite | 在写入时是否对新记录暂缓追加 |
auto-aof-rewrite-percentage | AOF文件增长比例 |
auto-aof-rewrite-min-size | 文件重写文件大小 |
aof-load-truncated | 是否末尾异常的AOF文件 |
aof-use-rdb-preamble | 是否使用RDB-AOF混合持久化模式4.0版本之后 在开启了这个功能之后AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容其中RDB格式的内容用于记录已有的数据而AOF格式的内存则用于记录最近发生了变化的数据这样Redis就可以同时兼有RDB持久化和AOF持久化的优点既能够快速地生成重写文件也能够在出现问题时快速地载入数据发生重写之后才能变成混合体 |
十、AOF - 其他
10.1 AOF重写的版本差异性
- 4.0之前删除可以相互抵消的命令合并重复命令
- 4.0之后先将内存数据都数据成RDB后续操作依旧记录成AOF
10.2 AOF文件损坏了该怎么办
由于是增备在数据持续写入时遇到意外宕机时很容易造成AOF文件的损坏此时重启Redis实例会无法载入该文件。
解决的方式如下
1.定时备份AOF文件
2.在Redis的安装目录中提供了redis-check-aof工具用于修复异常的AOF文件可以在修复完成后diff -u来对比一下修复前后文件的差异性