如何大规模备份 Gitlab?

San*_*dra 13 postgresql linux backup zfs gitlab

当询问 Gitlab 支持如何在内部部署的 Gitlab 上进行 3TB 备份时,他们回答使用我们的工具来生成 tarball。

这在所有层面上对我来说都是错误的。这个 tarball 包含 postgres 转储、docker 图像、repo 数据、GIT LFS 等配置等等。将 TB 的静态数据与 KB 非常动态的数据一起备份是不正确的。然后是问题,我们想每小时做一次备份。

题

我真的很想从其他人那里知道他们是如何做到的,以获得一致的备份。

Linux 上的 ZFS 对我来说没问题,如果这是解决方案的一部分。

ETL*_*ETL 14

我会审查您正在备份的内容,并可能使用“多路径”方法。例如,您可以通过在备份服务器上不断运行 Git 拉取来备份 Git 存储库。那只会复制差异,并为您留下所有 Git 存储库的第二个副本。据推测,您可以使用 API 检测新的存储库。

并使用“内置”备份程序来备份问题等。我怀疑 3TB 是否来自这部分,因此您将能够以很少的成本经常进行备份。您还可以设置带有复制的热备份的 PostgreSQL 数据库。

可能您的 3TB 来自 Docker 注册表中的容器映像。你需要备份这些吗?如果是这样,那么可能有更好的方法。

基本上,我会建议真正查看构成备份的内容并备份各个部分的数据。

甚至 GitLab 的备份工具也可以选择包含/排除系统的某些部分,例如 Docker Registry。

  • 这对于 _replication_ 可能没问题,但您不希望备份的完整性依赖于正确的应用程序行为。如果应用程序中存在错误,或者将来配置错误,会发生什么情况?如果您的服务器被恶意用户入侵怎么办?如果您的应用程序能够从备份主机中删除内容,增量远程备份的大部分价值就会丢失。 (2认同)

sho*_*hok 10

对于如此短的备份间隔时间(1 小时),最好的办法是依靠文件系统级快照和 send/recv支持。

如果在您的环境中使用ZoL不是问题,我强烈建议您使用它。ZFS 是一个非常强大的文件系统,您会非常喜欢它提供的所有附加功能(例如:压缩)。与 结合使用时sanoid/syncoid,它可以提供非常强大的备份策略。主要缺点是它不包含在主线内核中,因此您需要单独安装/更新它。

或者,如果您确实需要将自己限制在包含主线的内容中,则可以使用 BTRFS。但一定要了解它的(许多)缺点和皮塔饼。

最后,另一种解决方案是使用lvmthin采取定期备份(如:带snapper),依靠第三方工具(如:bdsync,blocksync等)只复制/船增量。

一种不同的方法是拥有两台复制的机器(通过DRBD),您可以通过lvmthin.

  • @Sandra 从文件系统快照恢复应该在 postgresql(和任何其他正确编写的数据库)看来是一个通用的“主机崩溃”场景,触发它自己的恢复过程(即:将任何部分写入的页面提交到主数据库)。换句话说,拍摄快照时不需要将 postgres 置于只读模式。 (4认同)