基于块的面向虚拟机镜像的备份和恢复实用工具
项目描述
概述
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
使用像btrfs这样的COW(Copy On Write)文件系统创建足够大的备份分区,并将其挂载到/srv/backy下。
在/etc/backy.conf创建配置文件。请参阅手册页面以获取详细信息。
使用您喜欢的init系统启动调度器
backy -l /var/log/backy.log scheduler -c /path/to/backy.conf
调度器在SIGTERM信号关闭之前在前台运行。
使用backy check设置监控。
设置/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在多驱动器上的好选择。使用deadline或noop。
内核
由于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
在运行时计算父修订版本
删除last和last.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)提供的初始开源导入。