【Hadoop学习】Hadoop2.0高可用性

在Hadoop2.0之前,只有一个NameNode,虽然有SecondaryNameNode(不能迅速切换,需要花费一定时间恢复),还是存在单点问题。NameNode在Hadoop中就好比是人的心脏,不能停止工作。如果NameNode数据丢失或者不能工作,那整个集群就不能恢复了。

在Hadoop2.0中解决了这个问题,在Hadoop2.0中NameNode不再只是一个,可以有多个。每一个都具有相同的职能,一个NameNode是active状态,一个是standby状态。当集群在运行的时候,只有active状态的NameNode是正常工作的,standBy状态的NameNode是处于待命状态,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作了,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态了,这样集群还是正常工作了,这样集群就具有高可用性了。

Hadoop2.0的HA机制官方介绍了2中方式:

  1. NFS(Network File System)
  2. QJM(Quorum Journal Manager)

基本原理


Hadoop2.0中有两个NameNode,一个是active状态NameNode,一个是standby状态NameNode。两者的状态是可以切换的,但是不能同时都是active状态,最多只有一个active状态。只有active状态的NameNode对外提供服务,standby状态的NameNode不对外服务。active状态的NameNode和standby状态的NameNode之间通过NFS或者JN(journalnode,QJM方式)来同步数据。

active状态的NameNode会把最近的操作记录写到本地的edits文件中(edits file),并传输到NFS或者JN中。standby状态的NameNode定期检查,从NFS或者JN中把最近的edit文件读过来,然后把edits文件和fsimage文件合并成一个新的fsimage,合并完成之后会通知active状态NameNode来获取新的fsiamge,active状态NameNode获得到这个新的fsimage文件后,替换掉原来旧的fsimage文件。

NFS方式


NFS作为active NameNode和standby NameNode之间数据共享的存储,active状态的 NameNode会把最近的edits文件写到NFS,而standby状态的NameNode从NFS中读取edits文件。这个方式的缺点就是,如果active状态的NameNode或standby状态的NameNode有一个和NFS之间网络有问题是,就会造成它们之间数据的同步出现问题。

QJM方式


QJM方式可以解决NFS容错机制不足的问题,active状态NameNode和standby状态NameNode之间通过一组journalnode(奇数个,2n+1)来共享数据,active状态NameNode把最近的edits文件写到这组journalnode上,只要有n+1个写入成功就认为这次写入操作是成功的,然后standby状态NameNode就可以从journalnode上读取数据了。QJM方式有容错机制,可以容忍n个journalnode的失败

NameNode故障切换

active和standby状态NameNode可以随时切换,当active挂掉后,可以把standby切换成active状态。
故障切换可以通过人工切换和自动切换方式完成。

  • 人工切换是通过HA管理的命令来改变NameNode的状态
  • 自动切换是在active状态NameNode挂掉的时候,standby状态NameNode自动切换成active状态,取代原来的active状态NameNode成为新的active状态NameNode,确保HDFS继续正常工作

自动切换需要配置zookeeper。集群中两个NameNode都在zookeeper中注册,当active状态的NameNode出现故障时,zookeeper能检查到这种情况,它就会自动把standby状态的NameNode切换为active状态。