用Linux山寨一个分布式文件系统
话说目前市面上绝大部分的集群文件系统都是从Linux上开发出来的,所以有一天我突然想到那些所谓企业化的套件,其实我们也是可以山寨出一个,然后自己出个发行版,比如效仿glusterFS或mooseFS那种做法,于是写下此文。
最近由于"云"这个概念的崛起,各种分布式文件系统也如雨后春笋那般遍地发芽。在我的印象里,分为两大类。一种是以单台元数据服务器(MDS,MDC)和多台IO节点服务器组成的的架构,典型的比如Stornext和Lustre;另一种是没有独立的元数据服务器,而把元数据分散到各个IO节点中的架构,比如Ibrix和GlusterFS等。这两种结构也各有其优缺点。
如今绝大部分的分布式文件系统都是基于*nix平台的,并且Linux下的居多,只有个别的除外(微软的DFS)。所以我灵光一闪,何不用各种开源的包和工具自己山寨出一个呢?
底层的存储部分无论DAS或者SAN,我们均可以用Linux的LVM拼接出一个大卷;或者不使用MBR,而直接改用GPT来引导。这样,可以突破2TB容量的限制。利用device mapper来实现存储部分的linear,mirror,stripe等策略,以及multi-path机制。
文件系统部分,我们可以先挂载ext3,然后用FUSE来实现用户层文件系统跨服务器的拼接。让一个单一的命名空间跨越多台IO节点服务器。FUSE通过RPC服务实现IO节点服务器和元数据服务器之间的通信。
集群和高可用性可以这样设置,来达到容错的效果。各台IO节点服务器之间通过CVS来做集群;而元数据服务器可以设主备共两台,通过heartbeat来实现HA切换,active-standby模式。各个IO节点服务器安装DRBD,来实现file raid的功能,即每次写入一文件,会写两份,同时分散到2个节点服务器所抓的卷中。
对于用户层,各台IO节点可以使用samba,nfs等手段进行共享,并且用户看到的应该是一个单一命名空间,这个空间跨越了所有的节点服务器。如果条件允许的话,甚至可以用python或perl配合apache或tomcat开发一个GUI,类似webmin那样的以简化用户的操作。
剩下的便是那些附加的功能了。使用LDAP,或者winbind走NIS域与windows AD连接来达到对用户的账号控制;使用ACL和quota来达到对用户的权限和配额控制,等等。
总体的框架如上,不过具体实施起来应该会碰到很多问题,撇开脚本和python先不说,光协调好如此多的系统服务,已经很难了......