ZooKeeper分布式协调框架二
目录
2.1、 ZooKeeper之安其内—恢复模式(选主)(重点 )
2.2、ZooKeeper之攘其外—广播模式(同步)(重点 )
一、HDFS HA方案(20分钟)
1.1 ZooKeeper监听器
-
关于ZooKeeper监听器有三个重要的逻辑:
-
注册:客户端向ZooKeeper集群注册监听器
-
监听事件:监听器负责监听特定的事件
-
回调函数:当监听器监听到事件的发生后,调用注册监听器时定义的回调函数
-
类比举例
-
为了便于理解,举例:旅客住店无房可住的情况
-
一哥们去酒店办理入住,但是被告知目前无空房
-
这哥们告诉客服:你给我记住了,帮我留意一下有没有空出的房间,如果有,及时通知我(类似注册监听器,监听特定事件)
-
将近12点,有房客退房,有空闲的房间(事件)
-
客服发现有空房(监听到事件)
-
及时通知这哥们
-
这哥们收到通知后,做一些事,比如马上从附近酒吧赶回酒店(调用回调函数)
-
1.2、HDFS HA原理(难点 15分钟)
-
在Hadoop 1.x版本,HDFS集群的NameNode一直存在单点故障问题:
-
集群只存在一个NameNode节点,它维护了HDFS所有的元数据信息
-
当该节点所在服务器宕机或者服务不可用,整个HDFS集群处于不可用状态
-
-
Hadoop 2.x版本提出了高可用 (High Availability, HA) 解决方案
关键逻辑:
①监听器:注册、监听事件、回调函数
②共享存储:JournalNode
HDFS HA方案,主要分两部分:
①元数据同步
②主备切换
-
1、HDFS HA方案流程
-
① 元数据同步
-
在同一个HDFS集群,运行两个互为主备的NameNode节点。
-
一台为主Namenode节点,处于Active状态,一台为备NameNode节点,处于Standby状态。
-
其中只有Active NameNode对外提供读写服务,Standby NameNode会根据Active NameNode的状态变化,在必要时切换成Active状态。
-
JournalNode集群
-
在主备切换过程中,新的Active NameNode必须确保与原Active NamNode元数据同步完成,才能对外提供服务
-
所以用JournalNode集群作为共享存储系统;
-
当客户端对HDFS做操作,会在Active NameNode中edits.log文件中作日志记录,同时日志记录也会写入JournalNode集群;负责存储HDFS新产生的元数据
-
当有新数据写入JournalNode集群时,Standby NameNode能监听到此情况,将新数据同步过来
-
Active NameNode(写入)和Standby NameNode(读取)实现元数据同步
-
另外,所有datanode会向两个主备namenode做block report
-
-
-
② 主备切换
-
ZKFC涉及角色
-
每个NameNode节点上各有一个ZKFC进程
-
ZKFC即ZKFailoverController,作为独立进程存在,负责控制NameNode的主备切换
-
ZKFC会监控NameNode的健康状况,当发现Active NameNode异常时,通过Zookeeper集群进行namenode主备选举,完成Active和Standby状态的切换
-
ZKFC在启动时,同时会初始化HealthMonitor和ActiveStandbyElector服务
-
ZKFC同时会向HealthMonitor和ActiveStandbyElector注册相应的回调方法(如上图的①回调、②回调)
-
HealthMonitor定时调用NameNode的HAServiceProtocol RPC接口(monitorHealth和getServiceStatus),监控NameNode的健康状态并向ZKFC反馈
-
ActiveStandbyElector接收ZKFC的选举请求,通过Zookeeper自动完成namenode主备选举
-
选举完成后回调ZKFC的主备切换方法对NameNode进行Active和Standby状态的切换
-
-
-
2、namenode主备选举过程:
-
两个ZKFC通过各自ActiveStandbyElector发起NameNode的主备选举,这个过程利用Zookeeper的写一致性和临时节点机制实现
-
当发起一次主备选举时,ActiveStandbyElector会尝试在Zookeeper创建临时节点
/hadoop-ha/${dfs.nameservices}/A
-
-