本指南提供了一个HDFS的高可用性(HA)功能的概述,以及如何配置和管理HDFS高可用性(HA)集群。本文档假定读者具有对HDFS集群的组件和节点类型具有一定理解。有关详情,请参阅Apache的HDFS的架构指南。
http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
CDH4之前,在HDFS集群中NameNode存在单点故障(SPOF)。对于只有一个NameNode的集群,如果NameNode机器出现故障,那么整个集群将无法使用,直到NameNode重新启动。
NameNode主要在以下两个方面影响HDFS集群:
(1). NameNode机器发生意外,比如宕机,集群将无法使用,直到管理员重启NameNode
(2). NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
HDFS的HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
HDFSHA的解决方案可谓百花齐放,Linux HA, VMware FT, sharedNAS+NFS, BookKeeper, QJM/Quorum Journal Manager, BackupNode等等。目前普遍采用的是shard NAS+NFS,因为简单易用,但是需要提供一个HA的共享存储设备。而社区已经把基于QJM/Quorum Journal Manager的方案merge到trunk了,clouderea提供的发行版中也包含了这个feature,这种方案也是社区在未来发行版中默认的HA方案。
在HA具体实现方法不同的情况下,HA框架的流程是一致的。不一致的就是如何存储和管理日志。在Active NN和Standby NN之间要有个共享的存储日志的地方,Active NN把EditLog写到这个共享的存储日志的地方,Standby NN去读取日志然后执行,这样Active和Standby NN内存中的HDFS元数据保持着同步。一旦发生主从切换Standby NN可以尽快接管Active NN的工作(虽然要经历一小段时间让原来Standby追上原来的Active,但是时间很短)。
说到这个共享的存储日志的地方,目前采用最多的就是用共享存储NAS+NFS。缺点有:1)这个存储设备要求是HA的,不能挂掉;2)主从切换时需要fencing方法让原来的Active不再写EditLog,否则的话会发生brain-split,因为如果不阻止原来的Active停止向共享存储写EditLog,那么就有两个Active NN了,这样就会破坏HDFS的元数据了。对于防止brain-split问题,在QJM出现之前,常见的方法就是在发生主从切换的时候,把共享存储上存放EditLog的文件夹对原来的Active的写权限拿掉,那么就可以保证同时至多只有一个Active NN,防止了破坏HDFS元数据。
Clouera为解决这个问题提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA方案。QJM的结构图如下所示:
QJM的基本原理就是用2N+1台JournalNode存储EditLog,每次写数据操作有大多数(>=N+1)返回成功时即认为该次写成功,数据不会丢失了。当然这个算法所能容忍的是最多有N台机器挂掉,如果多于N台挂掉,这个算法就失效了。这个原理是基于Paxos算法的,可以参考http://en.wikipedia.org/wiki/Paxos_(computer_science)。
用QJM的方式来实现HA的主要好处有:1)不需要配置额外的高共享存储,这样对于基于commodityhardware的云计算数据中心来说,降低了复杂度和维护成本;2)不在需要单独配置fencing实现,因为QJM本身内置了fencing的功能;3)不存在Single Point Of Failure;4)系统鲁棒性的程度是可配置的(QJM基于Paxos算法,所以如果配置2N+1台JournalNode组成的集群,能容忍最多N台机器挂掉);5)QJM中存储日志的JournalNode不会因为其中一台的延迟而影响整体的延迟,而且也不会因为JournalNode的数量增多而影响性能(因为NN向JournalNode发送日志是并行的)。
NameNode 机器,Active 、Standby 应该具有相同的硬件
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>master,slave1,slave2,pcmk104,pcmk108</value> </property> |
1. dfs.nameservices注意与core-site.xml中的fs.defaultFS中的value保持一致
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property> |
2. dfs.ha.namenodes.mycluster每个namenode在名称服务中的唯一标识
<property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> |
3.两个结点的rpc地址
<property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master:54310</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>pcmk104:54310</value> </property> |
4. servicerpc地址
<property> <name>dfs.namenode.servicerpc-address.mycluster.nn1</name> <value>master:53310</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn2</name> <value>pcmk104:53310</value> </property> |
5.http通信地址
<property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>pcmk104:50070</value> </property> |
6.我们采用3个journalnode节点存储元数据,这是他们的IP与端口
<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;pcmk104:8485;slave1:8485/mycluster</value> </property> |
7. journaldata的存储路径
<property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/journaldata/</value> </property> |
8.该类用来判断哪个namenode处于生效状态
<property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> |
9.打开自动切换namenode的功能
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> |
10. 运行脚本实现安全机制
<property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> |
设定所有的必要配置项后,必须首先同步两个NameNode上的元数据。如果是新建的HDFS 集群,则应首先格式化一个NameNode
(1)在格式化NameNode之前先启动journalnode服务
进入bin目录执行 ./hdfs journalnode
注意:在每一台journalnode机上都需要启动该服务。
检查服务是否正常可以访问master:8480,slave1:8480,pcmk104:8480来验证。启动后若出现异常,格式化NameNode之后就好了。
(2)格式化NameNode
进入bin目录执行 ./hdfs namenode –format
在sbin目录下执行 ./start-dfs.sh启动hadoop集群。
查看页面http://pcmk104:50070和http://master:50070/应该一个处于active状态一个处于standby状态。
[1].apache HighAvailability With QJM部分
http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
[2]. http://yanbohappy.sinaapp.com/?p=205