单个NameNode的架构使得HDFS在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NameNode进程使用内存就回显得力不从心。而且,所有的元数据信息的读取和操作都需要与NameNode进行通信,如客户端的addBlock、getBlockLocations,还有DataNode的blockRecieved、sendHeartbeat、blockReport等操作。在集群规模变大后,NameNode成为了性能的瓶颈。
令人兴奋的是, Hadoop 2.0里的HDFS Federation是上述问题迎刃而解。下面将重点介绍HDFS Federation。
利用共享存储来在两个NameNode间同步edits信息。以前的HDFS是share nothing but NameNode,现在NameNode又share storage,这样其实是转移了单点故障的位置,但中高端的存储设备内部都有各种RAID以及冗余硬件包括电源以及网卡等,比服务器的可靠性还是略有提高。通过NameNode内部每次元数据变动后的flush操作,加上NFS的close-to-open,数据的一致性得到了保证。
用于监视和控制NameNode进程的FailoverController进程显然,我们不能在NameNode进程内进行心跳等信息同步,最简单的原因,一次FullGC就可以让NameNode挂起十几分钟。目前版本里是用ZooKeeper来做同步锁。