跳转到主要内容

基于块的面向虚拟机镜像的备份和恢复实用工具

项目描述

概述

Backy是一个面向虚拟机镜像的基于块的备份和恢复实用工具。

Backy旨在是

  • 节省空间、时间和网络效率

  • 恢复简单

  • 可靠。

为了实现这一点,我们依赖于

  • 节省空间的存储(CoW 文件系统,内容哈希分块)

  • 使用具有快照功能的源(即Ceph RBD)来存储我们的卷,这允许轻松提取快照之间的更改,

  • 利用经过验证的现有低级工具,

  • 保持代码库小、简单和经过充分测试。

我们还为实施制定了几个基本规则

  • VM数据在文件系统中自包含,并且可以使用像复制、rsync等常规FS工具在服务器之间移动。

  • 与backy交互无需第三方守护进程:无需数据库服务器。调度守护进程只负责调度,并简单地调用常规CLI命令进行备份。Backy可以与Ceph或Consul等外部守护进程交互,具体取决于源存储实现。

操作

完整恢复

检查要恢复的版本

$ backy -b /srv/backy/<vm> status

可能需要设置Ceph环境 - 根据您的配置

$ export CEPH_ARGS="--id $HOSTNAME"

通过管道恢复完整镜像

$ backy restore -r <revision> - | rbd import - <pool>/<rootimage>

设置backy

  1. 使用像btrfs这样的COW(Copy On Write)文件系统创建足够大的备份分区,并将其挂载到/srv/backy下。

  2. /etc/backy.conf创建配置文件。请参阅手册页面以获取详细信息。

  3. 使用您喜欢的init系统启动调度器

    backy -l /var/log/backy.log scheduler -c /path/to/backy.conf

    调度器在SIGTERM信号关闭之前在前台运行。

  4. 使用backy check设置监控。

  5. 设置/var/log/backy.conf/srv/backy/*/backy.log的日志轮转。

上述文件路径与内置默认值匹配,但路径可以完全配置。

功能

telnet壳

通过telnet连接到localhost的6023端口以获取交互式控制台。控制台目前可以用来检查调度器的实时状态。

自我检查

Backy包含一个自我检查功能。调用backy check以查看是否为所有配置的备份作业存在最近的版本。

$ backy check
OK: 9 jobs within SLA

输出和退出代码都适合用于与Nagios兼容的监控系统处理。

可插拔备份源

Backy附带一些插件,它们定义了类似块文件的数据源。

  • file从常规文件系统上的简单镜像文件中提取数据。

  • ceph-rbd使用Ceph功能(如快照)从RBD镜像中拉取数据。

  • flyingcircus是对ceph-rbd源的一个扩展,我们在Flying Circus托管平台上使用。它使用像Consul集成这样的高级功能。

应该很容易为其他源编写插件。

自适应验证

Backy总是验证新创建的备份。验证范围取决于源类型:基于文件的源将完全验证。基于Ceph的源基于随机样本进行验证,出于运行时原因。

零配置调度

Backy调度器旨在持续运行。它将根据配置的运行间隔在一天内分散任务。在从中断恢复后,它将重新安排遗漏的任务,以便如果可能,仍保持SLA(服务级别协议)。

备份作业也可以在特定时间触发:只需手动调用backy backup

性能

Backy旨在通过并行运行多个实例来使用所有可用的存储和网络带宽。备份存储必须为这种类型的(混合)负载做好准备。由于硬件和负载配置文件在不同地点有所不同,因此找到最佳设置需要一些实验。以下部分包含一些起始点。

存储后端

如果备份存储是RAID数组,其条带大小应与文件系统对齐。我们256k条带有很好的经验。还要检查硬盘上的512B/4K块错位。我们通常使用RAID-6,并且在使用硬件和软件RAID时都看到了合理的表现。

文件系统

我们通常推荐XFS,因为它提供了高度的并行性,并且能够很好地处理非常大的目录。

请注意,标准的cfq I/O调度器不是高度并行的大块I/O在多驱动器上的好选择。使用deadlinenoop

内核

由于backy执行大量元数据操作,请确保inode和dentry不会过早地从VFS缓存中移除。我们发现降低vm.vfs_cache_pressure sysctl可以显著提高总备份性能。我们目前将其设置为10。您还可能希望增加vm.min_free_kbytes以避免在10 GbE网络接口上出现页面分配错误。

开发

Backy已切换到使用poetry管理其依赖项。这意味着您可以使用poetry install从PyPI安装依赖项。

如果在开发过程中您的PATH中没有backy,请使用poetry shell进入poetry虚拟环境,或者如果您正在使用nix,请使用nix develop

您可以使用poetry build构建backy,在dist目录中创建一个wheel和一个tar存档,或者运行nix build

作者

许可证

GPLv3

更改日志

未发布

请参阅changelog.d目录中的片段文件。

2.5.1 (2023-10-12)

  • 修复telnet jobs命令

2.5.0 (2023-10-11)

  • 将池分为快速和慢速。根据我们的统计数据,90%的工作在10分钟内完成,之后可能会运行数小时。我们现在在快速和慢速池中同时运行配置的工作者数量,以便长作业可以延迟其他长作业,但快速作业应该能够快速通过。

  • 移植到Python 3.10+。

  • 即使某些快照受到保护,也继续删除快照。

  • 改进对‘整个对象’RBD导出的检测:我们未能检测到Ceph使用错误的版本选项构建并显示为‘开发’而不是真实版本。

  • 不要将正在运行的作业计为过期。

  • 定期记录过期作业。

  • 从以前的计划中删除标签

  • 添加 forget 子命令

  • 添加对Ceph Nautilus中更改的rbd showmapped输出格式的兼容性。Ceph Jewel和Luminous集群仍然受到支持。

  • 使用structlog进行日志记录

  • 使用mypy进行静态类型检查

  • backy check中列出所有手动标签

  • 修复非数字Ceph版本字符串的崩溃

  • 修复在distrust时缺失的锁

  • 使用scriv进行更改日志管理

  • 在守护进程重新加载时恢复缺失条目的默认值

  • 在重新加载时配置无效配置时崩溃

  • 移除find子命令和nbd-server

  • 在运行时计算父修订版本

  • 删除lastlast.rev符号链接

  • 在验证失败时对修订版本进行怀疑

  • 隔离源和后端之间的差异

  • 修复在生成状态文件时重新加载时的竞争条件

  • 添加nix flake支持

  • 在备份完成时调用配置的脚本

2.4.3 (2019-04-17)

  • 当源丢失时避免多余的工作,特别是避免不必要的Ceph/KVM交互。(#27020)

2.4.2 (2019-04-17)

  • 优化处理离线/删除挂起的虚拟机:不仅仅是超时。创建快照并进行备份(只要图像存在)。(#22345)

  • 关于性能影响的文档更新。

  • 清理构建系统仪表板,以使我们的Jenkins再次运行。

2.4.1 (2018-12-06)

  • 优化:将‘unlink’调用捆绑起来,以改善VFS元数据的缓存局部性

  • 优化:在启动时加载所有已知的块,以避免进一步的随机IO和大型元数据解析,这也加快了清除速度。

  • 通过明确指出我们不希望再次读取的数据来减少OS VFS缓存的破坏。

2.4 (2018-11-30)

  • 添加对Ceph Jewel的–whole-object diff导出的支持。(#24636)

  • 改进旧快照请求的垃圾收集。(#100024)

  • 切换到新的分块存储格式:删除一层目录以大幅减少随机IO。

  • 优化每块写入操作中的潜在可寻址IOPS的顺序。不要懒惰地创建目录。

  • 需要Python 3.6。

2.3 (2018-05-16)

  • 添加对处理不一致性的主要操作支持。

  • 操作员可以将修订版标记为“不受信任”,可以是备份中的全部,也可以是单个修订版或时间范围。

  • 如果最新修订版不受信任,则我们始终执行完整备份,而不是差异备份。

  • 如果任何修订版不受信任,则每个块都将写入,即使它存在(备份期间一次,备份内相同的块在写入后将受信任)。

  • 实施一个显式的验证程序,该程序将在备份后自动触发,并验证不受信任的修订版,要么删除它们,要么将它们标记为已验证。

  • 安全带:在读取块时始终验证内容哈希。

  • 改进状态报告日志。

2.2 (2017-08-28)

  • 引入一种新的后端存储机制,独立于BTRFS:而不是使用COW,使用包含4MiB内容哈希块的目录。基于4MiB块自动进行去重。

  • 使fadvise功能的利用更加机会主义:如果后端不支持,不要失败,因为它们只是优化。

  • 在备份失败后引入指数退避:不是快速重试,从而占用队列(如果涉及超时),我们现在从2分钟开始指数退避,然后是4分钟,然后是8分钟,……直到达到最大的退避时间6小时。

    您仍然可以使用telnet的“run”命令触发受影响备份的显式运行。这将立即将备份放入运行队列,但不会重置错误计数器或退避间隔,以防它再次失败。

  • 恢复性能改进:不要读取恢复目标。在这种情况下,我们不需要优化CoW。(#28268)

2.1.5 (2016-07-01)

  • 错误修复版本:修复新完整-总是模式中的数据损坏错误。(FC #21963)

2.1.4 (2016-06-20)

  • 将“完整-总是”标志添加到Ceph和Flyingcircus源。(FC #21960)

  • 重写完整备份代码以利用浅复制以节省磁盘空间。(FC #21960)

2.1.3 (2016-06-09)

  • 将默认的超时时间设置为5分钟,而不是5天。

  • 不再对块进行排序:我们不会在具有随机块的卷上获得太多从寻址中获得的收益,这有助于新的超时在多次运行中获得更均匀的分布。

2.1.2 (2016-06-09)

  • 修复包含孔洞的图像的备份。(#33)

  • 引入部分图像验证的超时时间。特别是非常大的图像和经常备份的图像,运行数小时以验证它们不会带来好处,这会阻止进一步的备份。(FC #21879)

2.1.1 (2016-01-15)

  • 修复日志错误。

  • 在接收到信号时干净地关闭守护程序循环。

2.1 (2016-01-08)

  • 将可选的正则表达式过滤器添加到telnet外壳中的《jobs》命令。

  • 在检查输出中提供失败作业的列表,而不仅仅是总数。

  • 添加《status-interval》、《telnet-addrs》和《telnet-port》配置选项。

  • 自动从丢失/损坏的最后一个或最后一个.rev符号链接中恢复。(#19532)

  • 将《{BASE_DIR}/.lock》用作守护程序锁文件,而不是状态文件。

  • 可用性改进:计数作业,更丰富的日志输出。

  • 支持将块特殊文件(如LVM卷)恢复到。(#31)

2.0 (2015-11-06)

  • backy现在接受一个《-l》选项来指定日志文件。如果没有提供此类选项,它将记录到stdout。

  • 添加《backy find -r REVISION》子命令,以便从shell脚本中查询图像路径。

  • 修复监控错误,其中部分写入的图像使检查变为绿色。(#30)

  • 大大改进错误处理和失败作业的检测。

  • 性能改进:在批量文件操作中关闭行缓冲。(#20)

  • 调度程序现在在主日志中报告子进程失败(退出状态> 0)。

  • 修复32位系统上的fallocate()行为。

  • 《flyingcircus》源类型现在需要3个参数:vm,pool,image。

2.0b3(2015-10-02)

  • 改进telnet控制台。

  • 提供Nix构建脚本。

  • 从buildout的《versions.cfg》自动生成《requirements.txt》。

2.0b2 (2015-09-15)

  • 引入调度器并重构主备份命令。现在的backy命令只负责处理单个备份。

    它不再关心调度。

    现在由一个新的守护进程和中心配置文件负责。然而,它只是调用现有的backy命令,因此即使在没有使用守护进程的情况下,我们也可以手动与系统交互。

  • 添加了consul集成,用于使用干净快照备份Flying Circus根磁盘镜像(通过让fc.qemu在准备Ceph快照之前使用fs-freeze)。

  • 切换到更短的UUID。带有旧UUID的现有文件是兼容的。

  • 将配置格式转换为YAML。旧文件仍然是兼容的。新配置将生成为YAML。

  • 性能:自动碎片整理所有新文件以避免btrfs降低扩展性能。这似乎并不完全复制所有CoW数据。未来将需要监控这一点。

2.0b1 (2014-07-07)

  • 清理文档。

  • 在setup.py中添加分类器。

  • 基本上完全重写,目标是使用写时复制文件系统。

  • 使用自由标签的灵活备份调度。

  • 兼容Python 3.2-3.4。

  • 由Daniel Kraft(D9T)提供的初始开源导入。

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

backy-2.5.1.tar.gz (108.1 kB 查看散列)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面