设计新Xlator扩展GlusterFS
1. GlusterFS概述
GlusterFS是一个开源的分布式文件系统,具有强大的Scale-Out横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。
GlusterFS支持运行在任何标准IP网络上标准应用程序的标准客户端,用户可以在全局统一的命名空间中使用Glusterfs/NFS/CIFS等标准协议来访问应用数据。GlusterFS使得用户可摆脱原有的独立、高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理、横向扩展、虚拟化的存储池,存储容量可扩展至TB/PB级。Glusterfs的深入剖析请参考”GlusterFS集群文件系统研究”一文。GlusterFS主要特征如下:
1) 扩展性和高性能
2) 高可用性
3) 全局统一命名空间
4) 弹性哈希算法
5) 弹性卷管理
6) 基于标准协议
2. Xlator工作原理
GlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可靠性。
GlusterFS堆栈式设计思想源自GNU/Hurd微内核操作系统,具有很强的系统扩展能力,系统设计实现复杂性降低很多,基本功能模块的堆栈式组合就可以实现强大的功能。基本模块称为Translator,它是GlusterFS提供的一种强大文件系统功能扩展机制,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。
GlusterFS中所有的功能都通过Translator机制实现,服务端与客户端模块接口是兼容的,同一个translator可同时在两边加载。每个translator都是SO动态库,运行时根据配置动态加载。每个模块实现特定基本功能,比如Cluster, Storage, Performance, Protocol,Features等,基本简单的模块可以通过堆栈式的组合来实现复杂的功能,Translator可以把对外部系统的访问转换成目标系统的适当调用。大部分模块都运行在客户端,比如合成器、I/O调度器和性能优化等,服务端相对简单许多。客户端和存储服务器均有自己的存储栈,构成了一棵Translator功能树,应用了若干模块。模块化和堆栈式的架构设计,极大降低了系统设计复杂性,简化了系统的实现、升级以及系统维护。
Gluster卷Translator栈图
GlusterFS概念中,由一系列translator构成的完整功能栈称之为Volume(如上图所示),分配给一个volume的本地文件系统称为brick,被至少一个translator处理过的brick称为subvolume。FUSE模块位于客户端,POSIX模块位于服务器端,它们通常是volume中首个或最后一个模块,依赖于访问数据流的方向。中间部分会再加入其他功能的模块,构成一个完整的volume,这些模块通过一张图(graph)有机结合在一起。这是一种多层设计,运行时通过有序地向上或向下调用相邻模块接口来传递消息,调用关系由每个模块根据自身功能和translator图来决定。由translator实现的卷的完整数据流,如下图所示。
GlusterFS数据流
3. Xlator结构和相关API
Xlator是高度模块化的组件,具有良好定义的内部结构,包括结构体和接口函数原型定义。因此,要实现一个xlator,必须严格按照定义来实现,具体讲就是要实现xlator.h中定义的xlator_fops、xlator_cbks、init、fini、volume_options等结构体中的参数和函数指针,描述如下:
volume test-posix type storage/posix option directory /data/test-1end-volumevolume test-null type null/null subvolumes test-posixend-volumevolume test-access-control type features/access-control subvolumes test-nullend-volume… …OK,现在重启glusterd服务,然后mount这个卷,就可以测试null xlator功能了。当然,你可能什么功能都测试不出来,因为我们什么功能都没实现。
7. 参考资料
[1] Translator 101 Lesson 1: Setting the Stage, http://hekafs.org/index.php/2011/11/translator-101-class-1-setting-the-stage/
[2] Translator 101 Lesson 2: init, fini, and privatecontext, http://hekafs.org/index.php/2011/11/translator-101-lesson-2-init-fini-and-private-context/
[3] Translator 101 Lesson 3: This Time For Real, http://hekafs.org/index.php/2011/11/translator-101-lesson-3-this-time-for-real/
[4] Translator 101 Lesson 4: Debugging a Translator, http://hekafs.org/index.php/2011/11/translator-101-lesson-4-debugging-a-translator/
[5] GlusterFS Translator API, http://hekafs.org/dist/xlator_api_2.html
[6] GlusterFS translator concepts, http://www.gluster.org/community/documentation/index.php/GlusterFS_Concepts#Translator
[7] GlusterFS rot-13 translator, https://github.com/jdarcy/glusterfs/tree/master/xlators/encryption/rot-13
[8] GlusterFS read-only translator, https://github.com/jdarcy/glusterfs/tree/master/xlators/features/read-only
[9] GlusterFS bypass translator, https://github.com/jdarcy/bypass
[10] GlusterFSnegative-lookup translator, https://github.com/jdarcy/negative-lookup
[11] GlusterFS集群文件系统研究, http://blog.csdn.net/liuben/article/details/6284551