前言
再看本文章之前,请先确保已经看过CentOS下hadoop的分布式搭建和分布式协作服务框架Zookeeper安装部署两篇文章,因为本文章是建立在它们基础之上的。
一、HA相关介绍
1、为什么出现HA架构
Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)(也就是namenode单点宕机导致集群不可用的问题)。
NameNode主要在以下两个方面影响HDFS集群:
-
NameNode机器发生意外
,如宕机,集群将无法使用,直到管理员重启 -
NameNode机器需要升级
,包括软件、硬件升级,此时集群也将无法使用
HDFS HA功能通过配置Active/Standby两个NameNode结点实现在集群中对NameNode元数据的备份来解决上述问题。如果出现故障或者机器需要升级维护,这时可以通过此种方式将NameNode切换到另一台机器。
2、HDFS HA设计
上面两个图展示了HA设计的逻辑图。通过上图可以看出我们的edits是存储在namenode结点中的。而编辑日志记录所有的信息,每次关闭集群edits都会和fsimage合并成新的fsimage,而重启集群的时候,系统会读取fsimage,并生成新的edits。因此HA架构的关键性是保证两个NameNode的edits一致,同时保证edits的安全性,这可以用journalnode实现。同时我们客户端访问HDFS的时候,不再是直接访问NameNode,因为客户端事先不知道哪个NameNode是Active状态,因此我们需要通过代理访问HDFS。除此之外,现在集群中出现了两个NameNode,集群启动的时候可能会出现冲突情况(即两个NameNode都是Active状态),为此我们还需要隔离两个NameNode,确保同一时刻只能有一个NameNode是活跃状态。
综上所述,HA的配置要点如下:
- 共享edits
- 配置两个NameNode
- 客户端通过Proxy访问
- 隔离两个NameNode
二、HA配置
1、规划集群
Hadoop1 | Hadoop2 | Hadoop3 |
NameNode | NameNode | |
JournalNdoe | JournalNdoe | JournalNdoe |
DataNode | DataNode | DataNode |
2、修改配置文件hdfs-stie.xml、core-site.xml
(1) hdfs-stie.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ############################NameNode Name#################-->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- ############################NameNode rpc address#################-->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop2:8020</value>
</property>
<!-- ############################NameNode http web address#################-->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- ############################NameNode share edits address#################-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns1</value>
</property>
<!-- ############################Hdfs proxy client#################-->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ############################NameNode fence需要事先配置免密登陆#################-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>~/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/app/hadoop-2.5.0/data/dfs/jn</value>
</property>
</configuration>
(2) core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- hadoop运行时的目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/app/hadoop-2.5.0/data/tmp</value>
</property>
</configuration>
(3)因为在hdfs-site.xml的dfs.journalnode.edits.dir
项目中配置了journalnode的文件存放目录,所以需要事先使用mkdir创建一下相应目录。
(4) 将修改过的hdfs-site.xml和core-site.xml使用scp -r hdfs-site.xml core-site.xml 用户名@主机名(or IP地址):/opt/app/hadoop-2.5.0/etc/hadoop
命令分发到其余两台机器上
3、启动HA
(1) 在各个JournalNode机器上,输入以下命令启动journalnode服务
sbin/hadoop-daemon.sh start journalnode
(2) 在nn1上对其进行格式化,并启动
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
(3) 在nn2上同步nn1的元数据信息
bin/hdfs namenode -bootstrapStandby
(4) 启动nn2
sbin/hadoop-daemon.sh start namenode
(5) 在所有机器上启动datanode节点
sbin/hadoop-daemon.sh start datanode
(6) 将nn1切换为activate
bin/hdfs haadmin -transitionToActive nn1
访问浏览器,查看web界面
可以看到一个为active,一个为standby。
三、自动故障转移
通过上述发现,我们需要人工指定namenode为active。但是在namenode宕机之后人们往往不能及时的启动另一个namenode结点,为此引入自动故障转移。通过zookeeper服务进行自动故障转移配置。
1、自动故障转移设计
2、修改配置文件core-site.xml、hdfs-site.xml
(1) hdfs-site.xml添加如下内容
<!-- ############################automatic failover #################-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(2) core-site.xml添加如下内容
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
(3) 将修改过的hdfs-site.xml和core-site.xml使用scp -r hdfs-site.xml core-site.xml 用户名@主机名(or IP地址):/opt/app/hadoop-2.5.0/etc/hadoop
命令分发到其余两台机器上
3、启动
(1)在各个机器山启动Zookeeper:bin/zkServer.sh start
(2)初始化HA在Zookeeper中状态bin/hdfs zkfc -formatZK
(3) 启动hdfs服务
可以看到自动选取nn1作为active结点。
4、验证
(1)使用jps查看到Active namenode的进程号之后, 将Active NameNode进程kill.
(2) zookeeper监控到,自动将nn2激活。