将数据转移到 Cloud Storage 或从 Cloud Storage 转移数据

Google Cloud Managed Lustre 可以从 Cloud Storage 导入数据,也可以将数据导出到 Cloud Storage。数据转移是增量式的;它们只会复制目标中尚不存在的文件,或者自上次转移后发生更改的文件。

与标准 存储桶相比,启用了 分层命名空间的 Cloud Storage 存储桶可提供更快的 Managed Lustre 数据转移速度。

性能

Managed Lustre 和 Cloud Storage 之间的数据转移速度可达到以下水平:

  • 对于超过 32 MB 的文件,最高可达 100 GBps。数据转移速度受实例的最大吞吐量(实例容量乘以 性能层级)限制。

Cloud Storage 出站流量带宽注意事项

Cloud Storage 提供的默认出站流量带宽为每区域每项目最高 200 Gbps。如果您在同一项目和区域中拥有多个 Managed Lustre 实例,则可以申请增加出站流量带宽限制。如需了解详情,请参阅 Cloud Storage 带宽配额

所需权限

发起转移作业所需的权限

用于发起转移作业的用户或服务帐号需要以下权限:

  • lustre.instances.exportData ,用于从 Managed Lustre 转移到 Cloud Storage。
  • lustre.instances.importData,用于从 Cloud Storage 转移。

这两个权限都通过 roles/lustre.admin 角色授予。您可以创建自定义角色来 单独授予权限。

Managed Lustre 服务代理的权限

Managed Lustre 使用 服务代理代表您访问 Cloud Storage 存储桶。如需执行转移作业,您必须向服务代理授予对目标存储桶的访问权限。

如果您不知道项目的服务代理身份,请参阅 创建或检索服务代理身份

授予权限

Managed Lustre 服务代理需要以下某个 Cloud Storage 角色

  • 如需将数据转移到 Cloud Storage 以及从 Cloud Storage 转移数据:Cloud Storage 存储桶上的 roles/storage.objectUser
  • 如需仅从 Cloud Storage 转移:Cloud Storage 存储桶上的 roles/storage.objectViewer

如需授予其中一个角色,请执行以下操作:

导入和导出

运行以下 gcloud 命令:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
  --member=serviceAccount:SERVICE_AGENT_IDENTITY \
  --role=roles/storage.objectUser

仅导入

运行以下 gcloud 命令:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
  --member=serviceAccount:SERVICE_AGENT_IDENTITY \
  --role=roles/storage.objectViewer

替换以下内容:

  • BUCKET_NAME:Cloud Storage 存储桶的名称。
  • SERVICE_AGENT_IDENTITY:Managed Lustre 服务 代理身份 (service-<var>PROJECT_NUMBER</var>@gcp-sa-lustre.)。

将数据导入到 Managed Lustre

您可以从 Cloud Storage 存储桶导入数据。该存储桶可以位于同一项目或不同项目中。该存储桶可以位于与您的 Managed Lustre 实例不同的可用区或区域 ,但跨区域转移作业
的速度可能比同一区域内的转移作业慢。

gcloud

gcloud lustre instances import-data INSTANCE_ID \
  --location=LOCATION \
  --gcs-path-uri=gs://BUCKET_NAME/ \
  --lustre-path=PS_PATH

其中:

  • INSTANCE_ID 是您的 Managed Lustre 实例名称。
  • --location 是您的 Managed Lustre 实例所在的可用区。例如,us-central1-a
  • --gcs-path-uri 使用 gs://<bucket_name>/<optional_path_inside_bucket>/ 格式指定 Cloud Storage 存储桶的 URI, 或存储桶内的路径。如果指定了存储桶内的路径,则该路径必须以正斜杠 (/) 结尾。
  • --lustre-path 指定 Managed Lustre 文件系统的根目录路径。必须以 / 开头。默认值为 /。如果指定了非默认值,则该目录必须已存在于文件系统中。

下面介绍的是可选参数。

  • --request-id 可让您为此请求分配唯一 ID。如果您使用相同的请求 ID 重试此请求,则服务器会忽略该请求(如果该请求已完成)。必须是有效的 UUID,且不能全部由零组成。
  • --async 会立即返回响应,而无需等待操作完成。

如需了解详情,请参阅 Cloud SDK 文档

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:importData
Authorization: Bearer [YOUR_ACCESS_TOKEN]

{
  "gcsPath" : {
    "uri" : "gs://BUCKET_NAME/"
  },
  "lustrePath" : {
    "path" : "/PATH"
  }
}

其中:

  • PROJECT_ID 是您的 Google Cloud 项目名称。
  • LOCATION 是您的 Managed Lustre 实例所在的可用区。例如,us-central1-a
  • INSTANCE_ID 是您的 Managed Lustre 实例名称。
  • gcsPath 包含一个 uri 键,其值使用 格式 gs://<bucket_name>/<optional_path_inside_bucket>/ 指定 Cloud Storage 存储桶的 URI 或存储桶内的路径。如果指定了存储桶内的路径,则该路径必须以正斜杠 (/) 结尾。
  • lustrePath 包含一个 path 键,其值指定 Managed Lustre 文件系统的根目录路径。必须以 / 开头。默认值为 /。如果指定了非默认值,则该目录必须已存在于文件系统中。

如需使用您自己的服务帐号而不是 Google 代管式服务代理,该请求支持 JSON 对象中的 serviceAccount 字段:

"serviceAccount" : "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID"

一个 curl 命令示例如下所示:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:importData \
  -d '{"gcsPath": {"uri":"gs://BUCKET_NAME/"}, "lustrePath": {"path":"/"}}'

文件属性

当您将数据从 Cloud Storage 存储桶导入到 Managed Lustre 实例时,Managed Lustre 实例中的文件属性将通过以下两种方式之一进行设置:

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

无论哪种情况:

  • 文件的 ctime 将设置为文件写入实例的时间。
  • 目录的 atimectimemtime 将设置为在实例上创建目录的时间。

导出数据

您可以将数据从 Managed Lustre 实例导出到同一项目或不同项目中的 Cloud Storage 存储桶。该存储桶可以位于与您的 Managed Lustre 实例不同的可用区或区域,但跨区域转移作业的速度可能比同一区域内的转移作业慢。

gcloud

gcloud lustre instances export-data \
  INSTANCE_ID \
  --location=LOCATION \
  --gcs-path-uri="gs://BUCKET_NAME/" \
  --lustre-path="/"

其中:

  • INSTANCE_ID 是您的 Managed Lustre 实例名称。
  • --location 是您的 Managed Lustre 实例所在的可用区。例如,us-central1-a
  • --gcs-path-uri 使用 gs://<bucket_name>/<optional_path_inside_bucket>/ 格式指定 Cloud Storage 存储桶的 URI 或存储桶内的路径。如果指定了存储桶内的路径,则该路径必须以正斜杠 (/) 结尾。
  • --lustre-path 指定 Managed Lustre 文件系统的根目录路径。必须以 / 开头。默认值为 /

下面介绍的是可选参数。

  • --request-id 可让您为此请求分配唯一 ID。如果您使用相同的请求 ID 重试此请求,则服务器会忽略该请求(如果该请求已完成)。必须是有效的 UUID,且不能全部由零组成。
  • --async 会立即返回响应,而无需等待操作完成。

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:exportData
Authorization: Bearer [YOUR_ACCESS_TOKEN]

{
  "lustrePath" : {
    "path" : "/"
  },
  "gcsPath" : {
    "uri" : "gs://BUCKET_NAME/"
  }
}

其中:

  • PROJECT_ID 是您的 Google Cloud 项目名称。
  • INSTANCE_ID 是您的 Managed Lustre 实例名称。
  • LOCATION 是您的 Managed Lustre 实例所在的可用区。例如,us-central1-a
  • lustrePath 包含一个 path 键,其值指定 Managed Lustre 文件系统的根目录路径。必须以 / 开头。 默认值为 /
  • gcsPath 包含一个 uri 键,其值使用 格式 gs://<bucket_name>/<optional_path_inside_bucket>/ 指定 Cloud Storage 存储桶的 URI 或存储桶内的路径。如果指定了存储桶内的路径,则该路径必须以正斜杠 (/) 结尾。

如需使用您自己的服务帐号而不是 Google 代管式服务代理,该请求支持 JSON 对象中的 serviceAccount 字段:

"serviceAccount" : "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID"

一个 curl 命令示例如下所示:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json"
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:exportData \
  -d '{"lustrePath": {"path":"/"}, "gcsPath": {"uri":"gs://BUCKET_NAME/"}}'

文件属性

当您将数据从 Managed Lustre 实例导出到 Cloud Storage 存储桶时,以下文件属性将作为 自定义元数据保留在 Cloud Storage 中:

  • 文件的 UID 存储在 goog-reserved-posix-uid 键中。
  • 文件的 GID 存储在 goog-reserved-posix-gid 键中。
  • 文件的数字模式存储在 goog-reserved-posix-mode 键中。
  • 文件的 mtime 存储在 goog-reserved-file-mtime 键中。

这些自定义元数据键名称与 Storage Transfer Service用于 具有 POSIX 文件系统的转移作业的键名称相同。

以下文件属性不会保留:

  • 符号链接不会保留。
  • 硬链接将导出为单独的 Cloud Storage 对象,从而产生多个副本。
  • 使用 lfs setstripelfs setdirstripe 显式设置的 Lustre 条带化不会保留。
  • 文件的 atimectime 不会保留。
  • 目录的 mtime 不会保留。
  • 空目录不会保留。

获取操作

如需查看导入或导出操作的状态,您需要操作 ID。当您发出导入或导出请求时,该 ID 由服务返回,并使用以下格式:

  • operation-1234567890123-6127783ad26ea-88913969-02748053

gcloud

gcloud lustre operations describe OPERATION_ID \
  --location=LOCATION

REST

GET https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
Authorization: Bearer [YOUR_ACCESS_TOKEN]

一个 curl 命令示例如下所示:

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID

取消操作

如需取消导入或导出操作,您需要操作 ID。当您发出导入或导出请求时,该 ID 由服务返回,并使用以下格式:

  • operation-1234567890123-6127783ad26ea-88913969-02748053

gcloud

gcloud lustre operations cancel OPERATION_ID \
  --location=LOCATION

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID:cancel
Authorization: Bearer [YOUR_ACCESS_TOKEN]

一个 curl 命令示例如下所示:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID:cancel

限制

存在以下限制:

  • 每个实例一次只能有一个转移作业处于活跃状态。如果在第一个转移作业完成之前启动第二个转移作业,系统会返回以下错误:

    ERROR: (gcloud.lustre.instances.export-data) ABORTED: unable to queue the operation
    

问题排查

从 Cloud Storage 导入数据或将数据导出到 Cloud Storage 时,您可能会遇到转移作业停滞、权限问题或文件跳过的情况。请按照以下步骤诊断和解决常见的数据转移问题。

转移作业停滞或出站流量速度缓慢

如果导入或导出操作停滞或运行速度明显低于预期,请检查以下内容:

  • Cloud Storage 出站流量带宽限制: Cloud Storage 强制执行默认出站流量带宽配额,即每区域每项目最高 200 Gbps。如果多个实例或高吞吐量工作负载同时转移数据,您可能会受到此配额的限制。如需申请增加 配额,请参阅 Cloud Storage 带宽配额
  • 实例吞吐量限制: 转移速度受实例的最大吞吐量容量(实例容量乘以其性能层级)限制。请验证实例的性能层级,确保其符合您的性能预期。

转移作业启动期间出现权限错误

如果启动转移作业失败并显示权限遭拒或授权错误,请验证以下 IAM 角色:

  • 用户和服务帐号权限:发起转移命令的身份必须具有 lustre.instances.importData(用于导入)或 lustre.instances.exportData(用于导出)。这些权限包含在 roles/lustre.admin 角色中。
  • 服务代理权限: Google 管理的 Managed Lustre 服务代理 (service-<PROJECT_NUMBER>@gcp-sa-lustre...) 必须在目标 Cloud Storage 存储桶上具有 roles/storage.objectViewer(用于导入)或 roles/storage.objectUser (用于导出)。如需了解详细的设置说明,请参阅 向服务代理授予权限

文件跳过或属性缺失

Managed Lustre 数据转移是增量式的;它们只会复制目标中不存在的文件,或者自上次转移后发生更改的文件。

  • 如果文件似乎被跳过,请验证这些文件之前是否已成功转移且未被修改。
  • 将数据导出到 Cloud Storage 时,系统会使用自定义元数据键(例如 goog-reserved-posix-uid)保留 POSIX 元数据(UID、GID、模式、mtime)。请注意,在导出期间,符号链接、空目录和显式 PFL 条带化布局不会保留。如需了解完整详情,请参阅 转移数据文件属性

检查失败的转移作业

如果转移作业失败,请使用操作 ID 检索详细的错误消息和失败原因:

gcloud lustre operations describe OPERATION_ID \
  --location=LOCATION

查看操作输出中的 error 字段,以确定失败是由对象缺失、网络超时还是身份验证引起的。

无法将操作加入队列

如果您在尝试启动操作时看到类似于以下任何一种的错误:

ERROR: (gcloud.lustre.instances.import-data) ABORTED: unable to queue the operation
ERROR: (gcloud.lustre.instances.export-data) ABORTED: unable to queue the operation
ERROR: (gcloud.lustre.instances.update) ABORTED: unable to queue the operation

当您尝试启动操作时,同一实例上已在进行另一个相同类型的操作,就会发生此错误。

  • 导入/导出: Managed Lustre 每个实例一次仅支持一个活跃的转移作业。转移作业不支持排队。
  • 实例更新: Managed Lustre 每个实例一次允许一个活跃的更新,并允许将另一个更新操作加入队列。

如需解决此问题,请等待当前操作完成,然后再启动新操作。

FILESYSTEM_NO_SPACE_ON_DEVICE 错误

如果您的转移作业返回 FILESYSTEM_NO_SPACE_ON_DEVICE 错误,即使监控工具表明聚合可用空间仍然可用,您也可能遇到 OST 不平衡、客户端空间授予或 inode 耗尽的情况。 如需了解详情和 缓解策略,请参阅No space left on device错误