三、zookeeper--实现NN和RM的HA

发布时间:2020-07-11 09:25:04 来源:51CTO 阅读:235 作者:隔壁小白 栏目:大数据

一、hdfs namenode HA 1、概述

​ 在hadoop1.0的时候,hdfs集群中namenode存在单点故障的问题,当namenode不可用的时候,就会导致整个hdfs集群服务不可用。另外如果需要临时对namenode进行设计或者其他操作时,停掉namenode之后,hdfs集群也无法使用了。
​ 通过HA的方式,可以一定程度上解决单点故障问题。

2、namenode HA工作要点

1)元数据管理方式需要改变:
内存中各自保存一份元数据;
Edits日志只有Active状态的namenode节点可以做写操作;
两个namenode都可以读取edits;
共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

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

3)必须保证两个NameNode之间能够ssh无密码登录。用于后面的隔离。通过ssh方式到另外的namenode节点上,将namenode进程彻底杀死。防止脑裂。

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

3、namenode HA自动故障转移工作机制

namenode HA自动故障转移除了要两个namenode之外,还需要增加两个组件:zookeeper集群服务,ZKFailoverController(ZKFC)。

(1)ZKFC

它是zookeeper的一个客户端,同时负责监控namenode的状态。每个namenode上都运行一个ZKFC进程。
1)健康监测:
ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
2)ZooKeeper会话管理:
当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点(也就是临时节点)的支持,如果会话终止,锁节点将自动删除。

ZKFC会在zookeeper上创建一个 /hadoop-ha/namenodeHA集群名称/ 这样一个节点, 该节点上有两个子节点: ActiveBreadCrumb: 持久节点,节点的值中记录了 HA集群名称 active节点别名 active节点地址 主要用于其他想访问namenode服务的client用于获取active状态的namenode地址,所以必须得是持久节点。 ActiveStandbyElectorLock: 临时节点,节点的值中记录了 HA集群名称 active节点别名 active节点地址。 起到互斥锁的作用,只有获取到该节点的使用权,才能修改上面ActiveBreadCrumb节点的值。 因为是临时节点,所以当active namenode和zk保持连接,该节点就会一直存在,而standby的namenode也是和zk保持连接,但是发现该临时节点已存在,就明白已经有人占用了,所以它不会做任何事。当上面的active namenode发生问题,不正常了,ZKFC就会断开和zk的连接,那么临时节点就会消失。此时standby namenode就会重新创建该临时节点,相当于获得了锁,可以修改ActiveBreadCrumb的值。此时它自己也就顺理成章变成新的active namenode。

3)基于ZooKeeper的选择:
如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。

4、HA配置 (1)环境规划 主机 角色
bigdata121/192.168.50.121   namenode,journalnode,datanode,zk  
bigdata122/192.168.50.122   namenode,journalnode,zk  
bigdata123/192.168.50.123   zk  
   
软件版本   hadoop2.8.4,zookeeper3.4.10,centos7.2  

jdk,zookeeper部署不重复讲了,看之前的文章吧

基础环境配置:
每个机器添加主机名解析/etc/hosts
每台主机对自己,以及对另外两台主机都要配置ssh免秘钥登录
关闭防火墙以及selinux

(2)部署

hadoop的完整部署可以看之前的文章,这里着重讲namenode HA的配置。
修改配置文件:
core-site.xml

<configuration> <!--指定namenode的HA集群的名字 --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!--指定hadoop中hdfs保存数据块和元数据块的目录--> <property> <name>hadoop.tmp.dir</name> <value>/opt/modules/HA/hadoop-2.8.4/data/ha_data</value> </property> <!--指定使用的zk集群的所有节点ip:port--> <property> <name>ha.zookeeper.quorum</name> <value>bigdata121:2181,bigdata122:2181,bigdata123:2181</value> </property> </configuration>

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。