1、背景
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集都有一个NameNode,如果该机器或进程变得不可用,整个群集将无法使用,直到NameNode重新启动或在单独的计算机上启动。
这在两个主要方面影响了HDFS集群的总体可用性:
-
对于计划外事件(例如计算机崩溃),在操作员重新启动NameNode之前,群集将不可用。
-
计划维护事件(如NameNode计算机上的软件或硬件升级)将导致群集停机时间窗口。
2、原因
普通的完全分布式集群只有一个主节点,它的namenode存在单节点故障,如果namenode一旦出现故障,整个集群将处于瘫痪状态。为了解决这个问题便出现了HA集群,HA又称为hdfs的高可用性。
高可用性的简介:
a.只有两台独立的计算机配置为NameNode,其中一个NameNode处于活动状态(active),另外一个Namenode只是充当从属服务器(Standby)
b.在集群中配置一组"journalnode",记录活跃Namenode的编辑信息,同时传给备份Namenode,并防止"脑裂情景"的发生(JournalNodes只允许一个NameNode一次成为一个writer)
c.datanode要向两个Namenode进行心态反馈
3、硬件需求
---->一个主节点master
----->三个及三个以上的从节点slave1、slave2、slave3
4、配置文件(注:我的主节点是master,要在salve1上配置namenode)
(1)在< hdfs-site.xml> 中
a.配置名称服务的昵称(也就是另外一个namenode的名称)
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
b.为名称服务配置相应的ID唯一标识符:用逗号分开,注意:目前,每个名称服务最多只能配置两个NameNode。
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
c.为名称服务的唯一标识符,配置独立完整的rpc地址
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
d.配置webui的访问地址
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
f.指定journalnode守护进程所在的机器,及其指定目录(即重用名称服务的值)
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;slave2:8485;slave3:8485/mycluster</value>
</property>
g.配置client用于联系ActiveNamenode的java类型
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
h.配置防护方式:sshfence,让journalnode守护进程防止脑裂的产生,还必须配置无密码登陆
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hyxy/.ssh/id_rsa</value>
</property>
(2)在<core-site.xml>中
a.配置默认的namenode的请求路径
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
b.配置journalnode所产生的目录的具体路径(说明:mycluster目录的位置)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hyxy/apps/hadoop/tmp</value>
</property>
5、配置具体步骤
a.配置文件完成后,首先启动相应节点上的journalnode守护进程(因为我要在slave1上配置namenode,所以我要在另外三个节点上先启动journalnode)
命令如下:
hadoop-daemon.sh start journalnode
b.同步元数据
此时会有两种情况:
情况1、如果是新搭建的集群,选择其中一个namonde所在的机器进行格式化。
]$ hdfs namenode -format
情况2、将已经格式化的namenode的元数据同步到另外一个未格式化的namenode上,目的就是在另一个未格式化的机器上
生成${hadoop.tmp.dir}/dfs/name,存储最新的镜像文件:步骤如下-->
--1.开启格式化好的namenode(也就是开启master的namenode)
hadoop-daemon.sh start namenode
--2.在未格式化的namenode上,运行如下命令,同步元数据(也就是在你的slave1上开启)
hdfs namenode -bootstrapStandby
c.将本地的元数据初始化到journalnode里(在master中)
--1.关闭namenode
hahadoop-daemon.sh stop namenode
--2.初始化,注意,journalnode必须是开启的(n-1/2)
hdfs namenode -initializeSharedEdits
d.开启HA集群
start-dfs.sh
注释:此时在master和slave1中都显示是standby
e.把一个namenode变成活跃节点(此时把master变成活跃节点)
hdfs haadmin -transitionToActive nn1
6、测试
a.查看两个namenode的50070的状态信息
c. 上传文件/创建目录到HA