- 作用
持久化就是把内存的数据写到磁盘中去,防止服务器宕机了内存数据丢失。 - 持久化方式
Redis 提供两种持久化机制:RDB(默认)和 AOF 机制。
RDB(Redis DataBase)是 Redis 默认的持久化方式。
按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据为 dump.rdb。通过配置文件中的 save 参数来定义快照的周期。
当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
1)Redis 调用forks. 同时拥有父进程和子进程。
2)子进程将数据集写入到一个临时 RDB 文件中。
3)当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
AOF(Append Only File)是将 Redis 执行的每次写命令记录到单独的日志文件中,当重启 Redis 会重新持久化的日志中文件恢复数据。
采用追加的方式保存,默认文件appendonly.aof,记录所有的写操作命令,在服务启动的时候使用这些命令可以还原数据库。这种持久化策略,在服务出现故障时,几乎不丢失任何是数据,有可能会丢失一秒的数据,但是相对RDB损失小的多。
1)AOF 写入机制
AOF 方式不能保证绝对不丢失数据。
目前常见的操作系统中,执行系统调用 write 函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会直接将内容写入硬盘里面,而是现将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填满,或者用户执行 fsync 调用和 fdatasync 调用时才将存储在缓冲区里的内容真正的写入到硬盘里,为写入磁盘之前,数据可能会丢失。
2)写入磁盘的策略
appendfsync 选项,这个选项的值可以是 always、everysec 或者 no 。
always:服务器没写入一个命令,就调用一次fdataaync,将缓冲区里面的命令写入磁盘。这种模式下,服务器出现故障,也会丢失任何一成功执行的命令数据。
everysec(默认):服务器每一秒重调用一次 fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,最多只丢失一秒内的执行的命令数据。
no:服务器不主动调用 fdatasync,由操作系统决定何时将缓冲区里面的命令写入到磁盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的。
3)AOF 的重写机制
因为 AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大。
为了处理这种情况, Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令; Redis 2.4 则可以自动触发 AOF 重写。
重写过程
1、执行AOF重写请求
2、父进程执行fork创建子进程,开销等同于bgsave过程
3.1、主进程fork操作完成后,继续响应其他命令。所有修改命令依然写入AOF缓冲区,并根据appendfsync策略同步到磁盘,保证原有AOF机制正确性。
3.2、由于fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据。由于父进程依然响应命令,redis使用“AOF重写缓冲区”保存这部分新数据,防止新AOF文件生成期间丢失这部分数据。
4、子进程根据内存快照,按照命令合并规则写入到新AOF文件。每次批量写入硬盘数据量由aof-rewrite-incremental-fsync控制,默认是32MB,防止单词刷盘数据过多造成硬盘阻塞。
5.1、新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息。
5.2、父进程把AOF重写缓冲区数据写入到新的AOF文件。
5.3、使用新AOF文件替换老文件,完成AOF重写。
注:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复
3. Redis 持久化方式选择
一般来说,应该同时使用 RDB 和 AOF 两种持久化功能。
当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。
4. RDB 和 AOF 的优缺点
1)RDB 的优缺点
优点:
完全备份,不同时间的数据集备份可以做到多版本恢复紧凑的单一文件,方便网络传输,适合灾难恢复;
恢复大数据集速度要比 AOF 块;
缺点:
会丢失最近写入、修改的而未能持久化的数据;
fork过程非常耗时,会造成毫秒级不能响应客户端请求;
生产环境:
创建一个定时任务 cron job,每小时或者每天将 dump.rdb 复制到指定目录,确保备份文件名称带有日期时间信息,便于管理和还原对应的时间点和快照版本定时任务删除过期的备份。如果有必要,跨物理主机、跨机架、异地备份。
2)AOF 的优缺点
优点
写入机制,默认fysnc每秒执行,性能很好不阻塞服务,最多丢失一秒的数据
重写机制,优化AOF文件
如果误操作了(FLUSHALL等),只要AOF未被重写,停止服务移除AOF文件尾部FLUSHALL命令,重启Redis,可以将数据集恢复到 FLUSHALL 执行之前的状态
缺点
相同数据集,AOF文件体积较RDB大了很多
恢复数据库速度比RDB慢(文本,命令重演)