📣TiDB Cloud BYOC、TiDB Cloud Filesystem 和 PostgreSQL-compatible TiDB Cloud Starter 全新发布,开放公测中。此页面由 AI 自动翻译,英文原文请见此处。

管理文件系统 layer 和 checkpoint



在 TiDB Cloud Filesystem 中,layer 会将文件更改与基础文件系统隔离,直到你提交这些更改。你可以使用 checkpoint 保留中间状态,并使用派生来独立探索更改。有关底层概念,请参见Layers and Checkpoints。

前提条件

开始之前,请确保:

  • 安装 TiDB Cloud CLI。
  • 拥有一个所有者 Token,或一个在现有目录上具有 read,list,write,delete 权限的范围受限 Token。示例会在该目录下创建并删除一个子目录。
  • 选择文件系统,并使其 Token 可供 ti 使用。有关可用的访问方式,请参见访问现有文件系统。
  • 使用 Bash 或 Zsh,并在整个示例过程中保持使用同一个 shell 会话。

创建 layer

在你的 Token 作用域内选择一个现有目录。使用所有者 Token 时可使用 /,或者将其替换为你的范围受限 Token 允许访问的目录,例如 /workspace。为本示例创建一个唯一的子目录:

parent_path="/" base_path="${parent_path%/}/layer-example-$(date +%s)-$$" ti fs create-directory --path "$base_path"

然后创建一个 layer:

ti fs create-layer \ --base-root-path "$base_path" \ --layer-name agent-task \ --durability-mode restore-safe \ --tag task=review

--base-root-path 用于确定 layer 覆盖基础文件系统的哪一部分。

当前 CLI 仅接受 restore-safe 作为 --durability-mode 的值。有关所有可用选项,请参见 create-layer 命令参考。

保存返回的 layer_id,供后续命令使用:

layer_id="<returned-layer-id>"

请使用 ID,而不是 layer 名称,因为 layer 名称可能不是唯一的。

使用并检查 layer 更改

使用返回的 layer ID 向 layer 写入一个示例文件:

printf 'Layer review proposal\n' | ti fs copy-file \ --from-stdin \ --to-remote "$base_path/proposal.md" \ --layer-id "$layer_id"

检查该 layer 及其更改:

ti fs describe-layer --layer-id "$layer_id" ti fs diff-layer --layer-id "$layer_id"

列出所选文件系统中的所有 layer:

ti fs list-layers --output text

尚未提交的更改会保留在 layer 中。不选择 layer 的文件操作会访问基础文件系统,因此不会显示其中未提交的更改。

只有 copy-file、find-files 和 search-file-content 支持 --layer-id。read-file、list-files、describe-file、delete-file、move-file 和 create-directory 始终作用于基础文件系统。要读取 layer 中文件的内容,请按挂载可写 layer 或验证 checkpoint 的文件内容中的说明进行操作。

挂载可写 layer

要使用本地工具,请先完成 FUSE 前提条件,然后挂载该 layer。WebDAV 不支持 layer 或 checkpoint。

layer_mount="$(mktemp -d "$HOME/ti-fs-layer.XXXXXX")" ti fs mount-file-system \ --mount-path "$layer_mount" \ --remote-path "$base_path" \ --layer-ref "$layer_id" \ --driver fuse cat "$layer_mount/proposal.md"

预期输出:Layer review proposal。要验证隔离,请在不选择 layer 的情况下从基础文件系统读取:

ti fs read-file --path "$base_path/proposal.md"

预期会出现 not-found 错误,因为该 layer 尚未提交。如果该文件在基础文件系统中可见,请先停止操作并检查 layer 选择是否正确,然后再继续。

创建 checkpoint

checkpoint 会保留 layer 持久历史中的某个时间点。

如果该 layer 已有可写的 FUSE 挂载,请在创建 checkpoint 之前停止写入、关闭打开的文件,并对刷写挂载:

ti fs drain-file-system \ --mount-path "$layer_mount"

然后创建 checkpoint:

ti fs create-layer-checkpoint \ --layer-id "$layer_id" \ --checkpoint-id seed \ --label "before review"

要验证 checkpoint 的文件内容,请将其挂载到另一个本地路径:

checkpoint_mount="$(mktemp -d "$HOME/ti-fs-checkpoint.XXXXXX")" ti fs mount-file-system \ --mount-path "$checkpoint_mount" \ --remote-path "$base_path" \ --layer-ref "$layer_id" \ --checkpoint-id seed \ --driver fuse cat "$checkpoint_mount/proposal.md" ti fs unmount-file-system --mount-path "$checkpoint_mount"

预期输出:Layer review proposal。checkpoint 挂载为只读。如果读取时发生假死,请参见挂载故障排查。

派生 layer

如果你希望基于该 checkpoint 继续独立工作,请派生一个新的可写 layer。否则,请跳转到提交或丢弃 layer 更改。

ti fs fork-layer \ --parent-layer-ref "$layer_id" \ --layer-name experiment \ --checkpoint-id seed

单独保存派生后返回的 layer_id:

forked_layer_id="<returned-forked-layer-id>"

要检查该派生 layer 固定的祖先链:

ti fs list-layer-chain --layer-ref "$forked_layer_id"

创建派生后,对父 layer 和子 layer 所做的更改彼此独立。

提交或丢弃 layer 更改

如果该 layer 具有可写的 FUSE 挂载点,请先停止写入方、关闭已打开的文件,并在选择后续操作前将其卸载:

ti fs unmount-file-system \ --mount-path "$layer_mount"

优雅的卸载会自动刷写待处理的写入。

选择以下其中一种结果:commit 会将更改应用到基础文件系统;rollback 会丢弃这些更改。要提交,请执行:

ti fs commit-layer --layer-id "$layer_id"

提交成功后,通过基础文件系统验证内容:

ti fs read-file --path "$base_path/proposal.md"

预期输出:Layer review proposal。

提交会将该 layer 的有效更改应用到基础文件系统。如果该 layer 是通过派生另一个 layer 创建的,提交它不会将更改合并回其父 layer。

如果基础文件系统中存在冲突更改,提交可能会失败,而不是自动合并这些更改。在决定如何继续之前,请保留该 layer,并检查其更改以及基础文件系统。

如果你选择丢弃更改,请执行以下命令,而不是提交:

ti fs rollback-layer --layer-id "$layer_id"

回滚会丢弃当前 layer 的更改。它不会将该 layer 重置到更早的 checkpoint。若要从某个 checkpoint 继续,请从该 checkpoint 派生一个新的 layer。

删除 layer

如果你创建了一个派生 layer,请先删除它,再删除其父 layer:

ti fs delete-layer --layer-ref "$forked_layer_id"

然后删除父 layer:

ti fs delete-layer --layer-ref "$layer_id"

删除 layer 会放弃该 layer,但不会立即擦除其全部历史记录。如果该 layer 仍有活动的子孙 layer,默认情况下该命令会失败。

或者,如果要同时放弃某个 layer 及其所有活动的子孙 layer,请使用 --cascade:

ti fs delete-layer \ --layer-ref "$layer_id" \ --cascade

仅当你也打算放弃这些子孙 layer 时,才使用 --cascade。

在卸载示例挂载点并删除示例 layer 后,删除基础目录:

ti fs delete-file --path "${base_path:?Set the example directory first}" --recursive ti fs describe-file --path "$base_path"

预期 describe-file 会返回 not-found 错误。成功卸载后,使用 rmdir "$layer_mount" 和 rmdir "$checkpoint_mount" 删除你创建的本地目录。删除示例文件不会立即擦除已放弃 layer 的历史记录。

接下来做什么

文档内容是否有帮助?