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 服务代理
首次在项目中创建 Managed Lustre 实例时,系统会创建 Managed Lustre 服务代理。服务代理身份的格式为 service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com。
如果您还没有 Managed Lustre 服务代理
运行
services identity create命令:gcloud beta services identity create \ --service=lustre.googleapis.com \ --project=PROJECT_NUMBER_OR_ID将 PROJECT_NUMBER_OR_ID 替换为要在其中创建 Managed Lustre 实例的项目的编号或 ID。输出类似于以下内容:
Service identity created: service-1234567890@gcp-sa-lustre.iam.gserviceaccount.com复制服务代理身份的值,以便在下一步中使用。
如果您已创建 Managed Lustre 实例
如需构建服务代理身份,请获取您的项目编号。PROJECT_NUMBER 与项目 ID 不同:
- 项目 ID 是一个唯一字符串,可以包含字母、数字和连字符。您可以在创建项目时指定项目 ID。例如
example-project-123。 - 项目编号是系统为项目自动生成的唯一标识符,仅包含数字。例如
1234567890。
如需获取给定项目 ID 的 PROJECT_NUMBER,请使用
gcloud projects describe命令:gcloud projects describe PROJECT_ID --format="value(projectNumber)"- 项目 ID 是一个唯一字符串,可以包含字母、数字和连字符。您可以在创建项目时指定项目 ID。例如
将返回的项目编号复制到服务代理身份中:
service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com复制服务代理身份,以便在下一步中使用。
授予权限
Managed Lustre 服务代理需要以下某个 Cloud Storage 角色:
- 如需将数据转移到 Cloud Storage 以及从 Cloud Storage 转移数据,请执行以下操作:
roles/storage.objectUserCloud Storage 存储桶。 - 如需仅从 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 存储桶导入数据。存储桶可以位于同一项目中,也可以位于其他项目中。存储桶可以位于与 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指定 Cloud Storage 存储桶的 URI 或存储桶中的路径,格式为gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。--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键,其值指定了 Cloud Storage 存储桶的 URI 或存储桶中的路径,格式为gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。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相同的值。
- 文件的 UID、GID、模式和
- 如果 Cloud Storage 对象没有自定义元数据,则:
- 文件的 UID 和 GID 设置为 0 (
root)。 - 文件的模式设置为
rwxr-xr-x(755)。 - 文件的
atime和mtime设置为 Cloud Storage 对象的创建时间。
- 文件的 UID 和 GID 设置为 0 (
无论哪种情况:
- 文件的
ctime设置为文件写入实例的时间。 - 目录的
atime、ctime和mtime设置为在实例上创建目录的时间。
导出数据
您可以将数据从 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用于指定 Cloud Storage 存储桶的 URI 或存储分区内的路径,格式为gs://<bucket_name>/<optional_path_inside_bucket>/。如果指定了存储分区内的路径,则该路径必须以正斜线 (/) 结尾。--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键,其值指定了 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 setstripe或lfs setdirstripe显式设置的 Lustre 条带化不会保留。 - 系统不会保留文件的
atime和ctime。 - 系统不会保留目录的
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 允许每个实例一次进行一项有效更新,并允许将其他更新操作排入队列。
如需解决此问题,请等待当前操作完成后再开始执行新操作。