NoSql之Redis系列二: Redis的数据持久化方式
Redis 的持久化简介
Redis提供了两种不同的方式将数据持久化到硬盘中, 使得数据在Redis 重启后仍然存在. 将内存中的数据存储到硬盘的一个主要问题就是为了在之后重用数据, 或者是为了防止系统故障而将数据备份到一个远程位置.
Redis 持久化的两种方式
RDB 持久化
RDB 持久化又称为快照(snapchotting), 它可以将某一时刻的所有数据全部写入到硬盘中, 存储到后缀为.rdb文件中.
RDB 持久化的触发方式
- [手动] 客户端发送 BGSAVE 命令来创建一个快照. Redis会调用fork 来创建一个子进程, 子进程负责写入快照到硬盘, 父进程继续处理命令请求.
- [手动] 客户端发送 SAVE 命令来创建一个快照. Redis 会在快照创建完毕之前不处理任何命令. 一般在没有足够内存去执行 BGSAVE 的情况下, 或者等待持久化无所谓的情况 才会使用 SAVE 命令.
- [自动] 服务端配置设置 save 选项. save 60 10000 命令含义是 “60秒内有10 000次写入” 这个条件满足时, 自动调用 BGSAVE 命令. 如果有多个save配置, 任意一个满足则触发 BGSAVE命令.
- [自动] 服务端接受 SHUTDOWN 命令关闭服务器时, 或者接受到标准 TERM 信号时, 自动执行 SAVE 命令. 并在结束时关闭服务器.
- [自动] 当一个 Redis 服务器连接另一个 Redis 服务器, 并向对方发送 SYNC 命令开始一次复制操作的时候, 如果主服务器并非刚刚执行 BGSAVE 命令, 那么主服务器就会执行 BGSAVE 命令.
RDB 可能的问题和解决办法
问题1: 当 Redis 存储的数据量只有几GB的时候, 快照是完全没有问题的. 当内存占用高达几十个GB, 并且剩余内存不多的时候, BGSAVE 创建子进程可能导致系统长时间卡顿, 也可能引发系统大量地使用虚拟内存,从而导致 Redis 的性能降低至无法使用的程度.
解决办法:使用 SAVE 命令来代替 BGSAVE 命令,因为没有了子进程争抢资源, 所以会比 BGSAVE 快一些.
问题2: 在执行 BGSAVE 或者 SAVE 命令的间隙, Redis 发生异常, 会造成间隙的数据会丢失.
解决办法:如果使用RDB方式无法解决, 只能使用 AOF 方式.
AOF 持久化
AOF(append-only file) 持久化, 它会在执行写命令时, 将被执行的写命令写入到后缀为.aof文件里面.
AOF 触发方式(默认为 no)
appendonly yes
AOF 的同步频率 appendfsync
- always: 每个 Redis 命令都要同步写入到硬盘, 这样会严重降低 Redis 的速度. 固态硬盘用户需要谨慎使用该选项, 可能引发ssd的写入放大问题, 将低ssd的使用寿命.
- everysec (default): 每秒执行一次同步, 显示地将多个命令同步到硬盘.
- no: 让操作系统决定应该何时进行同步.
AOF可能的问题及解决方式
问题1: AOF如果使用 everysec 的同步频率, 可以将丢失数据的窗口降低到1秒, 为什么Redis默认不启用AOF?
回答: 1. 因为 Redis 不断写入记录到 AOF 文件中, 随着 Redis 的运行, AOF 的体积也不短增大, 极端情况, 可能占用所有硬盘; 2. 当 AOF 过大的时候, 重启 Redis 重新执行 AOF 文件来还原数据集时, 执行时间可能非常长.
问题2: 如何解决 AOF 文件体积不断增大的问题?
解决办法: 执行 BGREWRITEAOF 命令, 压缩 AOF 文件, 使得其体积尽可能小. 该命令的工作原理: Redis 创建一个子进程, 使用子进程重写 AOF 文件.
问题3: 是否可以自动执行 BGREWRITEAOF 命令?
回答: 可以自动执行, 需要开启配置 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 两个选项, 设置 启动 AOF持久化且 auto-aof-rewrite-percentage 100, auto-aof-rewrite-min-size 64MB 时, 当 AOF 文件大于64MB, 且 AOF 文件的体积比上一次重写之后的体积大了一倍, Redis 将执行 BGREWRITEAOF 命令.
持久化的比较
下面的比较都是在数据量较大, 且配置设置合理的情况下 相对而言的比较.
持久化方式 | 优点 | 缺点 |
---|---|---|
RDB | 1. 文件紧凑, 体积小 2. 恢复速度快 | 1. 不能实时持久化, 备份间隙数据丢失严重 2. 不同版本可能有兼容性问题 |
AOF | 1. 备份速度快 2. 不同版本兼容性好 | 1. 文件大 2. 恢复速度慢 |
持久化的选择
- 只用来数据缓存, 则可以都不启用.
- 单机情况下, 如果数据完整性要求较高 建议开启 AOF持久 或者 AOF RDB 双持久, 如果对数据完整性要求不高, 可以只开启 RDB. 具体的参数设置根据实际业务调整.
- 主从情况下, master 两种方式都关闭, slaver 开启 aof 并定时执行 BGREWRITEAOF 命令.
引用文献
Redis in Action (Redis 实战)