Skip to content

共享存储卷与备份

存储卷是云盘底层的磁盘。共享存储卷是同一台机器上的多个沙箱同时挂载的文件系统;备份把存储卷复制到对象存储中,可以从备份创建新的存储卷。

更新于

存储卷是 API 中云盘底层的磁盘 (/v1/volumes):云盘也是存储卷,它的 id 是 vol-…。只有存储卷才提供的是共享存储卷:一个可由多个沙箱同时挂载的文件系统,每个沙箱可以设为能写或不能写。

共享存储卷

glac volumes create --name team --shared
glac volumes attach team web:/team
glac volumes attach team worker:/team --read-only
glac volumes detach team worker

用 API:POST /v1/volumes 带上 {"name": "team", "shared": true},创建或修改沙箱时带上 volumes: [{path, volume, read_only}]。用 Python:glac.volumes.create(name="team", shared=True) 和 VolumeMount("/team", vol)。

  • 机器通过 NFS 把共享存储卷提供给挂载它的沙箱。这些沙箱必须和存储卷在同一台机器上 (409 not_on_one_machine),还没有沙箱用过的存储卷除外:它会在所在区域内迁到第一个挂载它的沙箱所在的机器上。不提供共享存储卷的机器返回 503 not_served_here。
  • 不设置 size_bytes 时,存储卷最大可增长到 64 GiB;你的套餐允许的上限更小时,以套餐为准。它占用的空间是写入的数据量,而不是它的大小。
  • 卸载沙箱中有进程正在使用的存储卷会被拒绝 (409 mount_in_use),除非加上 ?force=true。已挂载的存储卷,或已用于创建快照的存储卷,不能删除 (409 volume_in_use)。
  • 存储卷与云盘一起计入项目能保有的数量,其中保存的数据也和云盘的数据一样计费:参见云盘的工作方式。

需要只由一个沙箱持有、能在机器之间迁移的磁盘时,请用云盘。

备份

备份是存储卷(云盘也可以)在某一时刻的副本,保存在对象存储中,用项目的密钥加密。它不是云盘的快照,快照是云盘的一个版本;而备份是一份独立的副本,仅凭它就能创建存储卷,而且不随存储卷消失。存储卷的备份是增量的:每个备份只发送和保存自上一个备份以来变化的数据块,其余部分指向上一个备份。它会一直留在项目的列表中,直到过期或被删除;无论存储卷后来怎样,都可以从它创建新的存储卷。备份可以由调用创建,可以按存储卷的规则每天创建,也会在保存数据的服务的新版本替换其实例之前创建(它的 reason:manual、daily、before_version)。

glac backups create data --expires-in-days 7    # prints the backup's id
glac backups ls --volume data
glac backups restore bak-0123456789abcdef --name data-back
调用 作用
POST /v1/volumes/{id}/backups 立即创建一个备份 (glac backups create),保留 expires_in_days 天(1 到 365;默认 30,存储卷的规则另有规定时除外)。如果有运行中的沙箱持有这个存储卷,复制时会冻结它的文件系统,只需几毫秒(consistency,见下文)。
GET /v1/volumes/{id}/backups, GET /v1/backups 一个存储卷的备份(存储卷删除后也可以按它的 id 查询);项目的所有备份 (glac backups ls)。最新的在前。
GET, DELETE /v1/backups/{id} 查看一个备份 (glac backups get);删除它 (glac backups rm):之后不再为它计费,从它创建的存储卷仍然保留。
PATCH /v1/volumes/{id} 带上 {"backups": {"daily", "keep", "expires_in_days"}} 存储卷的规则:每天一个备份、保留多少个每日备份(1 到 90,默认 7)、由调用创建的备份保留多久。
POST /v1/volumes 带上 {"from_backup": "bak-…"} 从一个就绪的备份创建新存储卷(glac backups restore 或 glac volumes create --from-backup),位于备份所在的区域,大小和类型与备份所来自的存储卷相同。

备份在对象存储收到全部数据之前为 making,之后为 ready;无法创建的备份为 failed(failure 说明原因)。只能从就绪的备份创建存储卷(创建期间返回 409 backup_not_ready,失败后返回 409 backup_unusable)。它的 consistency 说明它是如何创建的:frozen(复制时文件系统静止)或 crash(相当于断电那一刻的磁盘)。只有会把磁盘复制到对象存储的机器才创建备份;在其他机器上,调用返回 409 not_copied。

从备份创建的存储卷会注明来源备份 (from_backup),在整个备份恢复完之前为 restoring,之后为 ready;在此之前不能挂载。如果备份所在区域的某台机器不能立即创建它(磁盘已满、账户在上面已没有空间、无法访问),就跳过它,换下一台会复制到对象存储的机器;存储卷的 placement_refusals 按询问的顺序列出拒绝过的机器,以及各自拒绝时的错误码(第一台询问的机器就创建成功时为 null)。所有机器都拒绝时,调用返回 503 no_capacity,附带同样的列表。如果被分配到的机器无法恢复它,控制平面会以同一个 id 在备份所在区域的另一台机器上再创建一次:这时它的 restore_attempt 为 2,first_failure 说明第一次为什么失败。如果第二次也失败,存储卷将永久处于 failed,只能删除。

SDK、命令行和 MCP 服务器都有这些调用:参见 Python、TypeScript、Go、Rust、Java、命令行和 MCP 服务器。

费用。存储卷的多个备份都需要的数据块只保存一份,也只计费一次,计在其中最早的备份上;那个备份删除后,计在下一个上。所以备份的 stored_bytes 就是它的计费依据:对象存储为它保存的、它需要而该存储卷更早的备份都不需要的字节(压缩后)。它的 own_bytes 是删除它能省下的量,即该存储卷的其他备份都不需要的数据,shared_bytes 是它和其他备份都需要的数据。备份从就绪起计费,直到被删除或过期,价格与休眠沙箱保存的内容相同(每 GB·月 $0.02),每分钟记账一次。仍在创建或已失败的备份不收费。GET /v1/billing 会说明该计量项中有多少来自备份(backups_gb_hours,在 state 那一行中),GET /v1/usage 可以报告任意时间范围内的备份用量:kind=backup (glac usage --kind backup)、group_by=backup(每个备份按 backup_id 单独成组)和 backup_id=bak-…(单个备份,无论它的存储卷后来怎样)。备份保存的数据不会因支出上限或余额为零而停止:它会一直计量,直到备份过期或被删除。欠费的账户仍然可以列出备份,并从备份创建存储卷,以取回数据;但不能创建新备份。

导航

输入以搜索……

↑↓ 切换↵ 选择Esc 关闭