从 Cloud Storage 镜像

Cloud Storage 镜像提供自动化的事件驱动型同步服务,可将文件从 Cloud Storage 存储桶持续镜像到 Managed Lustre 目录。仅支持单向镜像,即从 Cloud Storage 到 Managed Lustre。

Cloud Storage 镜像仅可应要求提供。如要表示您的兴趣,请提交 Cloud Storage 镜像请求表单。

如需有关活跃 Cloud Storage 镜像的支持,请联系 google-cloud-managed-lustre-support@google.com。

Cloud Storage 镜像与按需数据传输的比较

Managed Lustre 支持两种通过 Cloud Storage 移动数据的机制:

功能 Cloud Storage 镜像 按需数据传输
方向 Cloud Storage 到 Managed Lustre Cloud Storage 到 Managed Lustre

Managed Lustre 到 Cloud Storage
触发器 事件驱动;在对象创建、更新和删除时自动同步 手动
分层命名空间 不支持 支持并推荐使用,可加快传输速度
Rapid Storage 存储桶 不支持 不支持

如需了解按需转移,请参阅将数据转移到 Cloud Storage 或从 Cloud Storage 转移数据。

Cloud Storage 镜像的工作原理

Cloud Storage 镜像会在 Cloud Storage 来源和目标 Managed Lustre 目录之间执行事件驱动型转移作业。Cloud Storage 来源可以是存储桶,也可以是存储桶中的特定对象前缀。镜像分两个阶段执行:创建镜像时的初始同步,以及后续更改的持续复制。

初始同步

创建 Cloud Storage 镜像时,该服务会执行初始同步,将所有现有对象从源 Cloud Storage 路径复制到目标 Managed Lustre 目录。

持续的事件驱动型复制

初始同步后,镜像服务会监听存储桶通知并复制更改。

大多数对象可以在几分钟内复制完成。创建或修改对象时,系统会复制整个文件。

  • 在 Cloud Storage 中创建新对象会自动在 Managed Lustre 中创建相应文件。

  • 修改 Cloud Storage 中的现有对象会覆盖 Managed Lustre 中的文件,并舍弃在文件系统中进行的任何本地修改。

  • 对 Cloud Storage 对象上的自定义 POSIX 元数据属性(例如 UID、GID、模式或 mtime)所做的更改会在相应的 Managed Lustre 文件中更新。

  • 默认情况下,删除 Cloud Storage 中的对象会删除 Managed Lustre 中的镜像文件。您可以使用 --deleted-files-retained 标志更改此行为。在删除最后一个文件后,空父级目录仍会保留在文件系统中。

  • 在 Managed Lustre 中对镜像文件所做的修改不会复制回源存储桶。如果源对象稍后更新,则 Managed Lustre 文件会被源对象的内容覆盖,并舍弃所有本地修改。

  • 删除 Managed Lustre 中的镜像文件不会删除 Cloud Storage 中的相应对象。

传输速度

以下传输速度适用于存储桶和实例位于同一 Google Cloud 区域的 Cloud Storage 镜像:

  • 初始同步会复制现有数据,对于大于 32 MB 的文件,复制速度最高可达 100 GBps;对于小文件,复制速度最高可达每秒 10,000 个对象。

  • 持续复制功能会自动同步正在进行的更改,传输性能因文件大小而异:

    • 10 MB 或更大的大文件以高达 3.5 GBps 的峰值吞吐量传输。
    • 对于 4 KB 或更小的文件,传输速率最高可达每秒 4,900 个对象。

如果数据写入 Cloud Storage 的速度快于镜像复制速度,事件会在积压队列中排队,从而增加更改在 Managed Lustre 中显示所需的时间。一旦变化率降低,镜像就会自动赶上。

传输速度受以下因素限制:

  • 实例的最大吞吐量,即实例容量乘以性能层级。

  • Cloud Storage 出站流量带宽,每个区域每个项目限制为 200 Gbps 或 25 GBps。如需获得更高的出站流量带宽,请申请增加配额。

  • 跨区域传输的网络延迟时间。将源存储桶和实例放在同一区域中,以获得最佳性能。

价格

Cloud Storage 镜像会产生标准 Cloud Storage 费用,这些费用会向包含源存储桶的项目收取:

  • 初始同步会对源存储桶执行 A 类列出操作和 B 类读取操作,而持续复制会执行 B 类读取操作,这会产生 Cloud Storage 操作费用。
  • 从与 Managed Lustre 实例位于不同区域的来源存储桶镜像数据会产生跨区域数据传输费用。

准备工作

创建 Cloud Storage 镜像需要:

  • 处于 ACTIVE 状态的 Managed Lustre 实例。
  • 用作镜像来源的现有 Cloud Storage 存储桶。不支持启用了分层命名空间的存储桶、Rapid Storage 存储桶以及启用了请求者付款的存储桶。

所需的权限、角色和资源

如需创建和管理 Cloud Storage 镜像,您需要具备以下 IAM 权限、角色和资源。

用户权限

如需创建和管理镜像,您的用户账号或服务账号需要具有 Managed Lustre Admin 角色 (roles/lustre.admin)。

如果您使用自定义角色,则该角色需要以下权限:

  • lustre.mirrors.create,用于创建镜像。
  • lustre.mirrors.get,用于描述镜像。
  • lustre.mirrors.list,用于列出镜像。
  • lustre.mirrors.update,用于更新镜像。
  • lustre.mirrors.delete,用于删除镜像。

Cloud Storage 服务代理初始化

Cloud Storage 服务代理必须存在于您的项目中,以便发布存储桶通知事件:

gcloud storage service-agent --project=PROJECT_ID

请将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

Managed Lustre 服务代理权限

Google 管理的 Managed Lustre 服务代理需要访问您的源 Cloud Storage 存储桶。如需了解如何查找或初始化服务代理身份,请参阅 Managed Lustre 服务代理。

服务代理需要对来源 Cloud Storage 存储桶拥有以下权限:

  • storage.buckets.get
  • storage.buckets.update
  • storage.objects.get
  • storage.objects.list

创建包含以下权限的自定义角色:

gcloud iam roles create lustreMirrorUser \
  --project=PROJECT_ID \
  --title="Lustre mirror user" \
  --permissions=storage.buckets.get,storage.buckets.update,storage.objects.get,storage.objects.list

向源存储桶上的 Managed Lustre 服务代理授予自定义角色:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
  --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com" \
  --role="projects/PROJECT_ID/roles/lustreMirrorUser"

替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • BUCKET_NAME:源 Cloud Storage 存储桶的名称。
  • PROJECT_NUMBER:您的 Google Cloud 项目编号。

创建 Cloud Storage 镜像

您可以为每个 Managed Lustre 实例创建一个 Cloud Storage 镜像。

在实例上执行导入或导出操作期间,无法创建 Cloud Storage 镜像。

gcloud

运行 mirrors create 命令:

gcloud lustre instances mirrors create MIRROR_NAME \
  --instance=INSTANCE_ID \
  --location=LOCATION \
  --direction=from-cloud-storage \
  --gcs-path-uri="gs://BUCKET_NAME/PREFIX/" \
  --lustre-path="/LUSTRE_DIRECTORY"

其中:

  • MIRROR_NAME 是此镜像资源的名称。长度必须介于 1 到 63 个字符之间,只能包含小写字母、数字和连字符,以字母开头,并以字母或数字结尾。
  • INSTANCE_ID 是您的 Managed Lustre 实例 ID。
  • LOCATION 是实例所在的可用区。例如 us-central1-a。
  • --direction 指定镜像方向。必须为 from-cloud-storage。
  • --gcs-path-uri 是源 Cloud Storage 存储桶和可选对象前缀。如果您指定对象前缀,则路径必须以正斜杠结尾:gs://<var>BUCKET_NAME</var>/<var>PREFIX</var>/。
  • --lustre-path 是 Managed Lustre 文件系统上的目标目录。必须是以 / 开头的绝对路径,例如 /data 或 /data/subdir。默认为根目录 /。如果指定目录不存在,系统将会创建该目录。

您可以使用以下可选参数:

  • --deleted-files-retained 或 --no-deleted-files-retained:控制在 Cloud Storage 中删除的文件是否保留在 Managed Lustre 中。默认值为 --no-deleted-files-retained。
  • --description=DESCRIPTION_TEXT:镜像的可选说明。

REST

向 instances.mirrors.create 方法发送 POST 请求:

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/mirrors?mirrorId=MIRROR_NAME
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json

{
  "gcsPath": {
    "uri": "gs://BUCKET_NAME/PREFIX/"
  },
  "lustrePath": {
    "path": "/LUSTRE_DIRECTORY"
  },
  "direction": "FROM_CLOUD_STORAGE"
}

其中:

  • PROJECT_ID 是 Google Cloud 项目 ID。
  • LOCATION 是 Managed Lustre 实例所在的可用区。例如 us-central1-a。
  • INSTANCE_ID 是实例 ID。
  • MIRROR_NAME 是此镜像资源的名称。长度必须介于 1 到 63 个字符之间,只能包含小写字母、数字和连字符,以字母开头,并以字母或数字结尾。
  • gcsPath 包含一个 uri 字段,其中包含来源 Cloud Storage 存储桶和可选对象前缀。如果您指定对象前缀,则路径必须以正斜杠结尾:gs://<var>BUCKET_NAME</var>/<var>PREFIX</var>/。
  • lustrePath 是 Managed Lustre 文件系统上的目标目录。必须是以 / 开头的绝对路径,例如 /data 或 /data/subdir。默认为根目录 /。如果指定目录不存在,系统将会创建该目录。
  • direction 指定镜像方向。必须为 FROM_CLOUD_STORAGE。

请求正文还支持以下可选字段:

  • deletedFilesRetained:设置为 true,以便在从 Cloud Storage 中删除相应文件后,在 Managed Lustre 中保留这些文件。默认值为 false。
  • description:镜像的可选说明。

文件属性

将文件从 Cloud Storage 存储桶复制到 Managed Lustre 实例时,Managed Lustre 实例中的文件属性会通过以下两种方式之一进行设置:

  • 如果 Cloud Storage 对象具有导出数据时所述的自定义元数据,则:
    • 文件的 UID、GID、模式和 mtime 会根据对象的自定义元数据进行设置。
    • 文件的 atime 设置为与 mtime 相同的值。
  • 如果 Cloud Storage 对象没有自定义元数据,则:
    • 文件的 UID 和 GID 设置为 0 (root)。
    • 该文件的模式已设置为 rwxr-xr-x (755)。
    • 文件的 atime 和 mtime 设置为 Cloud Storage 对象的创建时间。

无论哪种情况:

  • 文件的 ctime 设置为文件写入实例的时间。
  • 目录的 atime、ctime 和 mtime 设置为在实例上创建目录的时间。

管理 Cloud Storage 镜像

您可以使用 Google Cloud CLI 工具或 REST API 列出、描述、更新和删除 Cloud Storage 镜像。如需更改现有镜像的来源或目标路径,您必须删除现有镜像并创建一个新镜像。

列出镜像

如需查看在实例上配置的镜像,请执行以下操作:

gcloud

gcloud lustre instances mirrors list \
  --instance=INSTANCE_ID \
  --location=LOCATION

REST

向 instances.mirrors.list 方法发送 GET 请求:

GET https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/mirrors
Authorization: Bearer YOUR_ACCESS_TOKEN

描述镜子

如需查看镜像的配置和运行状态,请执行以下操作:

gcloud

gcloud lustre instances mirrors describe MIRROR_NAME \
  --instance=INSTANCE_ID \
  --location=LOCATION

REST

向 instances.mirrors.get 方法发送 GET 请求:

GET https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/mirrors/MIRROR_NAME
Authorization: Bearer YOUR_ACCESS_TOKEN

镜像状态

list 和 describe 命令返回的 state 字段会报告镜像在其生命周期中的位置:

州 说明
CREATING 正在创建镜像资源。
INITIAL_SYNC 初始同步正在从 Cloud Storage 复制现有对象。
ACTIVE 镜像正在同步发生的更改。
DELETING 正在删除镜像。

更新镜像

您可以更新镜像的说明、标签以及是否保留已删除的文件。

Cloud Storage 和 Managed Lustre 路径无法更改。 如需将镜像指向其他路径,请删除该镜像并创建一个新镜像。

更新镜像不会重新运行初始同步。

gcloud

gcloud lustre instances mirrors update MIRROR_NAME \
  --instance=INSTANCE_ID \
  --location=LOCATION \
  --description="DESCRIPTION_TEXT"

REST

向 instances.mirrors.patch 方法发送 PATCH 请求,并附带 updateMask 查询参数:

PATCH https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/mirrors/MIRROR_NAME?updateMask=description
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json

{
  "description": "DESCRIPTION_TEXT"
}

删除镜像

如需删除镜像,请执行以下操作:

gcloud

gcloud lustre instances mirrors delete MIRROR_NAME \
  --instance=INSTANCE_ID \
  --location=LOCATION

REST

向 instances.mirrors.delete 方法发送 DELETE 请求:

DELETE https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/mirrors/MIRROR_NAME
Authorization: Bearer YOUR_ACCESS_TOKEN

删除镜像会停止 Cloud Storage 与 Managed Lustre 之间的未来同步。移除镜像时,已复制到 Managed Lustre 的文件不会被删除。

删除镜像时,正在进行的文件传输会被中止。 在删除镜像后,未完成的传输可能会在镜像目录中留下名称格式为 FILENAME.cloud_transfer.UUID.NUMBER.tmp 的临时文件。您可以删除这些文件。

查看日志

镜像日志会标识未能同步的单个文件。

日志会针对 lustre.googleapis.com/Instance 资源路由到 Cloud Logging,日志名称为 mirror。

如需查看镜像操作的日志,请执行以下操作:

  1. 前往日志浏览器。
  2. 输入以下查询:

    resource.type="lustre.googleapis.com/Instance"
    logName="projects/PROJECT_ID/logs/lustre.googleapis.com%2Fmirror"
    resource.labels.instance_id="INSTANCE_ID"
    

问题排查

源存储桶上的 PERMISSION_DENIED 错误

如果镜像创建失败并出现 PERMISSION_DENIED 错误、文件未同步或日志显示“PERMISSION_DENIED”错误,请执行以下操作:

  1. 验证 Cloud Storage 服务代理是否已初始化:

    gcloud storage service-agent --project=PROJECT_ID
    
  2. 确认已向 Managed Lustre 服务代理授予对来源存储桶的所需权限。如需了解详情,请参阅授予服务代理权限。

Cloud Storage 中的更改未复制到 Managed Lustre

如果镜像状态为 ACTIVE,但 Cloud Storage 中新增或修改的对象未显示在 Managed Lustre 中,请确认源存储桶中存在存储桶通知配置。

  1. 列出存储桶通知:

    gcloud storage buckets notifications list --bucket=BUCKET_NAME
    
  2. 如果输出为空,则必须删除现有镜像并创建一个新镜像:

    gcloud lustre instances mirrors delete MIRROR_NAME \
      --instance=INSTANCE_ID \
      --location=LOCATION
    

    删除完成后,创建新的镜像。

命名冲突错误

如果您在将文件添加到 Cloud Storage 后发现 Managed Lustre 中缺少这些文件,请在 Cloud Logging 中检查是否存在命名冲突错误:

  • 如果 Cloud Storage 中创建的对象与 Managed Lustre 中的现有目录同名,则转移会失败并显示 file exists 错误,并且现有目录不会被覆盖。失败的传输会在父级目录中留下一个名称格式为 FILENAME.cloud_transfer.UUID.NUMBER.tmp 的临时文件。
  • 如果 Cloud Storage 中创建的对象包含与 Managed Lustre 中现有常规文件匹配的路径前缀,则转移会失败并显示 not a directory 错误,并且现有文件不会被覆盖。例如,如果 models 是 Managed Lustre 中的现有文件,则从 Cloud Storage 传输名为 models/weights.bin 的对象会失败,因为无法创建目录 models/。

如需解决这些冲突,请在 Managed Lustre 中重命名或删除冲突的目录或文件,移除所有剩余的 .tmp 文件,然后在 Cloud Storage 中重新上传对象以触发同步。

ABORTED: unable to queue the operation

如果您在创建镜像或启动按需转移作业时收到 ABORTED: unable to queue the operation 错误,请执行以下操作:

  • 在创建镜像之前,请确保实例上没有正在运行的 import-data 或 export-data 操作。
  • 请等待镜像创建和初始同步完成,然后再尝试对实例执行其他管理数据操作。

FILESYSTEM_NO_SPACE_ON_DEVICE

如果镜像停止,并且日志指示空间错误,则 Managed Lustre 文件系统可能已用尽 inode 或磁盘容量。您可以删除不必要的文件以释放空间,也可以增加存储容量以扩展文件系统。