跳到主要内容

归档任务

归档任务是指:在不需要服务器继续运行的情况下,将 Minecraft 服务端及其相关的完整文件通过内网传输到 OSS 服务上的过程。归档任务是一个同类互斥任务。

前置要求

  • 实例必须处于 Running
  • 实例必须已经部署
  • 服务器必须离线

模板变量

  • OSSRoot:用于进行归档轮转的 OSS 根路径。例如,设置为 oss://seatide 时,每一次轮转所操作的目录为 oss://seatide/archiveoss://seatide/archive-newoss://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 内容 BeforeOSS 内容 After运行时间备注
1上传新归档ECS archive -> OSS archive-newarchive-old
archive
archive-old
archive
archive-new
40s内网传输
jobs=20
parallel=4
2删除旧归档删除 OSS archive-oldarchive
archive-new
35s首次、第二次跳过
3复制原始归档OSS archive -> OSS archive-oldarchive
archive-old
archive-new
50s首次跳过
4删除原始归档删除 OSS archivearchive-old
archive-new
35s首次跳过
5复制新归档OSS archive-new -> OSS archivearchive-old
archive-new
archive
50s
6删除新归档删除 OSS archive-newarchive-old
archive
35s
合计245s

注:

  1. OSS 不支持移动操作(在本流程中,移动的目的是重命名),因此移动操作需要拆解为复制和删除两步,由于删除也需要时间,一个模拟的移动操作的总耗时可以简单理解为两倍的复制耗时
  2. 运行时间约至测试实际用时的最近的五的倍数
  3. 通过运行时 OSS 内容可以知道,此过程所需要的 OSS 容量为归档目录大小的三倍(此例子中,OSS 至少需要有 14GB 的空间以完成此操作),最终占用的空间是归档目录大小的两倍
  4. 对于首次归档操作,原目录中不存在 archive、archive-old 目录,第 2、3、4 步会被跳过
  5. 对于第二次归档操作,原目录中不存在 archive-old 目录,第 2 步会被跳过

优化设计

通过分析归档轮转的流程可以发现其具有一定的优化空间:

  1. 轮转的过程本质上是一系列的重命名操作,而 OSS 不支持移动操作这一点几乎导致了成倍的操作耗时增加。是否有方法绕过这些限制呢?我们认为在当前的 OSS 软件实现上并不可能,但不可否认这是一个方向。
  2. 冗余的可选性。archive-old 冗余的存在增加了一次归档操作所需要的最少空间大小,在存档数据较大时代价较高,并且也增加了一份与存档大小正相关的总耗时。目前暂不支持指定是否需要冗余。未来的版本中,可以考虑加入此开关。
  3. 能否提前探测 OSSRoot 下 archive 存在性来提高首次归档的效率呢?对于首次归档,其操作可概括为:上传为 archive-new 后立即移动为 archive。显然这个操作可以继续简化为上传为 archive,从而节省一倍的耗时。