Redis 持久化
1、持久化机制产生的背景
- Redis 对数据的读取操作,都是在内存中进行的,这样一来不可避免有数据丢失的可能,比如宕机。人们要求在服务重启的时候可以将之前的数据进行恢复,Redis 提供的持久机制就是用来解决这一问题的。
- Redis 提供了两种持久化方式,分别是 RDB 和 AOF。
2、RDB 持久化方式
RDB(Redis Database File) 持久化方式是 Redis 默认的方式,它对 redis 中的数据执行周期性的持久化。因此会存在不同时间点的备份数据,在做数据还原时,可以自由选择。
2.1、RDB 自动触发方式
- save:这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。默认的配置如下 :
# 表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 900 1
# 表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 300 10
# 表示60 秒内如果至少有 10000 个 key 的值变化,则保存
save 60 10000
- 只要达到配置的条件,Redis 就会自动调用 BGSAVE 命令进行保存(非阻塞)
2.2、RDB 手动触发方式
手动触发是通过 SAVAE
命令或者 BGSAVE
命令将内存数据保存到磁盘文件中。SAVE 命令会阻塞 Redis 服务器进程,直到快照文件创建完毕为止,在这个过程中,服务器不能处理任何的命令请求。BGSAVE
命令是非阻塞式的。
3、AOF 持久化方式
AOF(Append Only File) 持久化方式会记录每条写入操作,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。
3.1、AOF 的触发方式
- always:每次发生数据变更都会被立即记录到磁盘,性能较差,但数据完整性比较好。
- everysec(默认):每秒钟将AOF缓冲区的内容写入AOF文件,如果宕机,就会有1秒内的数据丢失。
- no:将数据同步操作交给操作系统来处理,性能最好,但是数据可靠性最差。
- 这3种方式都可以在配置文件中进行配置,默认是:apendfsync everysec。
3.2、重写操作
在AOF持久化模式下,每个写命令都会追加到AOF文件,随着时间推移,AOF文件会越来越大,为了避免AOF产生的文件太大,服务器会对AOF文件进行重写,将操作相同键(Key)的相同命令合并,从而减少该文件的大小。
3.3、AOF 注意事项
Redis 是支持事务的,而按照 AOF 同步机制,如果只是宕机发生了,则可能只写入了一个完整事务的部分操作。在 Redis 重启时,如果检测到这种不完整的事务操作,将会退出并显示错误信息。使用redis-check-aof 工具可以修复AOF文件,删除掉该文件中的事务部分,这样服务器就可以重新启动了。
4、Q & A
持久化机制的意义
- 保证了大部分的内存数据不会丢失
- 服务重启后,进行数据数据恢复,可以快速的对外提供服务
- 不会造成缓存雪崩问题
AOF 和 RDB 的比较
- RDB 会生成多个数据文件,每个数据文件都代表了某一个时刻中 redis 的数据。
- RDB 相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复数据,更加快速。
- AOF 相对于 RDB 的数据备份更新完整。AOF一般隔1秒同步一次,所以最多只会丢失1秒钟的数据,而 RDB 的备份方式,由于是全量备份,为了性能等因素,一般时间间隔都设置得比较长(5分钟以上),因此数据也会丢失得比较多。
- AOF文件会以文本格式保存所有写操作命令,且未经压缩,RDB 是以二进制保存的文件。对于同一数据集,AOF文件通常大于等效的RDB文件。
- AOF文件包含了所有操作的日志,而且很容易看懂,当用户不小心使用了flushall命令,flushall会把所有的数据删除,但是可以根据AOF文件找到错误的命令,把这些错误的指令删除,然后重新启动Redis,就可以恢复对应的业务数据。
AOF 和 RDB 的数据恢复顺序
- 如果开启了AOF,则使用AOF持久化文件恢复数据,否则使用RDB持久化文件恢复数据
- 若AOF文件和RDB文件都不存在,则直接启动Redis。
AOF + RDB 的混合模式
在Redis 4之后的版本新增了AOF+RDB混合模式,先使用RDB存储快照,然后使用AOF持久化记录所有的写操作,当满足重写策略或手动触发重写的时候,将最新的数据存储为新的RDB记录。重启服务时会从RDB和AOF两部分恢复数据,既保证了数据的完整性,又提高了数据恢复的性能。
AOF 和 RDB 如何选择
使用RDB持久化会有数据丢失的风险,但是数据恢复的速度快;使用AOF持久化可以保证数据的完整性,但数据恢复的速度慢。因此应采用 AOF + RDB 混合模式。