如何备份Redis服务器RDB和AOF文件以进行恢复以确保最小的数据丢失?

时间:2013-04-04 20:44:40

标签: redis persistence backup-strategies rdb

目的:

我每隔X次尝试生成dump.rdb的备份副本,每隔Y次尝试appendonly.aof,所以如果文件由于某种原因(甚至只是AOF的appendonly.aof文件)被破坏,我可以恢复我的数据dump.rdb.backup快照,然后是我用appendonly.aof.backup的最新副本后发生的任何其他更改。

情况:

我每隔5分钟备份一次dump.rdb,每1秒备份一次appendonly.aof。

的问题:

1)由于子进程将dump.rdb在后台写入临时文件 - 在子进程创建新映像时发生的键更改会发生什么?我知道无论背景写入如何,AOF文件都会继续追加,但新的dump.rdb文件是否也包含密钥更改?

2)如果dump.rdb不包含密钥更改,是否有某种方法可以找出子进程分叉的确切位置?这样我就可以跟踪AOF文件具有最新信息的点。

谢谢!

1 个答案:

答案 0 :(得分:1)

通常,人们使用RDB,AOF作为持久性策略。两者都很贵。每隔5分钟运行一次转储,每秒复制一个aof文件听起来非常频繁。除非Redis实例仅存储少量数据,否则您可能会杀死盒子的I / O子系统。

现在,关于你的问题:

1)RDB机制的语义

转储机制利用了克隆/分叉处理时现代操作系统内核实现的写时复制机制。 fork完成后,系统只需复制页表即可创建后台进程。页面本身在两个进程之间共享。如果Redis进程在页面上执行了写操作,则操作系统将透明地复制页面(因此Redis实例具有自己的版本,后台处理为先前版本)。因此,后台进程保证了内存结构保持不变(因此保持一致)。

结果是在转储中不占用fork之后开始的任何写操作。转储是在分叉时拍摄的一致快照。

2)跟踪叉点

您可以通过运行INFO持久性命令并计算rdb_last_save_time - rdb_last_bgsave_time_sec来估计fork时间戳,但它不是非常准确(仅次于)。

为了更准确(毫秒),您可以解析Redis日志文件以提取以下行:

[3813] 11 Apr 10:59:23.132 * Background saving started by pid 3816

您至少需要“通知”日志级别才能看到这些行。

据我所知,没有办法将AOF中的特定条目与RDB的fork操作相关联(即不可能100%准确)。