从零学习Hadoop之HDFS的HA机制
Hadoop2.0.0版本之前,NameNode是HDFS集群的单点故障点,每一个集群只有一个NameNode,如果这个机器或者进程不可用,整个集群则无法使用,直到重启NameNode或者新启动一个NameNode节点。
那么,导致HDFS集群不可用的两种主要情况:
- 类似机器宕机,Hadoop1解决方式:重启NameNode。
- 计划内的软件或者硬件升级(NameNode节点),将导致集群在段时间范围内不可用。
HDFS的高可用性(High Availablity)就可以解决上述问题,通过提供选择运行在同一集群中的一个热备用的“主/备”两个冗余NameNode,允许在机器宕机或者系统维护的时候,快速的转移到另一个NameNode。
HA集群
一个典型的HA集群,连个单独的机器配置为NameNode,在任何时候:
- 一个NameNode处于活动状态->负责处理集群中所有的客户端操作
- 一个NameNode处于待机状态->待机时,作为Slave;另一个不可用时,活动起来。
要求:保持备用节点和活动节点状态同步,保证两节点信息一致性。
实现方式:需要两个节点同时访问一个共享存储设备(例如从NAS、NFS挂载)到一个目录。
备用节点未启用时,监听共享目录(活动节点对名字节点的任何修改修改都会写入此共享目录),将修改内容同步到自己的名字空间。-->针对NameNode
备用节点启用时,为了保证提供快速的故障转移,必须保证备用节点有最新的集群中块的位置信息,为了达到这一点,DataNode节点需要配置两个NameNode的位置,同时发送块的位置信息和心跳信息到NameNode。-->针对DataNode
前提:任何时候只有一个NameNode处于活动状态,防止产生冲突、数据丢失或者其他不正确结果。为了达到这个目的或者所谓的“脑裂清静”出现,管理员必须为共享存储配置至少一个fencing方法。在宕机期间,如果不能确定之间的活动节点已经放弃活动状态,fencing进程负责中断以前的活动节点编辑存储的共享访问。这可以防止任何进一步的修改名字空间,允许新的活动节点安全地进行故障转移。
目前,只有手动故障转移。也就是说不能自动检测活动节点NameNode的失败。
HA架构
对上图的解释:
- 只有一个NameNode是Active的,只有此活动的NameNode提供服务,改变NameSpace。
- 提供手动Failover。在升级过程中,Failover在NameNode-DataNode之间写不变的情况下才能生效。
- 在之前的NameNode重新恢复后,不能提供Failback。
- 数据一致性比Failover更重要。
- 尽量少用特殊的硬件。
- HA的设置和Failover都应该保证在两者操作错误或者配置错误的时候,不得导致数据损坏。
- NameNode的短期垃圾回收不应该触发Failover。
- DataNode会同时想NameNode Active和NameNode Standby汇报块的信息。NameNode Active和NameNode Standby通过NFS备份Metadata信息到一个磁盘上面。
为什么会有HA机制
1、Hadoop1中的几个试图解决单点故障问题的方法:
- Secondary NameNode
- Backup NameNode
- 手动把name.dir指向NFS
- Facebook AvatarNode
还有一些依赖于外部呃HA机制,在这就不做描述。
2、集群容量和集群性能
集群规模变大后,NameNode成为性能的瓶颈。
参考资料
书名:Hadoop应用开发技术详解
作者:刘刚
写得好!!