在 GCP 上部署 Lustre 并行文件系统

1. 概览

欢迎学习在 Google Cloud Platform 上运行 Lustre Parallel 文件系统集群的 Google Codelab!

d51beef5f729cbe9.png

数据是高性能计算实践的核心,以极高的速度和低延迟访问大量数据一直是运行 HPC 工作负载的主要挑战。云中对高性能存储的要求并未改变,事实上,快速轻松地利用大量存储的能力已经变得至关重要。

长期以来,HPC 中心一直使用 Lustre 并行文件系统等技术,在本地满足这一需求。Lustre 是当今最受欢迎的开源高性能存储解决方案之一。自 2005 年 6 月以来,全球最快的 10 台超级计算机中至少有半数一直在使用 Lustre,全球最快的 100 台超级计算机中也有超过 60 台在使用 Lustre。Lustre 能够扩容高达数百 PB 的容量,并为 HPC 作业提供尽可能高的性能,其系统在单个命名空间中提供 TB/秒的吞吐量。

为了满足存储需求,Google Cloud 采用了两种方法。首先,GCP 与 DDN 合作,将其受支持的企业级 DDN EXAScaler Lustre 软件引入 GCP Marketplace。其次,我们的 Google Cloud 工程师开发并开源了一组脚本,以便使用 Google Cloud Deployment Manager 在 Google Compute Engine 上轻松配置和部署 Lustre 存储集群。

Google Cloud Platform 上的 Lustre 同样能够充分发挥其所运行基础架构的性能。它在 GCP 上的性能非常出色,在 2019 年与我们的合作伙伴 DDN 一起在 IO-500 存储系统基准测试中排名第 8,是 IO-500 中排名最高的基于云的文件系统。今天,我们将介绍如何为 Lustre 部署开源 Deployment Manager 脚本。如果您有兴趣获得企业级的强化 Lustre 体验,并希望获得 Lustre 集群的 Lustre 专家支持,以及管理和监控 GUI 或 Lustre 调整等功能,我们建议您了解 DDN EXAScaler Marketplace 产品

学习内容

  • 如何使用 GCP Deployment Manager 服务
  • 如何在 GCP 上配置和部署 Lustre 文件系统。
  • 如何配置分块并测试对 Lustre 文件系统的简单 I/O。

前提条件

  • Google Cloud Platform 账号和已启用结算功能的项目
  • 基本的 Linux 使用经验

2. 设置

自定进度的环境设置

创建项目

如果您还没有 Google 账号(Gmail 或 G Suite),则必须创建一个。登录 Google Cloud Platform 控制台 ( console.cloud.google.com),然后打开“管理资源”页面

359c06e07e6d699f.png

点击 Create Project

25c23d651abb837b

输入项目名称。记下项目 ID(在上面的屏幕截图中以红色突出显示)。项目 ID 必须是所有 Google Cloud 项目中的唯一名称。如果您的项目名称不唯一,Google Cloud 会根据项目名称生成一个随机项目 ID。

接下来,您需要在 Developers Console 中启用结算功能,才能使用 Google Cloud 资源。

在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“结论”部分)。此处提供 Google Cloud Platform 价格计算器。

Google Cloud Platform 的新用户有资格获享$300 免费试用

Google Cloud Shell

虽然您可以从笔记本电脑远程操作 Google Cloud,但在此 Codelab 中,我们将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

启动 Google Cloud Shell

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

dbad104cef962719.png

然后点击启动 Cloud Shell

4e50db320508ac88.png

配置和连接到环境应该只需要片刻时间:

20b0aa80492144d.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 上运行,大大增强了网络性能并简化了身份验证。只需使用网络浏览器或 Google Chromebook 即可完成本实验中的大部分(甚至全部)工作。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:

$ gcloud auth list

命令输出:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

命令输出:

[core]
project = <PROJECT_ID>

如果项目 ID 设置不正确,您可以使用以下命令进行设置:

$ gcloud config set project <PROJECT_ID>

命令输出:

Updated property [core/project].

3. 准备并查看 Lustre 部署配置

下载 Lustre Deployment Manager 脚本

在 Cloud Shell 会话中,执行如下命令,以克隆(下载)包含 Lustre for Google Cloud Platform Deployment-manager 文件的 Git 代码库

git clone https://github.com/GoogleCloudPlatform/deploymentmanager-samples.git

通过执行以下命令切换到 Lustre 部署配置目录:

cd deploymentmanager-samples/community/lustre/

配置 Lustre 部署 YAML

Deployment Manager 使用 YAML 文件提供部署配置。此 YAML 文件详细说明了部署的配置,例如要部署的 Lustre 版本和要部署的机器实例类型。该文件默认配置为在新的项目中部署,而不会增加任何配额,但您可以根据需要更改此 Codelab 的机器类型或容量。此 Codelab 旨在使用这些默认值,因此如果您进行了任何更改,则必须在整个 Codelab 中应用这些更改,以免出错。在生产环境中,我们建议为 MDS 节点至少配置 32 个 vCPU 的实例,为 OSS 节点至少配置 8 或 16 个 vCPU 的实例,具体取决于存储容量和类型。

如需在 Cloud Shell 会话中查看或修改 YAML 文件,请打开部署配置 YAML 文件 Lustre-cluster.yaml。您可以使用自己惯用的命令行编辑器(vi、nano、emacs 等)或 Cloud 控制台代码编辑器查看文件内容:

11efd5af658f1842.png

文件的内容将如下所示:

# [START cluster_yaml]
imports:
- path: lustre.jinja

resources:
- name: lustre
  type: lustre.jinja
  properties:
    ## Cluster Configuration
    cluster_name            : lustre
    zone                    : us-central1-f
    cidr                    : 10.20.0.0/16
    external_ips            : True
    ### Use these fields to deploy Lustre in an existing VPC, Subnet, and/or Shared VPC
    #vpc_net                 : < VPC Network Name >
    #vpc_subnet              : < VPC Subnet Name >
    #shared_vpc_host_proj    : < Shared VPC Host Project name >

    ## Filesystem Configuration
    fs_name                 : lustre
    ### Review https://downloads.whamcloud.com/public/ to determine version naming
    lustre_version          : latest-release
    e2fs_version            : latest

    ## Lustre MDS/MGS Node Configuration
    #mds_node_count          : 1
    mds_ip_address          : 10.20.0.2
    mds_machine_type        : n1-standard-8
    ### MDS/MGS Boot disk
    mds_boot_disk_type      : pd-standard
    mds_boot_disk_size_gb   : 10
    ### Lustre MetaData Target disk
    mdt_disk_type           : pd-ssd
    mdt_disk_size_gb        : 1000

    ## Lustre OSS Configuration
    oss_node_count          : 4
    oss_ip_range_start      : 10.20.0.5
    oss_machine_type        : n1-standard-4
    ### OSS Boot disk
    oss_boot_disk_type      : pd-standard
    oss_boot_disk_size_gb   : 10
    ### Lustre Object Storage Target disk
    ost_disk_type           : pd-standard
    ost_disk_size_gb        : 5000
#  [END cluster_yaml]

此 YAML 文件中包含多个字段。以下带星号 (*) 的字段为必填项。这些字段包括:

集群配置

  • cluster_name* - Lustre 集群的名称,前置所有已部署的资源
  • zone* - 要部署集群的可用区
  • cidr* - CIDR 格式的 IP 范围
  • external_ips* - True/False,Lustre 节点具有外部 IP 地址。如果为 false,则将 Cloud NAT 设置为 NAT 网关
  • vpc_net - 定义此字段和 vpc_subnet 字段,以将 Lustre 集群部署到现有 VPC
  • vpc_subnet - 要部署 Lustre 集群的现有 VPC 子网
  • shared_vpc_host_proj - 定义此字段以及 vpc_net 和 vpc_subnet 字段,以将集群部署到共享 VPC

文件系统配置

MDS/MGS 配置

  • mds_ip_address - 为 MDS/MGS 节点指定的内部 IP 地址
  • mds_machine_type - 用于 MDS/MGS 节点的机器类型(请参阅 https://cloud.google.com/compute/docs/machine-types
  • mds_boot_disk_type - 用于 MDS/MGS 启动磁盘的磁盘类型(pd-standard、pd-ssd)
  • mds_boot_disk_size_gb - MDS 启动磁盘的大小(以 GB 为单位)
  • mdt_disk_type* - 用于元数据目标 (MDT) 磁盘的磁盘类型(pd-standard、pd-ssd、local-ssd)
  • mdt_disk_size_gb* - MDT 磁盘大小(以 GB 为单位)

OSS 配置

  • oss_node_count* - 要创建的对象存储服务器 (OSS) 节点的数量
  • oss_ip_range_start - OSS 节点 IP 范围的起始值。如果未指定,则使用自动 IP 分配
  • oss_machine_type - 用于 OSS 节点的机器类型
  • oss_boot_disk_type - 用于 OSS 启动磁盘的磁盘类型(pd-standard、pd-ssd)
  • oss_boot_disk_size_gb - MDS 启动磁盘的大小(以 GB 为单位)
  • ost_disk_type* - 用于对象存储目标 (OST) 磁盘的磁盘类型(pd-standard、pd-ssd、local-ssd)
  • ost_disk_size_gb* - OST 磁盘大小(以 GB 为单位)

4. 部署和验证配置

部署配置

在 Cloud Shell 会话中,从 Lustre-gcp 文件夹执行以下命令:

gcloud deployment-manager deployments create lustre --config lustre.yaml

此命令会创建一个名为 Lustre 的部署。此操作最多可能需要 10-20 分钟才能完成,因此请耐心等待

部署完成后,您将看到类似于以下内容的输出:

Create operation operation-1572410719018-5961966591cad-e25384f6-d4c905f8 completed successfully.
NAME                                TYPE                   STATE      ERRORS  INTENT
lustre-all-internal-firewall-rule  compute.v1.firewall    COMPLETED  []
lustre-lustre-network              compute.v1.network     COMPLETED  []
lustre-lustre-subnet               compute.v1.subnetwork  COMPLETED  []
lustre-mds1                        compute.v1.instance    COMPLETED  []
lustre-oss1                        compute.v1.instance    COMPLETED  []
lustre-oss2                        compute.v1.instance    COMPLETED  []
lustre-oss3                        compute.v1.instance    COMPLETED  []
lustre-oss4                        compute.v1.instance    COMPLETED  []
lustre-ssh-firewall-rule           compute.v1.firewall    COMPLETED  []

验证 Deployment

5f2a0557d3f2476f.png

如需在 Google Cloud Platform 控制台中查看部署,请按以下步骤操作:

  • 在 Cloud Platform 控制台中,打开控制台左上角的产品和服务菜单(三条横线)。
  • 点击 Deployment Manager
  • 点击 Lustre 以查看部署的详细信息。
  • 点击概览 - Lustre部署属性窗格会显示整体部署配置。
  • 点击 Config 属性上的“查看”。Config 窗格会显示之前修改的部署配置 YAML 文件的内容。请先验证内容是否正确,然后再继续。如果您需要更改部署配置,只需按照“清理部署”中的步骤删除部署,然后按照“配置 Lustre 部署 YAML”中的步骤重启部署即可。
  • (可选)在 Lustre-cluster 部分下,点击 Lustre.jinja 模板创建的每个资源,然后查看详细信息。

验证 Deployment 的配置后,确认集群的实例已启动。在 Cloud Platform 控制台中,依次点击产品和服务菜单中的 Compute Engine > 虚拟机实例

aec8498e04a3c334.png

虚拟机实例页面上,查看部署管理器创建的五个虚拟机实例。其中包括 lustre-mds1lustre-oss1lustre-oss2、lustre-oss3lustre-oss4

5. 访问 Lustre 集群

监控安装情况

在“虚拟机实例”页面上,点击 lustre-mds1 以打开“实例详情”页面。

ba0bea7acdbb9527.png

点击串行端口 1(控制台)以打开串行控制台输出页面。我们会使用此串行输出监控 MDS 实例的安装过程,并等待启动脚本完成。点击页面顶部的“刷新”按钮以更新串行输出。节点将重新启动一次,以启动 Lustre 内核,并显示类似于以下内容的消息:

Startup finished in 838ms (kernel) + 6.964s (initrd) + 49.302s (userspace) = 57.105s.
Lustre: lustre-MDT0000: Connection restored to 374e2d80-0b31-0cd7-b2bf-de35b8119534 (at 0@lo)

这意味着 Lustre 已安装在 Lustre 集群上,并且可以使用文件系统了!

访问 Lustre 集群

在 Cloud Shell 会话中,点击 Google Cloud 控制台中 lustre-mds1 实例旁边的 SSH 按钮。或者,在 Cloud Shell 中执行以下命令,将 <ZONE> 替换为 lustre-mds1 节点的可用区:

gcloud compute ssh lustre-mds1 --zone=<ZONE>

此命令会登录到 lustre-mds1 虚拟机。这是 Lustre 元数据服务器 (MDS) 实例,它也充当 Lustre 管理服务器 (MGS) 实例。此实例会处理文件系统的所有身份验证和元数据请求。

我们将在 lustre-mds1 实例上装载文件系统,以便稍后对其进行测试。执行以下命令:

sudo mkdir /mnt/lustre
sudo mount -t lustre lustre-mds1:/lustre /mnt/lustre
cd /mnt/lustre

这三个命令分别执行以下三项操作。第一个命令会创建一个本地目录,我们将其用作“/mnt/lustre”的装载点。第二个命令运行“mount”命令来装载“lustre”类型的文件系统,该系统位于 lustre-mds1 服务器上,文件系统名称为“lustre”(看作“/lustre”)。mount 命令会将 Lustre 文件系统装载到本地“/mnt/lustre”目录。最后,第三个命令会将目录更改为挂载 Lustre 的 /mnt/lustre 目录。

您现在已在 /mnt/lustre 处装载 Lustre 文件系统。我们来看看这个文件系统能做些什么。

6. Lustre CLI 工具简介

如果您不熟悉 Lustre 及其工具,我们将在此处介绍一些重要命令。

Lustre 的低级集群管理工具是“lctl”。我们可以使用 lctl 配置和管理 Lustre 集群,以及查看 Lustre 集群的服务。如需查看新 Lustre 集群中的服务和实例,请执行以下命令

sudo lctl dl

您将会看到类似以下内容的输出,具体取决于您对 Lustre YAML 配置文件所做的更改:

  0 UP osd-ldiskfs lustre-MDT0000-osd lustre-MDT0000-osd_UUID 11
  1 UP mgs MGS MGS 12
  2 UP mgc MGC10.128.15.2@tcp 374e2d80-0b31-0cd7-b2bf-de35b8119534 4
  3 UP mds MDS MDS_uuid 2
  4 UP lod lustre-MDT0000-mdtlov lustre-MDT0000-mdtlov_UUID 3
  5 UP mdt lustre-MDT0000 lustre-MDT0000_UUID 12
  6 UP mdd lustre-MDD0000 lustre-MDD0000_UUID 3
  7 UP qmt lustre-QMT0000 lustre-QMT0000_UUID 3
  8 UP lwp lustre-MDT0000-lwp-MDT0000 lustre-MDT0000-lwp-MDT0000_UUID 4
  9 UP osp lustre-OST0000-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 10 UP osp lustre-OST0002-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 11 UP osp lustre-OST0001-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 12 UP osp lustre-OST0003-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4

我们可以将 Lustre 管理服务器 (MGS) 视为第 1 项,将 Lustre 元数据服务器 (MDS) 视为第 3 项,将 Lustre 元数据目标 (MDT) 视为第 5 项,将 4 个 Lustre 对象存储服务器 (OSS) 视为第 8 项至第 12 项。如需了解其他服务,请参阅 Lustre 手册

Lustre 的文件系统配置工具为“lfs”。我们可以使用 lfs 来管理 Lustre 对象存储服务器 (OSS) 及其各自的对象存储目标 (OST) 中的文件分块,以及运行 find、df 和配额管理等常见文件系统操作。

利用剥离功能,我们可以配置文件在整个 Lustre 集群中的分布方式,以尽可能提供最佳性能。虽然将大型文件拆分到尽可能多的 OSS 中通常可以通过并行化 I/O 实现最佳性能,但与仅将文件写入单个实例相比,拆分小文件可能会导致性能下降。

为了对此进行测试,我们设置两个目录,一个的条带计数为 OSS,另一个目录的条带计数为“-1”,这表示在该目录中写入的文件应分布到尽可能多的 OSS。目录可以包含由其中创建的文件继承的剥离配置,但如果需要,您可以将该目录中的子目录和各个文件配置为以不同的方式进行剥离。要创建这两个目录,请在“/mnt/lustre”目录中执行以下命令:

sudo mkdir stripe_one
sudo mkdir stripe_all
sudo lfs setstripe -c 1 stripe_one/
sudo lfs setstripe -c -1 stripe_all/

您可以使用 lfs gettripe 查看文件或目录的条带设置:

sudo lfs getstripe stripe_all/

您将看到输出中显示设置为 -1 的条带计数:

stripe_all/
stripe_count:  -1 stripe_size:   1048576 pattern:    raid0 stripe_offset: -1

现在,我们可以测试通过将大文件分片写入多个 OSS 可以实现的性能提升。

7. 测试 Lustre I/O

我们将对 Lustre IO 运行两项简单的测试,以展示 Lustre 文件系统可能具有的性能优势和扩缩能力。首先,我们将使用“dd”实用程序运行一个简单的测试,将一个 5GB 的文件写入“stripe_one”目录。执行以下命令:

sudo dd if=/dev/zero of=stripe_one/test bs=1M count=5000

将 5GB 数据写入文件系统的过程平均约 27 秒,写入单个对象存储服务器 (OSS) 上的单个永久性磁盘 (PD)。

如需跨多个 OSS(因此是多个 PD)测试剥离,只需更改要写入的输出目录即可。执行以下命令:

sudo dd if=/dev/zero of=stripe_all/test bs=1M count=5000

请注意,我们已将“of=stripe_one/test”更改为“of=stripe_all/test”。这样一来,单个数据流写入将会在所有对象存储服务器中分布写入,并平均在 5.5 秒内完成写入,速度比使用四个 OSS 时快了约 4 倍。

随着您添加对象存储服务器,此性能将持续提升。您可以通过在线文件系统添加 OSS,并开始将数据条带到这些服务器,以提高在线容量和性能。在 Google Cloud Platform 上使用 Lustre 的可能性是无穷无尽的,我们期待看到您能构建什么样的应用,解决什么样的问题。

8. 总结

恭喜,您已在 Google Cloud Platform 上创建了 Lustre 集群!您可以使用这些脚本作为起点,构建自己的 Lustre 集群,并将其与基于云计算集群集成。

清理部署

退出 Lustre 节点:

exit

完成部署后,您可以在退出 Lustre 集群后,通过 Google Cloud Shell 执行以下命令,轻松清理部署:

gcloud deployment-manager deployments delete lustre

出现提示时,请输入 Y 以继续。此操作可能需要一些时间,请耐心等待。

删除项目

要清理,我们只需删除项目即可。

  • 在导航菜单中选择“IAM 和管理”
  • 然后,点击子菜单中的“设置”
  • 点击带有“Delete Project”字样的垃圾桶图标
  • 按照提示操作

所学内容

  • 如何使用 GCP Deployment Manager 服务。
  • 如何在 GCP 上配置和部署 Lustre 文件系统。
  • 如何配置剥离和测试 Lustre 文件系统的简单 I/O。

寻求支持

您正在使用 Lustre Deployment Manager 脚本构建炫酷软件吗?有疑问?在 Google Cloud Lustre 论坛中与我们交流。如需请求功能、提供反馈或报告错误,请使用此表单,也可以随时修改代码并提交拉取请求!想与 Google Cloud 专家交谈?立即通过 Google Cloud 的高性能计算网站与 Google Cloud 团队联系。

了解详情

反馈

使用此链接提交有关此 Codelab 的反馈。只需不到 5 分钟即可完成反馈。谢谢!