归档任务
归档任务是指:在不需要服务器继续运行的情况下,将 Minecraft 服务端及其相关的完整文件通过内网传输到 OSS 服务上的过程。归档任务是一个同类互斥任务。
前置要求
- 实例必须处于 Running
- 实例必须已经部署
- 服务器必须离线
模板变量
- OSSRoot:用于进行归档轮转的 OSS 根路径。例如,设置为
oss://seatide时,每一次轮转所操作的目录为oss://seatide/archive、oss://seatide/archive-new和oss://seatide/archive-old。
流程
一个完整的归档流程是对 OSSRoot 对应目录下存在的 archive-old 和 archive 目录的轮转过程。其中,archive 目录用于存放最新的归档内容,archive-old 用于存放上一次归档内容作为冗余。每次部署时拉取的是 archive 目录中的内容。
其具体执行顺序是,先将 ECS 上的数据拷贝到 archive-new 目录中。如果此时 OSSRoot 中没有 archive 目录,就直接将 archive-new 移动到 archive,流程结束;如果有,就将当前 archive 移动到 archive-old(如果原先存在 archive-old,则先将其删除),然后将 archive-new 移动到 archive。
运行时间参考
为了降低归档过程出现差错的情况下导致数据丢失的风险,归档的流程中存在对存档的多次复制操作(ECS -> OSS 或者 OSS 内),这些操作延长了运行的时间。以一个 4.6GB 大小的归档目录为例,其各个阶段的运行时间如下表所示。
| 步 | 步骤名 | 操作 | OSS 内容 Before | OSS 内容 After | 运行时间 | 备注 |
|---|---|---|---|---|---|---|
| 1 | 上传新归档 | ECS archive -> OSS archive-new | archive-old archive | archive-old archive archive-new | 40s | 内网传输 jobs=20 parallel=4 |
| 2 | 删除旧归档 | 删除 OSS archive-old | ↗ | archive archive-new | 35s | 首次、第二次跳过 |
| 3 | 复制原始归档 | OSS archive -> OSS archive-old | ↗ | archive archive-old archive-new | 50s | 首次跳过 |
| 4 | 删除原始归档 | 删除 OSS archive | ↗ | archive-old archive-new | 35s | 首次跳过 |
| 5 | 复制新归档 | OSS archive-new -> OSS archive | ↗ | archive-old archive-new archive | 50s | |
| 6 | 删除新归档 | 删除 OSS archive-new | ↗ | archive-old archive | 35s | |
| 合计 | 245s |
注:
- OSS 不支持移动操作(在本流程中,移动的目的是重命名),因此移动操作需要拆解为复制和删除两步,由于删除也需要时间,一个模拟的移动操作的总耗时可以简单理解为两倍的复制耗时
- 运行时间约至测试实际用时的最近的五的倍数
- 通过运行时 OSS 内容可以知道,此过程所需要的 OSS 容量为归档目录大小的三倍(此例子中,OSS 至少需要有 14GB 的空间以完成此操作),最终占用的空间是归档目录大小的两倍
- 对于首次归档操作,原目录中不存在 archive、archive-old 目录,第 2、3、4 步会被跳过
- 对于第二次归档操作,原目录中不存在 archive-old 目录,第 2 步会被跳过
优化设计
通过分析归档轮转的流程可以发现其具有一定的优化空间:
- 轮转的过程本质上是一系列的重命名操作,而 OSS 不支持移动操作这一点几乎导致了成倍的操作耗时增加。是否有方法绕过这些限制呢?我们认为在当前的 OSS 软件实现上并不可能,但不可否认这是一个方向。
- 冗余的可选性。archive-old 冗余的存在增加了一次归档操作所需要的最少空间大小,在存档数据较大时代价较高,并且也增加了一份与存档大小正相关的总耗时。目前暂不支持指定是否需要冗余。未来的版本中,可以考虑加入此开关。
- 能否提前探测 OSSRoot 下 archive 存在性来提高首次归档的效率呢?对于首次归档,其操作可概括为:上传为 archive-new 后立即移动为 archive。显然这个操作可以继续简化为上传为 archive,从而节省一倍的耗时。