***--- author:bigdataS6 &大数流 theme: hydrogen
一、概述
(1)所谓HA(High Availablity),即高可用(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很快地切换到另外一台机器。
二、HDFS-HA工作机制
*** 目标:通过双NameNode消除单点故障***
*** 工作要点:
1)元数据管理方式需要改变
内存中各自保存一份元数据;Edits日志只有Active状态的NameNode节点可以读写操作;两个NameNode都可以读取Edits;
共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);***
*** 2)需要一个状态管理功能模块实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,***
*** 利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。***
*** 3)必须保证两个NameNode之间能够ssh无密码登录***
*** 4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务***
HDFS-HA自动故障转移工作机制:
*** 自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。***
*** HA的自动故障转移依赖于ZooKeeper的以下功能:***
*** 1)故障检测
集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。***
*** 2NameNode选择
ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。
ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责***
*** 3)健康监测
ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。***
4)ZooKeeper会话管理
当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
5)基于ZooKeeper的选择
如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。
*** 故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为Active状态。***
安装步骤
一、关闭防火墙
三个节点防火墙均关闭
[root@master ~]# systemctl stop firewalld
二、
安装zookeeper
1.首先创建zookeeper的工作路径:(在master上执行,然后远程复制到其他节点)
- mkdir -p /opt/module/zookeeper
- cd /opt/module/zookeeper
下载zookeeper
解压到/opt/module
- tar -zxvf /opt/software/zookeeper-3.5.7.tar.gz -C /opt/module/
在zookeeper的目录中,创建配置中所需的zkdata和zkdatalog两个文件夹。(在master执行)
- cd /opt/module/zookeeper-3.5.7
- mkdir zkdata
- mkdir zkdatalog
2.配置文件zoo.cfg
进入zookeeper配置文件夹conf,将zoo_sample.cfg文件拷贝一份命名为zoo.cfg,Zookeeper 在启动时会找这个文件作为默认配置文件。
- cd /opt/module/zookeeper-3.5.7/conf/
- mv zoo_sample.cfg zoo.cfg
对zoo.cfg文件配置如下:(在master执行)
- vim zoo.cfg
修改如下:
***tickTime=2000 ***
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper-3.5.7/zkdata
clientPort=2181
dataLogDir=/opt/module/zookeeper-3.5.7/zkdatalog
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
3.进入zkdata文件夹,创建文件myid,用于表示是几个服务器。master主机中,设置服务器id为1。(集群中设置master为1号服务器,slave1为2号服务器,slave2为3号服务器)
- cd /opt/module/zookeeper-3.5.7/zkdata
- vim myid
4.远程复制分发安装文件。
以上已经在主节点master上配置完成ZooKeeper,现在可以将该配置好的安装文件远程拷贝到集群中的各个节点对应的目录下:(在master执行)
-
scp -r /opt/module root@slave1:/opt/
-
scp -r /opt/module root@slave2:/opt/
5.设置myid。在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字。(在slave1和slave2中执行)
- cd /opt/module/zookeeper-3.5.7/zkdata
- vim myid
实验中设置slave1中为2;
slave2中为3:
6.修改/etc/profile文件,配置zookeeper环境变量。(三台机器都执行)
- vi /etc/profile
***#set zookeeper environment ***
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.5.7
***PATH=ZOOKEEPER_HOME/bin ***
- 生效环境变量:source /etc/profile
7.启动ZooKeeper集群。在ZooKeeper集群的每个节点上,执行启动ZooKeeper服务的脚本。注意在zookeeper目录下:(三台机器都执行)
- 回到上一层:cd ..
- 开启服务:bin/zkServer.sh start
- 查看状态:bin/zkServer.sh status
1 leader 2fellower
通过上面状态查询结果可见,一个节点是Leader,其余的结点是Follower。
至此,zookeeper安装成功。
HadoopHA配置文档
Hadoop的高可用性(High Availability,HA)机制。
问题:如果一个集群中主节点NameNode守护进程突然宕机,集群无法对外正常提供服务。
因为:NameNode是HDFS主从架构中主节点守护进程,其中存储了HDFS上文件数据的元数据信息,NameNode一旦宕机,其上存储的文件元数据信息就会立刻从内存中丢失。当Client再次请求读取某个文件的时候,没有NameNode,就找不到请求文件的元数据,即找不到所请求文件的名字、地址及块列表等信息。所以,当NameNode宕机之后HDFS就处于瘫痪状态了,一切对外提供服务的功能全部丧失,直到NameNode被重启恢复,否则HDFS将会永远瘫痪下去,不能再为Client的访问提供服务。
HA机制思想:
HA机制的基本思想是在集群中接入两个NameNode节点,若其中一个宕机,还有另外一个可以继续提供服务。此时,违背了Hadoop集群HDFS的主从架构。HDFS是主从架构,主节点NameNode只能有一个,从节点DataNode可以有多个,当在集群中出现两个NameNode的时候,那么这两个节点就会争抢集群的共享资源,导致系统混乱、数据损坏,我们将这种现象为“脑裂”,如同出现了两个大脑。
Hadoop集群存在的两个核心问题:
第一:NameNode的单点问题,当NameNode节点突然宕机,集群就会处于瘫痪,不能对外提供服务;第二:当部署两个NameNode的时候,会出现争抢集群共享资源的问题。
HA机制可以解决这两个核心问题。
HA机制:通过为两个NameNode配置Active和standby状态来实现的。ActiveNameNode是当前集群中正在工作的守护进程,负责Client对文件的请求和访问,standbyNameNode则处于就绪准备状态,不参与集群的工作,Client也请求不到这个standbyNameNode,但其上所维护的数据与ActiveNameNode保持一致。如果出现故障,如服务器崩溃或服务器需要升级维护,这时可通过此方式将当前的ActiveNameNode切换到另外一台服务器上。
1.在一个典型的HDFS(HA)集群中,将两台单独的服务器配置为NameNode。在任何时间点,确保只有一个NameNode处于Active状态。ActiveNameNode负责集群中的所有Client操作StandbyNameNode处于备用状态,一旦ActiveNameNode出现问题,保证能够快速切换。
2.为了能够实时同步ActiveNameNode和StandbyNameNode的元数据信息(实际上是editlog文件),需要提供一个共享存储系统,可以是NFS、QJM(Quorum JournalManager)或者Bookeeper等。ActiveNameNode将数据写入共享存储系统,而standbyNameNode时刻监听该共享存储系统,一旦StandbyNameNode发现有新数据写入共享存储系统,则立刻实时读取这些数据,并加载到自己的内存中,以保证自己的内存状态所维护的元数据信息与ActiveNameNode保持基本一致。如此一来,在紧急情况下,StandbyNameNode便可快速切换为ActiveNameNode.
3.为了实现快速切换,StandbyNameNode节点获取集群的最新文件块信息列表也是很有必要的。为了实现这一目标,DataNode需要配置NameNode的位置,即所有DataNode节点都需要知道ActiveNameNode和standbyNameNode的地址,并同时给它们发送数据块报告信息及进行心跳检测。
4.
**hadoopHA大数流bigdataS1376大数据
需要注意,第二个NameNode不是HA,它只是阶段性地合并edits和fsimage,以缩短集群启动的时间。当NameNode失效的时候,第二个NameNode无法立刻提供服务,甚至无法保证数据完整性,如果NameNode数据丢失,那么在上一次合并后的文件系统改动所产生的数据将会丢失。
集群节点任务规划
其中,master和master0将担任主节点NameNode的角色。slave、slave1和slave2将担任从节点DataNode的角色。JournalNode是一组进程,两个NameNode之间数据同步的共享存储系统,当ActiveNameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程standbyNameNode有能力读取JourNode中的变更信息,并且一直监控editlog的变化,把变化应用于自己的命名空间。StandbyNameNode可以确保在集群出错时,命名空间状态已经完全同步了。5台节点上都有JournalNode的进程用来实现两个NameNode之间的命名空间数据的同步。
Zookeeper是分布式系统的协调器。ZKFC(zookeeper Failover Cotroller)是zookeeper故障切换控制器,当ActiveNameNode突然宕机时,就由它来切换到备用的NameNode节点上。
配置HadoopHA
需要修改的配置文件共有6个。
Hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred.site.xml,yarn-site.xml和slaves。
1.hadoop-env.sh
添加JDk环境变量。
export JAVA_HOME=/jdk的安装路径
2.core-site.xml
fs.defaultFS
** ****hdfs:// **hadoopcluster
hadoop.tmp.dir
/usr/hadoop/hadoop-3.1.3/hadoopdata/tmp
ha.zookeeper.quorum
master:2181,master0:2181,slave:2181,slave1:2181,slave2:2181
3.hdfs-site.xml
dfs.permissions.enabled
false
dfs.nameservices
hadoopcluster
dfs.ha.namenode.hadoopcluster
nn1,nn2
dfs.namenode.rpc-address.hadoopcluster.nn1
master:9000
dfs.namenode.http-address.hadoopcluster.nn1
master:50070
dfs.namenode.rpc-address.hadoopcluster.nn2
slave1:9000
dfs.namenode.http-address.hadoopcluster.nn2
slave1:50070
dfs.ha.automatic-failover.enabled
true
dfs.namenode.shared.edits.dir
** ****qjournal://master:8485;slave1:8485;slave2:8485/ **hadoopcluster
dfs.client.failover.proxy.provider.ns
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
4.mapred-site.xml
mapreduce.framework.name
yarn
5.yarn-site.xml
yarn.resourcemanager.hostname.rm1
master
yarn.resourcemanager.hostname.rm2
slave1
yarn.nodemanager.aux-services
mapreduce.shuffle
yarn.resourcemanager.address
master:18040
yarn.resourcemanager.scheduler.address
master:18030
yarn.resourcemanager.resource-tracker.address
master:18025
yarn.resourcemanager.admin.address
master:18141
yarn.resourcemanager.webapp.address
master:18088
yarn.resourcemanager.recovery.enabled
true
6slaves文件
master slave1 slave2
复制到各个从节点
启动JournalNode共享存储集群
ssh master
Hadoop-daemon.sh start journalnode //启动hadoop自带的JournalNode集群
Jps查看进程
JournalNode
master0,slave,slave1,slave2 同样启动journalnode
格式化ActiveNameNode
选择master和 slave 1中的一个格式化
hdfs namenode -format -
启动zookeeperFailoverController
出现故障时zookeeperFailoverController用来切换master和master0节点上的namenode,将standbynamenode切换为ActiveNameNode,所以需要在master和master0两个节点上都来启动这个进程。
Ssh master
hadoop-daemon.sh start zkfc
Jps
DFSZKFailoverController
Ssh master0
hadoop-daemon.sh start zkfc
Jps
DFSZKFailoverController
启动ActiveNameNode
Ssh master
hadoop-daemon.sh start namenode
格式化standbyNameNode
Ssh master0
Hdfs namenode -bootstrapStandby
启动standbynamenode
hadoop-daemon.sh start namenode
启动所有dataNod
Ssh slave
hadoop-daemon.sh start datanode
Slave1 slave2一样启动。
验证HA的故障自动转移。
首先登录master节点,浏览器中输入地址localhost:50070&9870,图如下:
Master节点的namenode状态为Active,也就是说Activenamenode进程此刻就运行在master节点上,由它担任集群的hdfs分布式文件系统的主节点为client提供hdfs文件系统的访问操作等。然后切换到master0节点,打开浏览器,输入master0:50070,会看到如下图:
可看到在master0节点运行的namenode的角色是standbynamenode,充当namenode的备机。一旦运行在master节点的ActivenameNode出现故障,就会由zookeeper自动切换,将master0节点上运行的standbynamenode的状态切换为activenamenode,继续为hdfs提供高可用的服务。手动创造故障进行测试。如:在master节点运行代码:ssh master kill -9 processld
这样就可以结束当前正在master节点运行的activenamenode,然后我们切换到master0节点查看其上的standbynamenode能否自动切换为activenamenode。如果成功自动切换且出现如下图,则代表HA机制生效。
接下来,去master节点重新启动master节点的namenode进程,若master节点的namenode变为standby状态,则代表HA机制配置成功。
HA机制搭建完成。
在节点上使用命令分别查看服务nn2与rm2进程状态 hdfs haadmin -getServiceState nn2 yarn rmadmin -getServiceState rm2