在 redis.io 网站上,它指出 RDB 的持久性不如 AOF。这是否意味着如果在保存操作期间断电,数据库可能会损坏,甚至数据完全丢失?
答案1
如果底层数据存储出现问题,RDB 文件可能会损坏。Redis 包含一个实用程序 redis-check-dump 来验证文件,您可以使用它来检查新写入的转储文件的一致性。
如果启动时 RDB 损坏,Redis 将无法启动并报告一个有点神秘的错误。这里有一个拉取请求:
https://github.com/antirez/redis/pull/1744
使检查程序自动运行,但尚未合并。
转储文件是在后台线程中写入的,这意味着它不能包含键空间的 100% 最新副本。要实现这一点,您需要使用 AOF 文件并在每次写入后将其设置为同步(这会影响性能)。
Redis 的架构允许您为此构建许多不同的解决方案。您可以在主服务器上启用 AOF 写入,并使用“从不”fsync,然后创建两个从服务器,其中一个服务器每 10 分钟仅创建一次 RDB 文件,另一个服务器使用 AOF 并“始终”或“每秒”fsync。只要磁盘从未发生故障,这将为您提供主服务器上的内置冗余,但如果发生故障,您可以从从服务器上获取 AOF 文件并使用它来恢复主服务器。如果失败,您可以转到 RDB 从服务器,但在这种情况下,您可能会丢失自最后 10 分钟转储以来写入的数据。
这种灵活性是 Redis 如此强大的原因之一:您可以根据存储的数据选择使用哪种级别的冗余。
或者,您可以使用托管的 Redis 服务,让他们担心细节。
答案2
.rdb 本身“不可能”损坏,因为转储首先保存到临时文件,然后重命名为转储。当然,重命名时可能会出错。因此可能性非常小,但可能性不大。