HDFS的HA高可用机制

Posted 阳哥赚钱很牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS的HA高可用机制相关的知识,希望对你有一定的参考价值。

不管是伪分布式搭建,还是完全分布式搭建的集群,都会存在单点故障的问题。

如何解决单点故障?那就是HA高可用 甜

一、概述

1)所谓HA(highavailable),即高可用(7*24小时不中断服务)。

2)实现高可用最关键的策略是消除单点故障

HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA

3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。

4)NameNode主要在以下两个方面影响HDFS集群
        

        NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
        NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

        HDFS HA功能通过配置Active(对外提供服务)/Standby(预备)两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。zkfc组件是用来进行自动故障转移的。

        之后学习zookeeper分布式协调服务框架就可以对Active/Standby进行管理,接受namenode的注册,监控namenode的状态。

注意:在HA环境中,不需要存在SecondaryNamenode

二、HA的搭建

我们先打开官网寻找一下Apache Hadoop 2.8.5文档,我们看到在HDFS中有这么两个HA:

https://hadoop.apache.org/docs/r2.8.5/

         QJM代表数据同步通过journalnode同步多个NameNode之间的元数据。NFS需要再搭建一个远程服务器,较麻烦。QJM使用较多。

 搭建前的准备:我们之前搭建Hadoop集群时使用到三个虚拟机node1、node2、node3

使用高可用HA,我们需要先安装Zookeeper。

步骤一:

打开我们的node1虚拟机,把zookeeper压缩包上传到/opt/software路径下,并解压

 步骤二:

切换到/zookeeper/conf目录下,编辑zoo_sample.cfg文件,重命名修改为zoo.cfg;

进入zoo.cfg文件:vim zoo.cfg  

修改dataDir路径为dataDir=/opt/module/zookeeper-3.4.6/zkData  

再在文件末尾添加

        server.1=node1:2888:3888
        server.2=node2:2888:3888
        server.3=node3:2888:3888

这三句话代表三个zookeeper是哪三个

步骤三:

在/home/uek/app/zookeeper-3.4.6/这个目录下创建zkData

mkdir -p zkData

 再创建myid文件

touch myid

 代表本机是几号服务器

vim myid

在文件中添加与server对应的编号  1

保存退出

那么node1的zookeeper服务器配置好了。

步骤四:

把配置文件同步到另外两个节点。

scp -r zookeeper-3.4.6/ root@node2:/opt/app/
scp -r zookeeper-3.4.6/ root@node3:/opt/app/

并分别修改myid文件中内容为2、3

步骤五:

启动zookeeper

先配置环境变量(三台都需要配置)

vim /etc/profile

在末尾添加:

export ZOOKEEPER_HOME=/opt/app/zookeeper-3.4.6

export PATH=$PATH:$ZOOKEEPER_HOME/bin

出来之后source /etc/profile使文件失效

接下来就可以启动了!

[root@node1 zookeeper-3.4.6]# zkServer.sh start
[root@node2 zookeeper-3.4.6]# zkServer.sh start
[root@node3 zookeeper-3.4.6]# zkServer.sh start

之后通过jps命令查看就好了。

我们还可以查看状态(谁是leader)

zkServer.sh status

接下来我们就可以配置HDFS-HA集群了

步骤一:

配置hadoop-env.sh,关联JDK

export JAVA_HOME=/home/app/jdk1.8.0_192

步骤二:

配置core-site.xml

<configuration>
<!--把两个NameNode)的地址组装成一个集群mycluster-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://myCluster</value>
</property>
<!--指定hadoop运行时产生文件的存储目录-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/app/hadoop-2.8.5/temp</value>
</property>
</configuration>

步骤三:

配置hdfs-site.xml高可用

<configuration>
<!--高可用集群名称-->
    <property>
        <name>dfs.nameservices</name>
        <value>myCluster</value>
    </property>
<!--集群中NameNode节点都有哪些-->
    <property>
        <name>dfs.ha.namenodes.myCluster</name>
        <value>nn1,nn2</value>
    </property>
<!--nn1的RPC通信地址-->
    <property>
        <name>dfs.namenode.rpc-address.myCluster.nn1</name>
    <value>node1:9000</value>
    </property>
<!--nn2的RPC通信地址-->
    <property>
        <name>dfs.namenode.rpc-address.myCluster.nn2</name>
        <value>node2:9000</value>
    </property>
    <!--nn1的http通信地址-->
    <property>
        <name>dfs.namenode.http-address.myCluster.nn1</name>
        <value>node1:50070</value>
    </property>
    <!--nn2的http通信地址-->
    <property>
        <name>dfs.namenode.http-address.myCluster.nn2</name>
        <value>node2:50070</value>
    </property>
<!--指定NameNode元数据在JournalNode上的存放位置-->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485;node3:8485/myCluster</value>
    </property>
    <!--配置隔离机制,即同一时刻只能有一台服务器对外响应-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
<!--使用隔离机制时需要ssh无秘钥登录-->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
<!--声明journalnode服务器存储目录-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/app/hadoop-2.8.5/journalnodeData</value>
    </property>
<!--关闭权限检查-->
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>

<!--访问代理类:client,mycluster,active配置失败自动切换实现方式-->
    <property>
        <name>dfs.client.failover.proxy.provider.myCluster</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</
value>
    </property>
</configuration>

步骤四:

配置HDFS-HA自动故障转移

(1)在hdfs-site.xml中增加

<property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
</property>

(2)在core-site.xml文件中增加

<property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
</property>

接下来给node2、node3同步一下

scp -r hadoop-2.8.5/ root@node2:/opt/app

scp -r hadoop-2.8.5/ root@node3:/opt/app

步骤五:

启动启动HDFS-HA集群(前提是启动了zookeeper)

1)在各个JournalNode节点上,输入以下命令启动journalnode服务:

hadoop-daemon.sh start journalnode

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

hdfs namenode -format

hadoop-daemon.sh start namenode

3)在[nn2]上,同步nn1的元数据信息

hdfs namenode-bootstrapStandly

4)初始化HA在Zookeeper中状态

hdfs zkfc -formatZK

5)启动HDFS

start-dfs.sh

以上是关于HDFS的HA高可用机制的主要内容,如果未能解决你的问题,请参考以下文章

HDFS的HA高可用机制

HadoopHDFS高可用与高扩展原理分析(HA架构与Federation机制)

HDFS篇11HA高可用

大数据 - 高可用 HDFS HA

Hadoop2.7.6_07_HA高可用

Hadoop HA高可用