我每隔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文件具有最新信息的点。
谢谢!
答案 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%准确)。