2022-08-17 11:41:07
浏览数 (1)
Lustre 如何工作的
Lustre 架构说明
- lustre是一个基于对象的分布式文件系统。它核心有三个组件元数据服务(mds)、对象存储服务(oss)和客户端(client).lustre采用块设备来存储文件和元数据,每个块设备由单一独立的lustre服务来管理。比如lustre的元数据服务,元数据需要存储在块设备上,元数据进程需要把元数据写入到这个块设备上。lustre的总容量是所有的ost(oss管理的块设备)之和。lustre客户端是通过标准的Posix/IO的系统调用。
- MDS(metadata servers), 在lustre服务端提供元数据服务,在客户端(lustre client)中有一个MDC(metadata client)的模块来访问MDS.每个MDS管理一个MDT(metadata target,本质就是一个磁盘设备),每个MDT存储文件的元数据,包括文件的名称、目录结构、访问权限等
- MGS(management server),提供整个lustre文件系统的配置信息
- OSS(object storage server),在服务测暴露块设备和提供实际用户数据存储的服务,对应的在lustre的客户端有一个OSC(object storage client)模块来访问服务端的OSS.用户的真实数据是存储在OSS管理的OST上.
- MDS/MGS、OSS/OST属于lustre的服务的前端组件,ldiskfs是lustre的后端组件
Lustre Client
- Linux中通过VFS的read/write/open等接管口访问lustre 的Posix文件系统。每个文件的请求都会经过整个lustre的软件栈。在lustre文件系统中文件的元数据存储在MDS上。而客户端中的MDS是通过客户端模块中的MDC.
- 从MDS的视角来看,每个文件是有对个数据对象组成(每个文件被分割成固定大小的块,存储在一个或者多个OST上)。每个文件的layout被定义在文件的inode中的extended attribute(EA).EA描述了文件被分割为多个对象,在一个或者多个OST上的映射关系。例如一个文件File1,大小是12M,假设每个对象的被分割的大小为4M,则这个文件File被分割为3个对象,每个文件对象存储分别存储在p1、p2、p3这三个OST中。这个File1的EA如下
代码语言:javascript
复制EA --------> <obj id 1,ost p1)
<obj id 2,ost p2)
<obj id 3,ost p3)
- Client读File1的流程
- 当客户端需要读取File1时候,通过client的MDC模块请求MDS获取File1的EA信息
- 然后Client通过OSC模块把File1的EA信息发送给OST。
- lustre中的客户端和服务端之间通信都是通过RPC。在lustre袁大妈中,这个中间层采用了Portal RPC.它起到了2个作用,第一是转换和中断文件系统请求给LNET;第二是从LNET中获取文件系统中断的请求和响应。
Lustre OSS
- 在架构底层的OSS Stack和LNET、Portal-RPC位置类似,但是OSS最重要的是处理数据请求而非元数据的请求,元数据请求是通过MDS.从整个Lustre软件栈来看,OST扮演的角色就像调度者。通常来讲,Lustre有2中类型的请求,一种是lock相关的;另外一种是data相关的。请求处理的模型是从ldlm(lustre分布式锁管理)到obfilter(用来把lustre请求转换为后端文件系统的请求,这个需要借助fsfilt,fsfilt更像是一个vfs层)。lustre的默认后端文件系统是采用了ldiskfs.
Lustre MDS
- MDS的stack和OSS stack有些类似,但是它们的主要区别是MDS软件栈是没有obdfilter模块。这是专门处理请求的元数据操作,MDS采用不同的记录日志的方式,它是在直接调用VFS API之前启动一个事务