ADFS的现有架构从上到下分为三层,如图表 1所示: 最上层(StateManager, Zookeeper和MetaChecker)负责元数据持久化和校验,无状态的中间层(Stateless Namenode)负责事务逻辑和最底层(Datanode)负责文件块的物理存储和访问。将命名空间(Namespace)、块对应关系(BlocksMap)和Datanode信息存储到innode数据库中,避免了重启时需要通过Datanode的blockReport来构建BlocksMap和Datanode信息,提供了快速重启的必要条件。通过缓存,SSD和RAID卡来提高IO性能等来提高性能。通过MetaChecker 异步地检查元数据的正确性。Zookeeper在ADFS的架构中也承担比较重要的角色,它不仅负责记录租约,正在写入的文件,以及多块、少块和坏块等结构,而且还负责State Manager的主备选举。以后会将Zookeeper负责的namenode部分的功能放到数据库中,Zookeeper仅负责主备选举。通过配置文件,和Zookeeper替换namenode。
优点:单个namenode down掉可以快速切换,提供正常服务;元数据等持久化,namenode重启等不需要很长的时间;
缺点:元数据持久化,数据库应该有瓶颈;同时服务的仅一个namenode,因此仍然存在性能瓶颈
2.4 XFS命名空间由Master进行管理,XFS的Master通过主从热备实现了高可用解决方案,由Zookeeper实现监控、选举和切换;文件标识和块管理由独立的MetaServer进行管理,它记录了文件属性、长度以及该文件拥有的块等信息;与Datanode类似,块物理存储和访问由NodeServer负责。客户端在访问XFS时,先通过文件名在Master上获取MetaServer标识和文件标识等信息,然后在指定的MetaServer上获得需要请求的文件信息或者块信息,如果要访问文件的块,则通过NodeServer获取块内容。
实现推测:
1、 master部分实现了一个简单的命名空间如树形结构,文件id,Meta id等,客户端获得这些值到元数据服务器去获得文件的其他属性,及其块映射关系;
2、 客户端通过获得的块位置到相应的NodeServer节点操作相应的数据块;
3、 Master通过Zookeeper实现高可用,元数据服务器可以实现冗余模式保证高可用;
Xfs架构图如下
2.5 MAPR
通过官方介绍,实现了无锁存储服务,据说比hdfs速度快3倍;namenode实现分布式话,默认存储3份,可以指定元数据存储分数,并且具有自动修复功能,如果某台机器坏了,会在其他机器修复该元数据,保存该数据始终有3份。
2.6 Clover由中科院研发,实现了元数据的分布式冗余
2.7 Ceph
Ceph为一个分布式存储系统,提供了restful及其fuse(目前可能已经实现内核态)接口,元数据存储和对象存储均实现了支持冗余分布式,元数据与对象分开存储,客户端通过元数据服务器获得对象的位置,然后通过客户端直接获取。
CEPH采用元数据和文件数据分开处理的体系结构,由三个子系统组成:客户端(CLIENT),元数据服务器集群(Metadata Cluster)和对象存储集群(Object StorageCluster)。MDS维护全局的名字空间,负责处理元数据相关的请求以及相心的权限管理:对象存储设备负责文
件数据和元数据的存储,为客户端和MDS提供统一的数据读写服务。在CEPH中,元数据保存在对象存储设备中,MDS幂IJ用缓存的数据对外提供服务。由于MDS本身并不
存储数据,所以可以很方便地进行目录子树的复制迁移以实现负载均衡。通过监控访问的热度等进行负载均衡。
2.8 其他AvatarNode
通过NFS共享EditLog文件,人工切换namenode,可在秒到分钟内完成;
优点:由于采用热备,单个namenodedown掉可以快速切换,提供正常服务;
缺点:同时服务的仅一个namenode,因此仍然存在性能瓶颈;
Cloudera CDH4与AvatarNode类似。
2.9 命名空间存储系统都涉及到命名空间的概念,从上面的调研已经明确,命名空间一般分为2类:树形命名空间和平坦命名空间。具体如下:
树形命名空间:元数据以树形结构维护,文件系统最大的问题就是扩展性,完全取决于他的树状结构,扩展起来相当困难。
平坦命名空间:元数据以2层或者层数很少来维护,实现对象存储的概念。亚马逊支撑对象数可以支撑上千亿,是现在最大的存储集群。
不同业务,可能命名空间选择不一样。
2.10 元数据管理动态子树:出现热点数据或者MDS负载过高时可以很方便地进行目录子树的复制和迁
移,易于扩展MDS和负载均衡,但实现较为复杂。
静态子树:元数据与MDS的对应关系一旦确立就不会改变,容易出现负载不均衡。
Hash算法:初始的时候,可以通过良好的设计使得元数据在MDS间均匀分布,整体负载比较均衡,但是在增加或减少MDS的时候,需要重新调整hash函数,会导致人量的数据迁移。