1:架构
上图是一张Hadoop高可靠性的工作原理图,其中NN代表的是NameNode,DN代表的是DataNode,ZK代表的是Zookeeper,我们发现这个集群当中有两个NameNode,一个处于Active状态,另一个处于Standby状态,NameNode是受Zookeeper控制的,但是又不是直接受Zookeeper控制,有一个中间件FailoverController(也就是ZKFC进程),每一个NameNode所在的机器都有一个ZKFC进程,ZKFC可以给NameNode发送一些指令,比如切换指令。同时ZKFC还负责监控NameNode,一旦它发现NameNode宕机了,它就会报告给Zookeeper,另一台NameNode上的ZKFC可以得到那一台NameNode宕机的信息,因为Zookeeper数据是同步的,因此它可以从ZK中得到这条信息,它得到这条信息之后,会向它控制的NameNode发送一条指令,让它由Standby状态切换为Active状态。具体原理是什么呢,刚开始的时候两个NameNode都正常工作,处于激活状态的NameNode会实时的把edits文件写入到存放edits的一个介质当中,Standby状态的NameNode会实时的把介质当中的edits文件同步到它自己所在的机器。因此Active里面的信息与Standby里面的信息是实时同步的。FailoverController实时监控NameNode,不断把NameNode的情况汇报给Zookeeper,一旦Active状态的NameNode发生宕机,FailoverController就跟NameNode联系不上了,联系不上之后,FailoverController就会把Active宕机的信息汇报给Zookeeper,另一个FailoverController便从ZK中得到了这条信息,然后它给监控的NameNode发送切换指令,让它由Standby状态切换为Active状态。存放edits文件的方式可以使用NFS—网络文件系统,另一种是JournalNode,DataNode连向的是NameService,DataNode既可以跟Active的NameNode通信又可以跟Standby的NameNode通信,一旦Active宕机,DataNode会自动向新的Active进行通信。
2: 问题(JN的引出)
- 客户端如果同步写入主NN,备NN(写入主后继续写入备,直至写完才算写入成功),就会导致效率很慢!
- 客户端如果异步写入主NN,备NN(写入主后就返回写入成功,备NN进行后台同步主NN),就会存在备NN同步主NN时主NN挂了,导致备NN数据不全
解决办法(JournalNode)
- CAP原则(一致性、可用性、分区容忍性三者之间的冲突)
- Paxos算法
- 一种基于消息传递的一致性算法(被公认为类似算法中最有效的)
- 类似一种带存储能力的消息队列
- JournalNode(JN)就是一种实现
- 明确分布式节点
- 明确节点权重
- 强一致性破坏可用性
- 过半通过可以中和一致性和可用性
- 最简单的自我协调实现:主从
- 主的选举:明确节点数量和权重即可
- 主从的职能
- 主:增删改查
- 从:查询,增删改传递给主
- 主与从:过半数就要同步数据
3:主备NN
- Active NN 和 Standby NN:两台 NN形成互备,一台处于 Active 状态,为主 NN,另外一台处于 Standby 状态,为备 NN,只有主 NN才能对外提供读写服务。
- 在HA模式中没有SecondaryNameNode(SNN),StandBy角色会滚动EditLog日志落向FSImage中,SNN只在非HA模式中
4:ZKFC
- 主备切换控制器 ZKFailoverController:ZKFC作为独立的进程运行(运行在NN所在主机上),对 NN的主备切换进行总体控制。
- 健康检测:zkfc会周期性的向它监控的namenode(只有namenode才有zkfc进程,并且每个namenode各一个)发生健康探测命令,从而鉴定某个namenode是否处于正常工作状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于不健康的状态;
- 会话管理:如果namenode是健康的,zkfc机会保持在zookeeper中保持一个打开的会话,如果namenode是active状态的,那么zkfc还会在zookeeper中占有一个类型为短暂类型的znode,当这个namenode挂掉时,这个znode将会被删除,然后备用的namenode得到这把锁,升级为主的namenode,同时标记状态为active,当宕机的namenode,重新启动,他会再次注册zookeeper,发现已经有znode了,就自动变为standby状态,如此往复循环,保证高可靠性,但是Hadoop2.x仅支持最多配置两个namenode,Hadoop3.x支持多个
- master选举:如上所述,通过在zookeeper中维持一个短暂类型的znode,来实现抢占式的锁机制,从而判断哪个namenode为active状态。
5:zookeeper
- Zookeeper 集群:为主备切换控制器提供主备选举支持。
- 目录树结构:/hadoop-ha/子目录下 有锁,主备NN争抢
- 事件机制–》callBack()回调函数,Watch监控着锁
- 有zkfc维持的临时节点