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

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

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

限制

每个实例一次只能进行一项转移操作。如果尝试在之前的转移操作仍在运行时启动第二次转移操作,则会导致类似如下的错误:

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

Cloud Storage 出站带宽注意事项

Cloud Storage 提供的默认出站流量带宽为每区域每项目最高 200 Gbps。如果您的工作负载需要更高的数据传输速度,您可以申请提高出站流量带宽限制。如需了解详情,请参阅 Cloud Storage 带宽配额

所需权限

发起转移所需的权限

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

  • lustre.instances.exportData,以便从 Managed Lustre 转移到 Cloud Storage。
  • lustre.instances.importData,以便从 Cloud Storage 转移数据。

roles/lustre.admin 角色可提供这两项权限。您可以创建自定义角色,以便单独授予权限。

Managed Lustre 服务代理的权限

获取 Managed Lustre 服务代理

首次在项目中创建 Managed Lustre 实例时,系统会创建 Managed Lustre 服务代理。服务代理身份的格式为 service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com

如果您还没有 Managed Lustre 服务代理
  1. 运行 services identity create 命令:

    gcloud beta services identity create \
      --service=lustre.googleapis.com \
      --project=PROJECT_NUMBER_OR_ID
    

    PROJECT_NUMBER_OR_ID 替换为要在其中创建受管 Lustre 实例的项目的编号或 ID。输出类似于以下内容:

    Service identity created: service-1234567890@gcp-sa-lustre.iam.gserviceaccount.com
    
  2. 复制服务代理身份的值,以便在下一步中使用。

如果您已创建 Managed Lustre 实例
  1. 如需构建服务代理身份,请获取您的项目编号。PROJECT_NUMBER项目 ID 不同:

    • 项目 ID 是一个唯一字符串,可以包含字母、数字和连字符。您可以在创建项目时指定项目 ID。例如 example-project-123
    • 项目编号是系统为项目自动生成的唯一标识符,仅包含数字。例如 1234567890

    如需获取给定项目 ID 的 PROJECT_NUMBER,请使用 gcloud projects describe 命令:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    
  2. 将返回的项目编号复制到服务代理身份中:

    service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com
    
  3. 复制服务代理身份,以便在下一步中使用。

授予权限

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.objectViewer_OR_objectUser

SERVICE_AGENT_IDENTITY 是上一步中的 Managed Lustre 服务代理身份。

将数据导入到 Managed Lustre

您可以从 Cloud Storage 存储桶导入数据。存储桶可以位于同一项目中,也可以位于其他项目中。存储桶可以位于与受管 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 指定 Cloud Storage 存储桶的 URI 或存储桶中的路径,格式为 gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。
  • --lustre-path 指定受管 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 是您的托管 Lustre 实例所在的可用区。例如 us-central1-a
  • INSTANCE_ID 是您的 Managed Lustre 实例名称。
  • gcsPath 包含一个 uri 键,其值指定 Cloud Storage 存储桶的 URI 或存储桶中的路径,格式为 gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。
  • lustrePath 包含一个 path 键,其值指定了受管理的 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 设置为在实例上创建目录的时间。

导出数据

您可以将数据从受管 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 是您的托管 Lustre 实例所在的可用区。例如 us-central1-a
  • --gcs-path-uri 用于指定 Cloud Storage 存储桶的 URI 或存储分区内的路径,格式为 gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。
  • --lustre-path 指定受管 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 是您的托管 Lustre 实例所在的可用区。例如 us-central1-a
  • lustrePath 包含一个 path 键,其值指定了受管理的 Lustre 文件系统的根目录路径。必须以 / 开头。 默认值为 /
  • gcsPath 包含一个 uri 键,其值指定 Cloud Storage 存储桶的 URI 或存储桶中的路径,格式为 gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。

如需使用您自己的服务账号,而不是 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