回到顶部
vAOF方式
? AOF的优点
- 使用 AOF 持久化会让 Redis 变得非常耐久(much more durable):你可以设置不同的 fsync 策略,比如无 fsync,每秒钟一次 fsync,或者每次执行写入命令时 fsync。AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求) 。
- AOF 文件是一个只进行追加操作的日志文件(Append only log),因此对 AOF 文件的写入不需要进行 seek,即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等),redis-check-aof 工具也可以轻易地修复这种问题 。
- Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合 。整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失 。而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作 。
- AOF 文件有序地保存了对数据库执行的所有写入操作,这些写入操作以 Redis 协议的格式保存,因此 AOF 文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松 。导出(export) AOF 文件也非常简单: 举个例子,如果你不小心执行了 FLUSHALL 命令,但只要 AOF 文件未被重写,那么只要停止服务器,移除 AOF 文件末尾的 FLUSHALL 命令,并重启 Redis,就可以将数据集恢复到 FLUSHALL 执行之前的状态 。
- 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积 。
- 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。在一般情况下,每秒 fsync 的性能依然非常高,而关闭 fsync 可以让 AOF 的速度和 RDB 一样快,即使在高负荷之下也是如此 。不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency) 。
- AOF 在过去曾经发生过这样的 bug : 因为个别命令的原因,导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样 。(举个例子,阻塞命令 BRPOPLPUSH source destination timeout 就曾经引起过这样的 bug。) 测试套件里为这种情况添加了测试: 它们会自动生成随机的、复杂的数据集,并通过重新载入这些数据来确保一切正常 。虽然这种 bug 在 AOF 文件中并不常见,但是对比来说,RDB 几乎是不可能出现这种 bug 的 。
只进行追加操作的文件(append-only file,AOF)
快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机,那么服务器将丢失最近写入、且仍未保存到快照中的那些数据 。
尽管对于某些程序来说,数据的耐久性并不是最重要的考虑因素,但是对于那些追求完全耐久能力(full durability)的程序来说,快照功能就不太适用了 。
从 1.1 版本开始,Redis 增加了一种完全耐久的持久化方式: AOF 持久化 。
你可以通过修改配置文件来打开 AOF 功能:
appendonly yes从现在开始,每当 Redis 执行一个改变数据集的命令时(比如 SET key value [EX seconds] [PX milliseconds] [NX|XX] ),这个命令就会被追加到 AOF 文件的末尾 。
这样的话,当 Redis 重新启时,程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的 。
AOF 重写
因为 AOF 的运作方式是不断地将命令追加到文件的末尾,所以随着写入命令的不断增加,AOF 文件的体积也会变得越来越大 。
举个例子,如果你对一个计数器调用了 100 次 INCR key,那么仅仅是为了保存这个计数器的当前值,AOF 文件就需要使用 100 条记录(entry) 。
然而在实际上,只使用一条 SET key value [EX seconds] [PX milliseconds] [NX|XX] 命令已经足以保存计数器的当前值了,其余 99 条记录实际上都是多余的 。
为了处理这种情况,Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下,对 AOF 文件进行重建(rebuild) 。
执行 BGREWRITEAOF 命令,Redis 将生成一个新的 AOF 文件,这个文件包含重建当前数据集所需的最少命令 。
Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令; Redis 2.4 则可以自动触发 AOF 重写,具体信息请查看 2.4 的示例配置文件 。
AOF 的耐久性如何?
你可以配置 Redis 多久才将数据 fsync 到磁盘一次 。
推荐阅读
- 为什么分布式一定要有Redis?
- 如何设计数据库:淘宝商品数据库设计的一些经验
- 茶叶大数据颠覆你的认知 喝不喝茶的都看看
- 抖音运营如何分析对标账号,对标账号我们都需要分析哪些数据
- 2021抖音电商年度数据
- 洗茶真的不科学 实验数据告诉你 事实就是如此残酷
- Excel录入数据防止出错,设置自动限制的技巧
- 人工智能算法是如何从数据中学习规律的
- 只要10分钟,教你配置出炫酷的数据可视化大屏
- mysql数据库 InnoDB崩溃恢复机制总结