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:
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高可用机制的主要内容,如果未能解决你的问题,请参考以下文章