在整个 AOF 后台重写过程中,只有信号处理函数执行时会对服务器进程(父进程)造成阻塞,其他时候,AOF 后台重写都不会阻塞父进程,这将 AOF 重写对服务器性能造成的影响降到了最低
参考
2.2.3 重启加载流程说明:
1)AOF持久化开启且存在AOF文件时,优先加载AOF文件。
2)AOF关闭或者AOF文件不存在时,加载RDB文件。
3)加载AOF/RDB文件成功后,Redis启动成功。
4)AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。
数据还原的详细步骤:
创建一个不带网络连接的伪客户端(fake client): 因为 Redis 的命令只能在客户端上下文中执行,而载入 AOF 文件时所使用的命令直接来源于 AOF 文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行 AOF 文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样。
从AOF文件中分析并读取出一条写命令,使用伪客户端执行被读出的写命令,重复此操作,直到AOF文件中的所有写命令都被处理完毕为止。
2.2.4 文件校验加载损坏的AOF文件会拒绝启动,并打印错误信息。
注意:对于错误格式的AOF文件,先进性备份,然后采用redis-check-aof --fix命令进行修复,修复后使用diff -u对比数据差异,找到丢失的数据,有些可以进行人工补全。
AOF文件可能存在结尾不完整的情况,比如机器突然掉电导致AOF尾部文件命令写入不全。
Redis为我们提高了aof-load-truncated配置来兼容这种情况,默认开启
3. 了解MySQL中的binlogmysql binlog应用场景与原理深度剖析
参考博文与书籍:《redis设计与实现》
Redis持久化
徐刘根-Redis实战和核心原理详解(8)使用快照RDB和AOF将Redis数据持久化到硬盘中