https://www.lustre.org/
.lustre的官方的代码仓库 git clone git://git.whamcloud.com/fs/lustre-release.git
lfs setstripe
来进行设置,默认的情况数据会在单个lustre后端服务器上,如果设置stripe大于1的情况,数据会被分片到多个lustre后端服务器上。MGS,MDS,OSS节点是在lustre中可以成为前端,MDT和IST被ldiskfs或者zfs格式化来存储元数据和数据对象的成为后端
stripe
,通过lfs setstripe
和lfs getstripe
设置和获取单个文件的stripe
信息.
// 环境是: lustre 2.14版本,一个server部署3个ost和1个mgs/mds
// 创建2个目录,一个目录设置stripe=3(3个ost),另外一个目录采用默认stripe=1
[root@CentOS-Lustre-Client ~]$ mkdir /mnt/lustre/stripe_1_data
[root@CentOS-Lustre-Client ~]$ mkdir /mnt/lustre/stripe_3_data
// 采用默认的stripe布局
[root@CentOS-Lustre-Client ~]$ lfs getstripe /mnt/lustre/stripe_1_data/
/mnt/lustre/stripe_1_data/
stripe_count: 1 stripe_size: 1048576 pattern: 0 stripe_offset: -1
// 设置stripe=3,每个stripe的大小为1MB
[root@CentOS-Lustre-Client ~]$ lfs setstripe -S 1M -c 3 /mnt/lustre/stripe_3_data/
[root@CentOS-Lustre-Client ~]$ lfs getstripe /mnt/lustre/stripe_3_data/
/mnt/lustre/stripe_3_data/
stripe_count: 3 stripe_size: 1048576 pattern: raid0 stripe_offset: -1
// 拷贝3.6M文件到stripe_1_data和stripe_3_data目录
[root@CentOS-Lustre-Client ~]$ ls -l -1h go.tar.gz
-rw-r--r--. 1 root root 3.6M Jan 17 10:48 go.tar.gz
[root@CentOS-Lustre-Client ~]$ cp go.tar.gz /mnt/lustre/stripe_1_data/
[root@CentOS-Lustre-Client ~]$ cp go.tar.gz /mnt/lustre/stripe_3_data/
// 获取stripe_1_data的中go.tar.gz的布局,默认的情况下stripe=1,会把单个文件持续写入到单个ost上,不会跨ost写入。因此从布局信息上来看,文件仅仅只有一个文件对象。
[root@CentOS-Lustre-Client ~]$ lfs getstripe /mnt/lustre/stripe_1_data/go.tar.gz
/mnt/lustre/stripe_1_data/go.tar.gz
// lmm_stripe_count表示文件被stripe的个数
lmm_stripe_count: 1
// lmm_stripe_size表示每次文件stripe后,文件stripe的大小,默认是1MB
lmm_stripe_size: 1048576
// lmm_pattern表示布局模式
lmm_pattern: raid0
lmm_layout_gen: 0
lmm_stripe_offset: 0
// obdidx:表示所在的那个index={obdidx}的ost上,objid是对象分片,根据这个可以找到对应ost上的数据
obdidx objid objid group
0 2 0x2 0
// 当前的stripe_3_data是设置了stripe=3,每个文件的stripe大小设置为1M,所以从布局信息来看,这个文件应该有3个分片,没别在ost1,ost0,ost2上。
[root@CentOS-Lustre-Client ~]$ lfs getstripe /mnt/lustre/stripe_3_data/go.tar.gz
/mnt/lustre/stripe_3_data/go.tar.gz
lmm_stripe_count: 3
lmm_stripe_size: 1048576
lmm_pattern: raid0
lmm_layout_gen: 0
lmm_stripe_offset: 2
obdidx objid objid group
2 2 0x2 0
0 3 0x3 0
1 2 0x2 0
// lfs 命令使用
// [--stripe-count|-c <stripe_count>] [--stripe-size|-S <stripe_size>
$ lfs getstripe [--stripe-size] [--stripe-count] [--stripe-index] <directory|filename>
// lfs setstripe -c 3 -S 1M file-or-directory
$ lfs setstripe --stripe-size _stripe_size_ --stripe-count _stripe_count_ file-or-directory
// 使用复合文件布局的命令
lfs setstripe [--component-end|-E end1] [STRIPE_OPTIONS] [--component-end|-E end2] [STRIPE_OPTIONS] ... filename
// 在stripe_component_data里面每个文件的创建都是采用复合文件布局,每个文件有3个componnent,第一个component中stripe count=1,stripe size在[0M,4M];第二个component中stripe count=4(-c 4),stripe size 在[4M,64M](-E 64M);最后一个component中stripe中指定了从ost4开始(-i 4),跨所有的ost(-c -1),stripe size在[64M,EOF].
$ lfs setstripe -E 4M -c 1 -E 64M -c 4 -E -1 -c -1 -i 4 /mnt/lustre/stripe_component_data
DNE(Distribute Namespace)
,整个DNE的特性允许lustre使用多个MDS,同时均衡元数据操作的压力。在lustre的DNE特性的实现上分为多个阶段,第一个阶段是实现Remote Directories(远程目录)
,远程目录允许lustre管理员设置父目录在主的MDT上,子目录可以设置到其他的非主的MDT上,在这个非主MDT上进行文件和目录的创建,元数据都会存在设置远程目录的的这个MDT上;第二个阶段是Striped Directories(目录条带化)
,针对已经设置目录条带化的目录,这个目录的所有的文件和子目录的metadata存储都是在lustre的多个MDT上(across multiple MDTs).文件stripe有对应的stripe count,目录stripe对应的也会有stripe count来决定目录条带华分布到多少个MDT上,但是目录条带华不像是文件条带化一样基于OSTd的round-robin方式,目录条带化市基于哈希函数计算该目录的元数据应该放置到哪个MDT上。第三个阶段是auto-striped directories
,设置自动条带化的目录从stripe count=1开始,随着该目录里的子目录和文件数不断增加,动态的增加stripe count。fid(File Identifiers)
.FID是128位的字节长度去表示一个文件的对象。当访问一个文件时候,文件名称被lookup
在MDT上查找目录项时候,这个文件会以MDT对象中的FID来对应这个访问的文件。每个MDT的对象包含了一系列的扩展属性,其中的一个属性叫做Layout EA(Layout Extended Attribute)
,这个Layout EA
对于lustre客户端访问文件时候的映射表,这个映射表粗出了文件数据实际存储的位置信息,Layout EA
包含了ost的列表和访问文件的对象的FID.// lustre中针对文件对象的fid
struct lu_fid {
// 序列号
__u64 f_seq;
// object id
__u32 f_oid;
// 版本号
__u32 f_ver;
} __attribute__((packed));
// 通过fid计算出对应的inode
static inline __u64 fid_flatten(const struct lu_fid *fid)
{
__u64 ino;
__u64 seq;
if (fid_is_igif(fid)) {
ino = lu_igif_ino(fid);
return ino;
}
seq = fid_seq(fid);
ino = (seq << 24) + ((seq >> 24) & 0xffffff0000ULL) + fid_oid(fid);
return ino ?: fid_oid(fid);
}
llite
层(llite层实现了虚拟文件系统的POSIX的语义)。如果请求的是文件元数据,则路由到LMV(Logical Metadata Voliume
,LMV
是访问MDC(Metadata client)
的抽象层,对于每个MDT
都会有一个MDC
。如果访问的是数据,则路由到LOV(Logical Object Volume)
,LOV
是针对OSC(Object Storage Client)
抽象的访问层,对于lustre后端的每个OST都会有一个OSC
组件对应。lustre客户端和服务端是通过RPC(PTL-RPC)
子系统进行通信,而RPC
是运行在LNet(Lustre Networking)
子系统之上。当客户端进行IO访问的时候,发RPC请求到MDC,MDC和MDS进行交互然后打开文件,MDS响应客户端发送该文件的Layout EA
给到客户端,客户端拿到这些信息就知道文件有哪些对象和对象存储在哪些ost上,然后通过LOV/OSC
层发送请求OSS请求访问的数据,这个就lustre访问的基本流程