前言

再看本文章之前,请先确保已经看过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设计

hadoop r 部署 hadoop ha部署_hadoop


hadoop r 部署 hadoop ha部署_hadoop_02

上面两个图展示了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

hadoop r 部署 hadoop ha部署_xml_03


hadoop r 部署 hadoop ha部署_hadoop_04


hadoop r 部署 hadoop ha部署_hdfs_05


(2) 在nn1上对其进行格式化,并启动

bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

hadoop r 部署 hadoop ha部署_hadoop_06


hadoop r 部署 hadoop ha部署_hadoop r 部署_07


(3) 在nn2上同步nn1的元数据信息

bin/hdfs namenode -bootstrapStandby

hadoop r 部署 hadoop ha部署_hadoop_08


hadoop r 部署 hadoop ha部署_hadoop_09

(4) 启动nn2

sbin/hadoop-daemon.sh start namenode

hadoop r 部署 hadoop ha部署_hdfs_10


(5) 在所有机器上启动datanode节点

sbin/hadoop-daemon.sh start datanode

hadoop r 部署 hadoop ha部署_hadoop_11


(6) 将nn1切换为activate

bin/hdfs haadmin -transitionToActive nn1

hadoop r 部署 hadoop ha部署_hadoop_12


访问浏览器,查看web界面

hadoop r 部署 hadoop ha部署_hadoop_13


hadoop r 部署 hadoop ha部署_hdfs_14


可以看到一个为active,一个为standby。

三、自动故障转移

通过上述发现,我们需要人工指定namenode为active。但是在namenode宕机之后人们往往不能及时的启动另一个namenode结点,为此引入自动故障转移。通过zookeeper服务进行自动故障转移配置。

1、自动故障转移设计

hadoop r 部署 hadoop ha部署_大数据_15


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

hadoop r 部署 hadoop ha部署_hadoop_16


(2)初始化HA在Zookeeper中状态bin/hdfs zkfc -formatZK

hadoop r 部署 hadoop ha部署_大数据_17


(3) 启动hdfs服务

hadoop r 部署 hadoop ha部署_hdfs_18


hadoop r 部署 hadoop ha部署_hadoop r 部署_19


hadoop r 部署 hadoop ha部署_hadoop r 部署_20


可以看到自动选取nn1作为active结点。

4、验证

(1)使用jps查看到Active namenode的进程号之后, 将Active NameNode进程kill.

hadoop r 部署 hadoop ha部署_hadoop_21


(2) zookeeper监控到,自动将nn2激活。

hadoop r 部署 hadoop ha部署_hdfs_22