从 LVM 快照进行备份时,有没有办法保证跨卷的一致性?考虑以下场景:
- 正在进行某些系统升级。它将向
/usr
卷写入一些文件,一旦完成,将在/var
卷中记录成功。 - 升级即将完成时,我运行了一个备份脚本,该脚本创建了
/usr
和/var
卷以及系统其余卷的快照,然后继续从这些快照创建备份。 - 在升级对卷的最后一次写入/刷新
/usr
完成之前,备份脚本会拍摄其快照/usr
。 - 写入完成,升级操作的成功很快被记录在模糊的深处
/var
。 - 备份脚本对 进行快照
/var
。 - 备份脚本根据其已创建的快照创建备份。
因此,所有这些愚蠢行为的结果是,最终的/usr
备份包含一个缺少一些位的文件,并且/var
备份包含表明该文件完整且已批准使用的元数据。
如果不深入研究哪些操作系统的系统升级系统不会因为这些小事而感到困扰,有没有办法避免这样的问题?至少这似乎可能会导致某些应用程序在恢复此类备份后意外失败。
答案1
问题甚至比这更普遍一些。即使一个卷获取了快照,也无法保证该卷上的数据在文件级别有意义。LVM 快照仅确保块级一致性。
100% 确保文件处于一致状态的唯一方法是让应用程序将所有内容刷新到磁盘并在创建快照时暂停写入。如果你真的关心这一点,并且您的应用程序支持它,您应该将其编写到您的备份过程中。
对于您的特定用例,为什么不确保在执行升级时备份不会运行呢?要么在这段时间内禁用它,要么将其延迟到升级完成。至少可以保留正在升级的文件的一致性。