大数据 - 高可用 HDFS HA

Posted shifu204

tags:

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

 HDFS HA高可用

1 HA概述

1)所谓HA(high available),即高可用(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很快的切换到另外一台机器。

2 HDFS-HA工作机制

1)通过双namenode消除单点故障

2.1 HDFS-HA工作要点

1)元数据管理方式需要改变:

内存中各自保存一份元数据;

Edits日志只有Active状态的namenode节点可以做写操作;

两个namenode都可以读取edits;

共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

2)需要一个状态管理功能模块

实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

3)必须保证两个NameNode之间能够ssh无密码登录。

4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

2.2 HDFS-HA自动故障转移工作机制

前面学习了使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使现役NameNode已经失效,系统也不会自动从现役NameNode转移到待机NameNode,下面学习如何配置部署HA自动进行故障转移。自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

1)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

1)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

2)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

3)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为active状态。

 

3 HDFS-HA集群配置 -- 手动转移

3.1.将hadoop2.7.2 复制到 modules/HA里面

cd /home/admin/modules

mkdir HA

cp -r hadoop-2.7.2/ Ha/

  

3.2 配置,修改core-site.xml 与 hdfs-site.xml 文件

cd /home/admin/modules/HA/hadoop-2.7.2/etc/hadoop

vim core-site.xml

<configuration>
        <!-- 把两个NameNode)的地址组装成一个集群mycluster -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://mycluster</value>
        </property>

        <!-- 指定hadoop运行时产生文件的存储目录 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/admin/modules/HA/hadoop-2.7.2/hadoop-data</value>
        </property>


        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/admin/modules/HA/hadoop-2.7.2/jn/mycluster</value>
        </property>

</configuration>

  

 vim 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>linux01:8020</value>
        </property>

        <!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                <value>linux02:8020</value>
        </property>

        <!-- nn1的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn1</name>
                <value>linux01:50070</value>
        </property>

        <!-- nn2的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn2</name>
                <value>linux02:50070</value>
        </property>

     <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://linux01:8485;linux02:8485;linux03: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>/home/admin/.ssh/id_rsa</value>
        </property>

        <!-- 指定数据冗余分数 -->
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>

        <!-- 关闭权限检查-->
        <property>
                <name>dfs.permissions.enable</name>
                <value>false</value>
        </property>

        
        <property>
                <name>dfs.webhdfs.enable</name>
                <value>true</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>                                                            

  

3.3.分发到linux02和linux03中

scp -r HA/ linux02:/home/admin/modules/

scp -r HA/ linux03:/home/admin/modules/

  

3.4启动三台机器的journalnode(分别在三台机器上面执行且jps查看是否执行成功)

sbin/hadoop-daemon.sh start journalnode 

  

3.5格式化linux01的namenode节点

bin/hdfs namenode -format

  

3.6启动刚格式化的namenode

sbin/hadoop-daemon.sh start namenode

  

3.7备用namenode同步主namenode的元数据信息,(在linux02中执行)

bin/hdfs namenode -bootstrapStandby

  

3.8启动被namenode(在linux02中执行)

sbin/hadoop-daemon.sh start namenode

  

3.9启动所有datanode(分别在三台机器执行,并用jps查看是否执行成功)

注意,有时datanode会启动失败,原因:

当时“再来一次”,又重新执行了格式化命令(hdfs namenode -format),这时namenode的clusterID会重新生成,而datanode的clusterID 保持不变。

所以,解决办法也很简单了,把name/current/VERSION里面的clusterID复制下来,依次替换data/current/VERSION里的clusterID,再执行:

sbin/hadoop-daemon.sh start datanode

  

3.10两个namenode目前都处于standby状态,所以是都没有办法Browse Directory (浏览目录的),必须手动激活其中一个namenode的

状态为active才可以,如果想把nn2设置为active状态,必须先把nn1设置为standby状态

转变为active状态
bin/hdfs haadmin -transitionToActive nn1

转变为standby状态
bin/hdfs haadmin -transitionToStandby nn1

  

3.11重点:把处于active状态的nn1手动关掉,看会发生什么事

关掉linux01的namenode
sbin/hadoop-daemon.sh stop namenode

  

结论:关掉以后,想去把nn2设置为active状态,但是不成功,这是防止脑裂机制决定的,只能强制切换:

bin/hdfs haadmin -transitionToActive nn2 --forceactive

  



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

好程序员大数据学习路线分享Hadoop阶段的高可用配置

Apache hadoop namenode ha和yarn ha ---HDFS高可用性

HDFS篇11HA高可用

Hdfs的HA高可用

Hadoop HA高可用

HadoopHDFS HA高可用