Lustre 分布式文件系统
网络或存储管理员的职业生涯中总会遇到
需要将大量存储卷池化在一起的时候,
并在集群或多客户端网络中分发,同时
在访问相同文件时保持高性能且几乎没有瓶颈。
这就是 Lustre 发挥作用的地方。Lustre
文件系统是一个高性能分布式文件系统,旨在用于
更大的网络和高可用性环境。
存储区域网络和 Linux
传统上,Lustre 配置为管理存储区域网络 (SAN) 内的远程数据存储磁盘
设备,该网络是两个或多个
通过小型计算机系统接口进行通信的远程连接磁盘设备
接口 (SCSI) 协议。这包括光纤通道、以太网光纤通道
(FCoE)、串行连接 SCSI (SAS) 甚至 iSCSI。为了更好地
解释什么是 SAN,从它不是什么开始可能更有益。
例如,SAN 不应与局域网混淆
(LAN),即使该 LAN 承载存储流量(即,通过网络文件系统共享等等)。只有当 LAN 使用
iSCSI 或 FCoE 协议承载存储流量时,才能将其视为 SAN。另一个
SAN 不是网络附加存储 (NAS)。同样,
SAN 严重依赖 SCSI 协议,而 NAS 使用 NFS 和
SMB/CIFS 文件共享协议。
外部存储目标设备会将存储卷表示为
SAN 内的逻辑单元。通常,一组逻辑单元将
跨 SAN 映射到启动器节点——在我们的例子中,它将是
管理 Lustre 文件系统的服务器。反过来,服务器将
在其 SCSI 子系统中识别一个或多个 SCSI 磁盘设备,并将它们视为
它们就像本地驱动器一样。识别出的 SCSI 磁盘数量
由映射到启动器的逻辑单元数量决定。如果
您想按照此处的示例进行操作,配置几个虚拟机相对简单:
一个作为服务器节点,带有
一个或多个额外的磁盘设备用于导出,第二个作为
客户端节点并挂载启用 Lustre 的卷。虽然这是一种不好的
做法,但出于测试目的,也可以使用单个
虚拟机配置为服务器和客户端。
SCSI
SCSI 是 ANSI 标准化的硬件和软件计算
接口,被所有早期存储制造商采用。修订版
该标准至今仍在使用。
分布式文件系统
分布式文件系统允许从共享计算机网络的多个主机访问文件。
这使得多个
多个客户端节点上的用户可以共享文件和存储资源。客户端
节点无法直接访问底层块存储
而是通过网络使用协议进行交互,因此可以
根据服务器和客户端上的访问列表或
功能限制对文件系统的访问,这与集群文件系统不同,在集群文件系统中,所有节点都具有对块存储的平等访问权限,文件系统位于该块存储上。
在这些系统上,访问控制必须驻留在
客户端上。利用分布式文件系统的其他优势包括
它们可能涉及透明复制的工具
和容错。因此,当文件系统中有限数量的节点
脱机时,系统会继续工作而不会丢失任何数据。
Lustre(或 Linux 集群)就是这样一种分布式文件系统,
通常部署用于大规模集群计算。根据
GNU 通用公共许可证 (GPL) 获得许可,Lustre 提供了一种解决方案,
其中高性能和可扩展性达到数万个节点
和 PB 级存储成为现实,并且相对容易
部署和配置。尽管 Lustre 2.0 已发布,
但对于本文,我使用的是普遍可用的 1.8.5。
Lustre 包含一种独特的架构,具有三个主要
功能单元。一个是单个元数据服务器或 MDS,其中包含
每个 Lustre 文件系统的单个元数据目标或 MDT。这
存储命名空间元数据,包括文件名、目录、访问
权限和文件布局。MDT 数据存储在映射到服务节点的本地磁盘文件系统中,并且是专用文件系统
,用于控制文件访问并告知客户端节点构成文件的对象。
其次是一个或多个对象存储服务器 (OSS),它们
在一个或多个对象存储目标或 OST 上存储文件数据。OST 是
为读/写操作导出的专用基于对象的文件系统。Lustre 文件系统的
容量由 OST 的总容量之和决定。
最后,客户端访问并
使用文件数据。
Lustre 为所有客户端提供统一的命名空间
,用于文件系统中所有文件和数据,从而允许并发
和一致地读写文件系统中的文件。当
客户端访问文件时,它会在 MDS 上完成文件名查找,
要么创建一个新文件,要么将现有文件的布局
返回给客户端。锁定 OST 上的文件后,客户端将
然后对文件运行一个或多个读取或写入操作,但不会
直接修改 OST 上的对象。相反,它会将任务委托给
OSS。这种方法将确保可扩展性和更高的安全性和
可靠性,因为它不允许直接访问底层存储,
从而降低了行为不端/有缺陷的客户端导致文件系统损坏的风险。尽管所有三个组件(MDT、OST 和客户端)
都可以在同一节点上运行,但它们通常配置在单独的
节点上,通过网络进行通信(有关 LNET 的详细信息,请参见本文后面的内容
文章)。在
此示例中,我将在单个服务器节点上运行 MDT 和 OST
,而客户端将从单独的节点访问 OST。
安装 Lustre
要获取 Lustre 1.8.5,请下载 RPM 中预构建的二进制文件,
或下载源代码并为您的
相应 Linux 发行版构建模块和实用程序。Oracle 提供服务器 RPM 包
,适用于 Oracle Enterprise Linux (OEL) 5 和 Red Hat Enterprise Linux
(RHEL) 5,同时还为 OEL 5、RHEL 5 提供客户端 RPM 包
和 SUSE Linux Enterprise Server (SLES) 10,11。如果您将从源代码构建
Lustre,请确保您使用的是 Linux
内核 2.6.16 或更高版本。请注意,在 Lustre 的所有部署中,
在 MDS、MGS(下面讨论)或 OSS 上运行的服务器必须使用
修补后的内核。在 Lustre 客户端上运行修补后的内核是可选的
,只有当客户端将用于多种用途时才需要,
例如同时作为客户端和 OST 运行。
如果您已经拥有受支持的操作系统,
请确保修补后的内核、lustre-modules、lustre-ldiskfs (a
用于 ext3 文件系统的 Lustre 修补的后备文件系统内核模块包)、lustre(包括用于配置和运行的用户空间实用程序
Lustre)和 e2fsprogs 包已安装在主机系统上,同时
还从本地或远程存储库解析其依赖项。使用
rpm 命令安装所有必要的软件包
$ sudo rpm -ivh kernel-2.6.18-194.3.1.0.1.el5_lustre.1.8.4.i686.rpm
$ sudo rpm -ivh lustre-modules-1.8.4-2.6.18_194.3.1.0.1.el5_
↪lustre.1.8.4.i686.rpm
$ sudo rpm -ivh lustre-ldiskfs-3.1.3-2.6.18_194.3.1.0.1.el5_
↪lustre.1.8.4.i686.rpm
$ sudo rpm -ivh lustre-1.8.4-2.6.18_194.3.1.0.1.el5_
↪lustre.1.8.4.i686.rpm
$ sudo rpm -ivh e2fsprogs-1.41.10.sun2-0redhat.oel5.i386.rpm
安装这些软件包后,列出引导目录以
显示新安装的修补后的 Linux 内核
[petros@lustre-host ~]$ ls /boot/
config-2.6.18-194.3.1.0.1.el5_lustre.1.8.4
grub
initrd-2.6.18-194.3.1.0.1.el5_lustre.1.8.4.img
lost+found
symvers-2.6.18-194.3.1.0.1.el5_lustre.1.8.4.gz
System.map-2.6.18-194.3.1.0.1.el5_lustre.1.8.4
vmlinuz-2.6.18-194.3.1.0.1.el5_lustre.1.8.4
查看 /boot/grub/grub.conf 文件以验证新安装的
内核是否已设置为默认内核。现在所有软件包都已
安装,需要重新启动以加载新的内核映像。一旦
系统重新启动,调用 uname 命令将
显示当前启动的内核映像
[petros@lustre-host ~]$ uname -a
Linux lustre-host 2.6.18-194.3.1.0.1.el5_lustre.1.8.4 #1
↪SMP Mon Jul 26 22:12:56 MDT 2010 i686 i686 i386 GNU/Linux
同时,在客户端,lustre 客户端的软件包
(用于无补丁客户端的实用程序)和 lustre 客户端模块(用于
无补丁客户端的模块)需要在所有所需的客户端机器上安装
$ sudo rpm -ivh lustre-client-1.8.4-2.6.18_194.3.1.0.1.el5_
↪lustre.1.8.4.i686.rpm
$ sudo rpm -ivh lustre-client-modules-1.8.4-2.6.18_194.3.1.0.1.el5_
↪lustre.1.8.4.i686.rpm
请注意,这些客户端机器需要与
主机(为 Lustre 文件系统提供服务的主机)位于同一网络中。安装软件包后
,重新启动所有受影响的客户端机器。
配置 Lustre 服务器
为了配置 Lustre 文件系统,您需要配置
Lustre 网络或 LNET,它提供 Lustre 文件系统所需的通信
基础设施。LNET 支持
许多常用的网络类型,包括 InfiniBand 和 IP
网络。它允许跨多种网络同时可用
类型,并在它们之间进行路由。在此示例中,让我们使用
tcp,因此请使用您喜欢的编辑器将以下行附加到
/etc/modprobe.conf 文件
options lnet networks=tcp
此步骤限制 LNET 仅使用指定的网络接口
,并防止 LNET 使用所有网络接口。
在继续之前,重要的是讨论管理
服务器或 MGS 的角色。MGS 存储集群设置中所有 Lustre
文件系统的配置信息。OST 联系 MGS 以
提供信息,而客户端联系 MGS 以检索
信息。MGS 需要自己的磁盘进行存储,尽管有一个
规定允许 MGS 与单个 MDT 共享磁盘。输入
以下命令以创建组合的 MGS/MDT 节点
[petros@lustre-host ~]$ sudo /usr/sbin/mkfs.lustre
↪--fsname=lustre --mgs --mdt /dev/sda1
Permanent disk data:
Target: lustre-MDTffff
Index: unassigned
Lustre FS: lustre
Mount type: ldiskfs
Flags: 0x75
(MDT MGS needs_index first_time update )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters: mdt.group_upcall=/usr/sbin/l_getgroups
device size = 1019MB
2 6 18
formatting backing filesystem ldiskfs on /dev/sda1
target name lustre-MDTffff
4k blocks 261048
options -i 4096 -I 512 -q -O dir_index,uninit_groups -F
mkfs_cmd = mke2fs -j -b 4096 -L lustre-MDTffff -i 4096 -I 512 -q -O
↪dir_index,uninit_groups -F /dev/sda1 261048
Writing CONFIGS/mountdata
如果未提供任何内容,则默认情况下,fsname 为 lustre。如果一个或
多个文件系统已创建,则必须使用唯一
名称用于每个标记卷。这些名称在
您在客户端系统上访问目标时变得非常重要。
通过执行以下命令创建 OST
[petros@lustre-host ~]$ sudo /usr/sbin/mkfs.lustre --ost
↪--fsname=lustre --mgsnode=10.0.2.15@tcp0 /dev/sda2
Permanent disk data:
Target: lustre-OSTffff
Index: unassigned
Lustre FS: lustre
Mount type: ldiskfs
Flags: 0x72
(OST needs_index first_time update )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=10.0.2.15@tcp
checking for existing Lustre data: not found
device size = 1027MB
2 6 18
formatting backing filesystem ldiskfs on /dev/sda2
target name lustre-OSTffff
4k blocks 263064
options -J size=40 -i 16384 -I 256 -q -O
↪dir_index,extents,uninit_groups -F
mkfs_cmd = mke2fs -j -b 4096 -L lustre-OSTffff
↪-J size=40 -i 16384 -I 256 -q -O
↪dir_index,extents,uninit_groups -F /dev/sda2 263064
Writing CONFIGS/mountdata
当目标需要向 MGS 提供信息或客户端
访问目标以进行信息查找时,所有这些也都需要
知道 MGS 的位置,您已为此目标定义了 MGS 的位置
作为服务器的 IP 地址,后跟用于
通信的网络接口。这只是提醒您,接口已定义
在 /etc/modprobe.conf 文件中更早的位置。
现在您可以轻松地将这些新格式化的设备本地挂载到主机
机器。挂载 MDT
[petros@lustre-host ~]$ sudo mkdir -p /mnt /mdt
[petros@lustre-host ~]$ sudo mount -t lustre /dev/sda1 /mnt/mdt/
使用 df 命令验证它是否已挂载
[petros@lustre-host ~]$ df -t lustre
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 913560 17752 843600 3% /mnt/mdt
/var/log/messages 文件将记录以下消息
Jun 25 10:26:54 lustre-host kernel: Lustre: lustre-MDT0000:
↪new disk, initializing
Jun 25 10:26:54 lustre-host kernel: Lustre: lustre-MDT0000:
↪Now serving lustre-MDT0000 on /dev/sda1 with recovery enabled
Jun 25 10:26:54 lustre-host kernel: Lustre:
↪3285:0:(lproc_mds.c:271:lprocfs_wr_group_upcall())
↪lustre-MDT0000: group upcall set to /usr/sbin/l_getgroups
Jun 25 10:26:54 lustre-host kernel: Lustre: lustre-MDT0000.mdt:
↪set parameter group_upcall=/usr/sbin/l_getgroups
挂载 OST
[petros@lustre-host ~]$ sudo mkdir -p /mnt /ost
[petros@lustre-host ~]$ sudo mount -t lustre /dev/sda2 /mnt/ost/
使用 df 命令验证它是否已挂载
[petros@lustre-host ~]$ df -t lustre
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 913560 17768 843584 3% /mnt/mdt
/dev/sda2 1035692 42460 940620 5% /mnt/ost
/var/log/messages 文件将记录以下消息
Jun 25 10:41:33 lustre-host kernel: Lustre:
↪lustre-OST0000: new disk, initializing
Jun 25 10:41:33 lustre-host kernel: Lustre:
↪lustre-OST0000: Now serving lustre-OST0000 on
↪/dev/sda2 with recovery enabled
Jun 25 10:41:39 lustre-host kernel: Lustre:
↪3417:0:(mds_lov.c:1155:mds_notify()) MDS lustre-MDT0000:
↪add target lustre-OST0000_UUID
Jun 25 10:41:39 lustre-host kernel: Lustre:
↪3188:0:(quota_master.c:1716:mds_quota_recovery())
↪Only 0/1 OSTs are active, abort quota recovery
Jun 25 10:41:39 lustre-host kernel: Lustre: lustre-OST0000:
↪received MDS connection from 0@lo
Jun 25 10:41:39 lustre-host kernel: Lustre: MDS lustre-MDT0000:
↪lustre-OST0000_UUID now active, resetting orphans
即使它们像典型文件系统一样挂载,您也会注意到
MDT 和 OST 标记卷不包含典型的文件系统
特征。这就是客户端将发挥作用的地方
[petros@lustre-host ~]$ ls /mnt/ost/
ls: /mnt/ost/: Not a directory
[petros@lustre-host ~]$ sudo ls /mnt/ost/
ls: /mnt/ost/: Not a directory
[petros@lustre-host ~]$ sudo ls -l /mnt/
total 4
d--------- 1 root root 0 Jun 25 10:22 ost
d--------- 1 root root 0 Jun 25 10:22 mdt
配置 Lustre 客户端
请记住,您将启用 Lustre 的卷命名为 lustre。当您在客户端节点上通过网络挂载
卷时,您必须指定此
名称。这可以在下面通过网络方法 (tcp0) 观察到
,您通过该方法挂载远程卷。同样,TCP 在
/etc/modprobe.conf 文件中为支持的 LNET 网络接口定义
[petros@client1 ~]$ sudo mkdir -p /lustre
[petros@client1 ~]$ sudo mount -t lustre
↪10.0.2.15@tcp0:/lustre /lustre/
成功挂载远程卷后,您将看到
/var/log/messages 文件附加
Jun 25 10:44:17 client1 kernel: Lustre:
↪Client lustre-client has started
使用 df 列出挂载的启用 Lustre 的卷
[petros@client1 ~]$ df -t lustre
Filesystem 1K-blocks Used Available Use% Mounted on
10.0.2.15@tcp0:/lustre 1035692 42460 940556 5% /lustre
挂载后,客户端节点现在可以访问文件系统。对于
例如,您无法从挂载的
OST 上的文件读取或写入。在以下示例中,让我们写入大约 40MB 的
数据到 /lustre 上的新文件
[petros@client1 lustre]$ sudo dd if=/dev/zero
↪of=/lustre/test.dat bs=4M count=10
10+0 records in
10+0 records out
41943040 bytes (42 MB) copied, 1.30103 seconds, 32.2 MB/s
df 列表将反映 /lustre 挂载点的可用和已用容量的变化
到 /lustre 挂载点
[petros@client1 lustre]$ df -t lustre
Filesystem 1K-blocks Used Available Use% Mounted on
10.0.2.15@tcp0:/lustre 1035692 83420 899596 9% /lustre
[petros@client1 lustre]$ ls -l
total 40960
-rw-r--r-- 1 root root 41943040 Jun 25 10:47 test.dat
总结
虽然我介绍了 Lustre 的简单介绍和教程
分布式文件系统,但仍有许多未知的领域
和方法,通过这些方法可以为真正
丰富的计算环境配置文件系统。例如,可以配置 Lustre
以实现高可用性,以确保在发生故障的情况下,
系统服务继续不间断地运行。
也就是说,客户端、服务器和外部
目标存储之间的可访问性始终通过称为故障转移的过程来实现。
通过在某种 RAID(硬件或通过 mdadm 的软件)中实现磁盘驱动器
冗余,为驱动器故障事件提供额外的 HA。
这些高可用性技术通常适用于托管
MDS 和 OSS 的服务器节点。建议将 OST 存储放在 RAID 5 或
,最好是 RAID 6 上,而 MDT 存储应为 RAID 1 或 RAID 0+1。
它不是一项难以使用的技术;但是,仍然
存在一个由优秀的管理员和开发人员组成的完整社区
资源,范围从文章、邮件列表等等,以帮助
新手安装和维护启用 Lustre 的系统。商业
对 Lustre 的支持由大量供应商提供
销售捆绑式计算和 Lustre 存储系统。许多相同的
供应商也为围绕
Lustre 项目的开源社区做出贡献。
故障转移
故障转移是一种能够在以下情况下自动切换
到冗余或备用计算机服务器、系统或网络的过程
以前活动的应用程序发生故障或异常终止、
服务器、系统或网络。Linux 平台上存在许多故障转移解决方案
,以覆盖 SAN 和 LAN 环境。
资源
Lustre 项目页面:http://wiki.lustre.org/index.php
维基百科:Lustre:http://en.wikipedia.org/wiki/Lustre_(file_system)
维基百科:分布式文件系统:http://en.wikipedia.org/wiki/Distributed_file_system