一、组件
如果想进⾏HA
的⾃动故障转移,那么需要为
HDFS
部署两个新组件
ZooKeeper quorum
ZKFailoverController进程(缩写为
ZKFC
)。
1.1 Zookeeper quorum
Apache ZooKeeper是⼀项⾼可⽤性服务,⽤于维护少量的协调数据,将数据中的更 改通知客户端并监视客户端的故障。HDFS
⾃动故障转移的实现依赖
ZooKeeper
进⾏ 以下操作:
1 ) 故障检测
群集中的每个NameNode
计算机都在
ZooKeeper
中维护⼀个持久性会话。如果计算 机崩溃,则ZooKeeper
会话将 终⽌,通知另⼀个NameNode
应触发故障转移。
2 ) 活动的NameNode选举
(HA
的第⼀次启动
)
ZooKeeper提供了⼀种简单的机制来专⻔选举⼀个节点为活动的节点。如果当前活 动的NameNode
崩溃,则另⼀ 个节点可能会在ZooKeeper
中采取特殊的排他锁,指示它应成为下⼀个活动的 NameNode。
1.2 ZKFC的介绍
ZKFailoverController(
ZKFC
)是⼀个新组件,它是⼀个
ZooKeeper
客户端,它监视 和管理namenode
的状态。运⾏
namenode
的每台机器都会运⾏⼀个
ZKFC
,该
ZKFC 负责以下内容:
1 ) 运⾏状况监视
ZKFC使⽤运⾏状况检查命令定期
ping
其本地
NameNode
。只要
NameNode
以健康 状态及时响应,ZKFC
就会认为该 节点是健康的。如果节点崩溃,冻结或以其他⽅式进⼊不正常状态,则运⾏状况监 视器将其标记为不正常。
2 ) ZooKeeper会话管理
当本地NameNode
运⾏状况良好时,
ZKFC
会在
ZooKeeper
中保持打开的会话。如果本地NameNode
处于活动状态,则它还将持有⼀个特殊的“
锁定
” znode
。该锁使⽤
ZooKeeper
对
“
临时
”
节点的⽀持。如果会话到期,则锁定节点将被⾃动删除。
3 ) 基于ZooKeeper的选举
如果本地NameNode
运⾏状况良好,并且
ZKFC
看到当前没有其他节点持有锁 znode,则它本身将尝试获取该锁。 如果成功,则它“
赢得了选举
”
,并负责运⾏故障转移以使其本地
NameNode
处于活 动状态。故障转移过程类似于 上述的⼿动故障转移:⾸先,如有必要,将先前的活动节点隔离,然后将本地 NameNode转换为活动状态。
二、⾃动容灾过程描述
ZKFC(是⼀个进程,和
NN
在同⼀个物理节点上)有两只⼿,分别拽着
NN
和 Zookeeper。
(
监控
NameNode
健康状态,并向
Zookeeper
注册
NameNode)
;集群⼀启 动,2
个
NN
谁是
Active
?谁⼜是
Standby
呢?
1 )
2个zkfc
先判断⾃⼰的
NN
是否健康,如果健康,
2
个
zkfc
会向
zoopkeeper
集群抢着创 建⼀个节点,结果就是只有1
个会最终创建成功,从⽽决定
active
地位和
standby位 置。如果
ZKFC1
抢到了节点,
ZKFC2
没有抢到,
ZKFC2
也会监控
watch
这个节点。
2 )
如果ZKFC1的
Active NN
异常退出,
ZKFC1
最先知道,就访问
ZK
,
ZK
就会把曾经创建的 节点删掉。删除节点就是⼀个事件,谁监控这个节点,就会调⽤callback
回调,
ZKFC2 就会把⾃⼰的地位上升到active
,但在此之前要先确认
ZKFC1
的节点是否真的挂掉?这 就引⼊了第三只⼿的概念。
![](https://img-blog.csdnimg.cn/20210731143303904.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0N5QXVyb3Jh,size_16,color_FFFFFF,t_70)
补充:
Zoopkeeper有⼀个客户端
session
机制,集群启 动之后,2
个
ZKFC
除了监控⾃⼰的
NN
,还要和
Zoopkeeper
建⽴⼀个
tcp
⻓连接,并各⾃ 获取⾃⼰的session
。只要⼀⽅的
session失
效,
Zoopkeeper
就会删除该⽅创建的节点,同时另⼀⽅创建节点,上升地位。
那如果
NN
都没⽑病,
ZKFC
挂掉了呢?这个问题大家寻找答案吧