![虚拟机和备份](https://linux22.com/image/756778/%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%92%8C%E5%A4%87%E4%BB%BD.png)
我有一台虚拟机 (centos),运行一些用于小文件的文件服务。推荐的备份方式是什么?我应该备份虚拟机磁盘/文件(从虚拟机外部)还是应该在虚拟机内部运行备份代理,这样我就可以备份内容而不是整个虚拟磁盘?
答案1
TLDR:在虚拟机内安装备份代理。
从虚拟机外部备份磁盘映像确实看起来很诱人,不是吗?特别是如果您有多个虚拟机,那么您只需告诉主机备份所有磁盘映像即可,而无需单独配置每个虚拟机进行备份。
但这种方法的问题在于,主机不知道虚拟机操作系统内部正在做什么。它不知道是否有任何磁盘写入待处理或正在进行。它不知道虚拟机进程内部的任何写入缓存或输出缓冲区。因此,它无法保证它备份的磁盘映像将是持续的备份时的图像。备份的图像文件几乎肯定仍然可以使用,但很有可能您需要先对其进行文件系统修复以清理所有内容。
从外部执行全磁盘映像备份的另一个主要缺点是,这种备份主要用于全系统恢复。如果您只需要恢复一个丢失文件的上周四版本,它们在这方面就不太适用了 - 您需要从周四的备份中恢复整个映像,然后使用其他工具从映像的第二个副本中提取该文件,这将比您在虚拟机内部进行备份并仅恢复一个感兴趣的文件花费更多的时间和空间。
与此相关的是,完整映像备份更难(在最好的情况下)以增量方式执行,这意味着每次运行备份时,您都需要完整复制整个映像。使用虚拟机内部的基于内容的备份,您可以定期进行完整备份,并且只备份其间更改的文件,从而允许使用相同数量的存储空间进行更频繁的备份。
如果您要制作整个虚拟机的映像以用于灾难恢复,或将其用作克隆主程序以创建其他虚拟机,则关闭虚拟机并复制完整磁盘映像是一种不错的方法。但对于正在运行的系统进行例行备份,这并不是一个好方法。
答案2
TL;DR 从虚拟机外部创建快照
我见过的所有 VM 主机软件(包括云服务和容器主机)都具有快照功能。这是备份正在运行的系统的首选方法,因为快照保证在某一时间点对整个磁盘进行一致且原子性的复制。VM 主机软件通常具有客户操作系统工具,可在快照之前使文件系统处于静止状态,但最好在写入不多的时候(例如晚上)进行快照。大多数系统在保存快照状态时会短暂暂停。
快照通常也是增量的。还有高级快照功能,例如重复数据删除。
如果系统关闭(未暂停或挂起),您可以仅复制 VM 文件,因为您知道不能有任何写入,并且所有数据都必须已写入磁盘。
如果您需要恢复单个文件,您只需恢复磁盘,并将其连接并安装到另一个系统即可。
如果对文件系统中的文件运行备份,则会出现以下几个问题:
文件可能不一致,因为写入操作可能在备份期间发生,因为它不是原子性的。例如,Tar 会警告您,在备份文件时有人对其进行了写入。再举一个例子,我永远不会信任已备份文件的数据库副本。数据库系统可能能够从不一致中恢复,但您想冒这个险吗?您最好使用相关系统工具进行单独的异地数据库备份。
另一个问题是,仅从文件创建可启动系统会很困难。要创建可启动系统,还需要引导扇区和分区表等其他东西。这意味着需要额外的恢复步骤来安装完全一样操作系统。即便如此,我还是极度怀疑是否信任它,即使它能启动。