HDFS的几点改进

针对HDFS的不足,现有一些对原始的HDFS改进的措施。

SecondaryNameNode

SecondaryNameNode的主要功能是帮助NameNode合并Edits和Fsimage文件,以加快NameNode的启动时间。SecondaryNameNode还可以作为NameNode的备份,当NameNode元数据损坏时,可以使用SecondaryNameNode中已合并的Fsimage作为备份文件恢复到NameNode上,但是有可能丢失在合并过程中的Edits信息,因此是不完全的备份。

  • SecondaryNameNode合并时机
    • 配置文件设定的时间间隔fs.checkpoint.period,默认为1小时
    • 配置文件设定的事务记录阈值dfs.namenode.checkpoint.txns,默认为一百万条。也即事务条数达到100w时就会发生合并
  • SecondaryNameNode合并流程
    • 当触发了某个合并时机,首先在NameNode生成一个名为edits.new文件记录合并过程中产生的日志文件
    • SecondaryNameNode将edits文件和fsimage文件从NameNode读取到SecondaryNameNode上,SecondaryNameNode将edits文件和fsiamge进行合并,生成fsimage.ckpt文件
    • 将生成的合并后的fsimage.ckpt文件发送到NameNode上,NameNode将fsimage.ckpt文件变为fsimage文件,替换原有的fsimage文件,并将edits.new文件变为edits文件,以替换原有的edits文件。

Qurom Journal Manager

在典型的HA集群中,两个或者多个单独的计算机被配置为NameNode,在任何一个时间点,都只有一个NameNode处于active状态,而其他的处于standby状态。active NameNode负责集群中的所有客户端操作,而standby NameNode只维护最新状态以在必要时间时提供快速故障转移。 基本原理是:为了保持standby NameNode与active NameNode的元数据保持一致,它们之间通过一系列守护轻量级线程JournalNode通信,用2N+1个JournalNode存储Edits,每次写数据操作有大多数(>=N+1)个JournalNode返回成功就认为该次写成功,显然,该算法最多容忍N台机器失效。任何修改操作在active NameNode上执行时,JounralNode同时会将修改更新到至少半数以上的standby NameNode.

  • QJM优势:不需要额外的共享存储,降低了复杂度和维护成本,系统的健壮程度时可配置的。
  • 只有一个NameNode能够命令DataNode
    • 当每个NameNode改变状态时,都需要向DataNode发送自己的状态和序列号。当原有的active NameNode发生了failover时,新的NameNode会向DataNode发送自己的状态和比之前active NameNode更大的序列号,DataNode接收到该信息会认为新的NameNode为active。即使原先的NameNode恢复,发送的信息中序列号比信息序列号小,DataNode就会拒绝该NameNode命令。
  • 只有一个NameNode响应HDFS客户端
  • ZookeeperFailovorController作用
    • 周期性向它所监控的NameNode发送健康探测命令,从而确定某个NameNode是否处于健康状态。
    • 会话管理:如果NameNode是健康的,ZookeeperFailovorController就会在Zookeeper中保持一个打开的会话,如果该NameNode还是acitve的,ZookeeperFailovorController就会在Zookeeper中占有一个znode(类似于独占的锁),若该NameNode失效,对应的znode将被删除。新的备用的NameNode将会生成自己的znode,并标记状态为active。

HDFS NFS

HDFS NFS是在QJM上的改动。主要区别是共享Edits文件的方式。由QJM利用JournalNode通信变为NFS的远程共享目录来共享edits文件。这是引入了一个NFS gateway服务来实现的。