如何备份正在运行的 Linode 服务器?

如何备份正在运行的 Linode 服务器?

我们希望在不关闭 Debian 服务器的情况下备份该服务器上的所有内容,该服务器在世界另一端远程运行(由 Linode 托管)。

该系统运行 shell、电子邮件、XMPP/prosody 和 web,并带有一些简单的 nginx 设置。
为了安全起见,我们希望备份与这些内容相关的文件。例如,用户存储在主目录中的文件。

我们不需要精确复制每个 /etc 文件的现有设置;相反,我们首先进行备份的原因是为了可以将其全部移动到新设置(Linode 上仍然有较新版本的 Debian)。

我看到 Linode 提供备份服务。但从长远来看,我们还需要自己的备份,以防它们出现故障或发生其他奇怪的事情。

存在这个问题的原因是,当我过去尝试进行备份时,我一直犯以下两个错误之一:

  • 我说过“好的,我将复制/其下的所有内容”,然后陷入了一些奇怪的无限循环,要么是因为我复制到的驱动器安装在 /media/backup 下,并且它正在递归地复制自身 [obv 该特定问题不适用于此处,因为我们将通过 rsync 或类似方式备份],要么是它在尝试复制 /proc 或 /var 或其他地方的一些“活动”内容时卡住了,例如试图跟上不断变化的日志,或者
  • 我说过“好的,我只需要获取我们所需的最少内容...嗯,每个人的主目录和我们的 Web 服务器目录(都在下/var),然后让我们获取/etc/var/vmail 下的所有旧邮件的副本”,然后我总是搞砸文件权限或时间戳(这次要确保不将 unix 文件备份到 FAT 驱动器)或忘记了某些东西(“哦,该死,我在 /usr/local/bin 中有一些自定义脚本,我从未将它们存储在其他任何地方,我忘了获取它们,猜想它们现在不见了”)。

因此,显然直接复制整个驱动器会导致陷阱,选择性复制目录也会导致陷阱。我想知道如何正确执行。

服务器故障问题完整的备份系统需要什么?涵盖哲学和良好实践,但我正在寻找以下更具体的细节:

  • 我需要复制哪些目录以及需要排除哪些目录(假设它是一个当前正在运行的系统,并且提供 wiki、XMPP 聊天、电子邮件服务 — 在复制作业运行时会有新消息传入)
  • 我需要提供哪些文件属性,例如时间戳、所有者和组,以及如何提供这些属性?← 我认为我可以自己回答这个问题的一半,例如……嗯……rsync -HXaz我认为对我们来说是个不错的选择?-z显然这与“我要保留什么”这个问题无关

我看到的很多备份建议,比如使用dd,似乎都假设驱动器已卸载且未使用。但我不应该排除“活动”目录,如 /proc 和 /var 下的一些子目录(不过,我知道 /var 下的一些内容我们肯定需要保留)和 /mount?在这种情况下,我还需要考虑什么?那么我想我可以用 rsync 和一堆--exclude标志来捕获它。

或者有更好的想法,特别是 FOSS 友好的想法?

答案1

所以,您想备份所有驱动器而避免所有那些令人讨厌的错误,并过滤掉所有 /proc 和其他临时文件夹?

一种选择是将根文件夹挂载到文件系统中的另一个文件夹中,如下所示:

$ cd /mnt
$ mkdir drive
$ mount --bind / drive

这将为您提供驱动器上所有不被视为临时的文件(例如 /proc 或 /sys 文件夹)。

现在,您可以清楚地看到根文件夹,您可以使用标准cp或将其复制到备份驱动器rsync。类似这样的操作:

cp -R /mnt/drive /mnt/backupdrive

这解决了您提到的两个问题:

  • 您不会陷入递归,因为备份磁盘未安装在驱动器内(观点)
  • 你不会错过任何重要的文件,因为你正在带走它们

也可以看看:人挂载(8)

答案2

在 Linux 中,一切都是文件。通过 rsync 可以实现,但需要注意的是,有些事情(在最好的情况下)很难解决。

您应该首先考虑复制,尤其是数据库。在主服务器前面设置代理/负载平衡器也是一个好主意,这样您就可以在过渡期间轻松地在主服务器和镜像服务器之间来回切换。

在硬件层面,最好的情况是在另一侧有镜像服务器,具有相同数量的以太网端口、相同的硬盘布局等等。任何不同之处都意味着需要更改系统配置。

即如果您有两个 eth 端口,您要确保网络配置、防火墙等与两个服务器上的接口名称匹配,如果不同,您要么需要在 rsync 后更改配置,要么更改第二台(目标)服务器上的设备名称。

分区布局相同。您应该创建与主服务器相同的分区,但如果从头开始创建,最终会得到不同的 UUID,因此您需要更改 fstab、grub、mdadm(如果涉及软 raid)等等。

但是,也有很多事情可能出错,例如数据库,如果之前没有停止(在执行 rsync 之前),它可能会不一致。

最好的策略是首先准备硬件和文件系统(分区) - 以匹配主服务器的配置。然后通过中间系统(如临时安装了 ssh-server 的 live CD)安装空分区。创建空的 /proc、/dev、/sys,然后 rsync 其余部分,如下所示:

rsync -avz -H --delete /etc /bin (...and so on) destserver:/mnt/yourrootfs/

然后,您需要在设备上安装 grub 并进行配置,使其可启动,更改网络配置、fstab 和前面提到的其他内容。

您也可以尝试安装新系统(与您在主服务器上使用的版本相同),然后关闭它,通过另一个临时系统(如 live cd)安装它,然后用 rsync 替换 /proc、/sys、/dev 和 /boot 之外的所有内容。

但这只是一般的想法。事情可能会变得复杂,具体取决于您在这台服务器上实际拥有什么、您的配置、网络和硬件设置是什么。最终,如果不出现明显的停机时间,这可能真的很难或不可能做到。

答案3

您真正想要的是恢复。无论您做什么,都必须定期进行恢复测试。


Linode 有备份服务。可以按照有限的预定义时间表或使用 API 来获取快照。

基于快照的备份的一个优点是它们提供准确的时间点,因为在复制时数据不会发生变化。快照还可以轻松恢复到其他主机,在本例中是新的 Linode。

答案4

在 ZFS 上运行您的系统。然后,您可以使用类似以下方式获取即时原子快照:

# zfs snap -r tank@name-of-backup

其中tank是您的 ZFS 池的名称。此快照保证是文件系统及其所有子文件系统的即时快照。

创建快照后,您可以使用zfs send和将其传输到另一台主机ssh

相关内容