GlusterFS是一个高层次的分布式文件系统解决方案。通过增加一个逻辑层,对上层使用者掩盖了下面的实现,使用者不用了解也不需知道,文件的存储形式、分布。
内部实现是整合了许多存储块(server)通过Infiniband RDMA或者 Tcp/Ip方式互联的一个并行的网络文件系统,这样的许多存储块可以通过许多廉价的x86主机,通过网络搭建起来。
其相对于传统NAS 、SAN、Raid的优点就是:
1.容量可以按比例的扩展,且性能却不会因此而降低。
2.廉价且使用简单,完全抽象在已有的文件系统之上。
3.扩展和容错设计的比较合理,复杂度较低。扩展使用translator方式,扩展调度使用scheduling接口,容错交给了本地的文件系统来处理。
4.适应性强,部署方便,对环境依赖低,使用,调试和维护便利。
支持主流的linux系统发行版,包括 fc,ubuntu,debian,suse等,并已有若干成功应用。
Glusterfs是一个存储空间和访问效率都可以线性增加的一个分布式文件系统,网上资料除了gluster.org以外,几乎没有什么有关的介绍了。
通过对源码的审阅,个人感觉,比较主要的是把程序的整体结构理清,扩展方式弄明白在向下看具体的实现是比较好的。
该系统扩充的方式是使用了translator的模式,具体我还参考了《现代操作系统》中分布式文件系统章节和GNU/HURD 中解释translator的部分,后者主要是在gnu的网站上。
数 据结构上讲,整个文件系统中节点构成了一棵树,而且每个节点的操作是通过某个translator来工作的,一个节点可以附着很多的 translator。所有的translator都要实现xlator结构体和相关的xlator_fops、xlator_mops两个“成员函数的 结构体”,
Hurd 另一个重要的概念就是所谓的 translator。您可以将 translator 视为您熟习的 UNIX 其档案系统特色的实现,像 是 mount points、devices 还有 symbolic links。在 Hurd 档案系统中,每个档案都被连结到一个 叫 "translator" 的程序。当使用者程序存取这个档案时,控制权就转交给 translator 来处理。如果存取动作是读取 disk 中 真正的档案,则这种档案系统格式的 translator 会向 disk 要求资料,并传回应用程序。如果存取的是 device,则这 个 device 的 driver 会处理。同样的,在存取 symbolic link 时,translator 会直接导向到指定的位置,或是其 它的档案架构。
目前为止,translator 做到了标准 UNIX 系统无法达到的功能,它提供了 files、 device 与 symbolic link 一致的存取动作。Hurd 的 translator 还可以应用于任何种类的资料。以 FTP 存取为 例,对方系统中的档案可以直接对应至您的档案结构中 (像是 /ftp/ftp.mydomain.com/pub/myfile),您可使用原有的工具 进来拷贝、删除或是编辑。Translator 会转换到对应 FTP 动作。您可以想像其它的 translator 有那些功用,像是您可以使 用 cat 或是 ls 等工具透过 translator 来流览数据库的内容。或是网管工具可以写成 translator,网络内所有的电脑可以对 应到一个目录。Cat 可以列出网络的资料,像是机器的 IP 位址。Gateway 可以视为目录,所以执行 cd 到一个 gateway 时,可以 看到这个 gateway 下子网域所有的机器。与 server 相同的一点,translator 不要须额外的权限。任何人都可以开发自己 的 translator,除错并尝试完成,让其它使用者也可以一起使用。
从xlator “继承”下来的操作如果不自己定义,那么就会使用默认的设置,这个在default.c里面定义。当然自己定义的操作并赋值,这个过程有些象子类覆盖父类 的操作,平行来看也就是多态。当然这是从面向对象角度来看的,该系统很多地方都使用了面向对象的思想来设计的,这个和linux 2.6以后的内核模块设计是异曲同工的。
那么一般可以这样识别一个用c实现的Class关键字的类:
例(对源文件有些修改):
struct A {
char *name;
char *type; //成员
struct A *this; //this 指针
struct xlator_fops *fops; //成员操作结构体1
struct xlator_mops *mops; //成员操作结构体 2
void (*fini) (struct A *this); // 析构函数,垃圾清理
int32_t (*init) (struct A *this);//构造函数,初始化
event_notify_fn_t notify; //成员。。
dict_t *options;
glusterfs_ctx_t *ctx;
inode_table_t *itable;
char ready;
void *private;
};
1.一个struct 定义里面包含一个指针 该指针的类型是该struct定义的类型。2.上面的struct内部成员中含有其他结构体的指针,象xlator_fops就是这里提到的其他结构体的指针,该结构体里面全部都是指向函数的指针,也就是成员函数 了。
当然此处也可以把xlator_fops里面的成员都释放到struct A里面, 但是这样这个struct就显得有些臃肿了,,毕竟成员函数还是不少的。上面这个例子还有两个只有类才具备的析构函数,和构造函数。
glusterfs_ctx 控制了全局的信息,很多地方传输都是使用它来传递的,一个典型的环境类。初始化些东西也是针对它来做的。
Redhat GFS和Glusterfs的目的类似,都是以全局在一个命名空间下而通过访问其他节点获取数据的。此处没有性能比较。
Lustre也是一个开源基于GNU lisence的集群文件系统,网站资源比较丰富,开发者的资源也比较多,中文资料也不少,sun公司收购了clusterfs公司,拥有了此技术。
下面地址显示的是lustre 与glusterfs做相当命令所需时间的比较:
下面的地址是NFS与glusterfs性能的测试对比:
http://www.gluster.org/docs/index.php/GlusterFS_1.2.1-BENKI_Aggregated_I/O_vs_NFSv4_Benchmark
Ok - I just spent the last 2 hours on IRC with the glusterFS dev team -- they are definitely around and active. They have been thinking/working on glusterFS for about a year and half, the first active commit was back in September. It is very active. These guys are very responsive and very intrigued by S3 and EC2. Some of them come from old VA Linux days, and they say they have a good relationship with the Amazon folks -- anyone from Amazon want to jump in??