namenode的ha实现
1)状态为active状态的namenode向共享文件系统journalnode写入编辑文件日志,状态为standby的namenode从共享文件系统读取编辑日志,保持与active节点的同步;
2)每个datanode节点会向所有的namenode节点报告自身的信息和状态;
3)zkfc作为一个轻量级故障转移控制器,基于zookeeper实现的机制,由namenode运行的独立线程,在启动zkfc时,他会注册healthmonitor和activestandbyelector服务组件,同时会向注册的服务组件注册相应的回调方法。
其中healthmonitor主要负责监控namenode的状态,当namenode状态改变,会回调ZKFC的相应方法进行自主的主备选举。
ActivestandbyElector:主要进行主备选举,内部调用zookeeper的选举逻辑,当选举结束后,调用zkfc的相应方法切换主namenode或者备namenode的状态。
主备切换的逻辑图如下:
1)healthmonitor监控namenode的状态,判断namennode装填是否改变
2)当namenode状态改变,则healthmonitor调用在ZKFC进行主备选举;
3)ZKFC判断是否需要进行主备选举。如果需要,则调用activestandbyElector组件
4)activestandbyElector与zookeeper集群交互,进行主备选举,当 发起一次主备选举时,zookeeper会尝试创建临时节点,zookeeper的写一致性保证最终只会有一个activestandbyElector创建成功,创建成功的 ActiveStandbyElector对应的NameNode就会成为主NameNode;
5)主备选举结束后,activestandbyElector回调zkfc的对应方法,通知namenode切换状态;
6)zkfc调用HAServiceProtocol RPC接口的方法,切换主namnode或者备namenode状态。
防止脑裂:
脑裂产生的情况有以下几种:
1)由于zookeeper的假死
2)长时间的垃圾回收或者网络异常等
脑裂的情况下,会出现两个active状态的namenode对外提供服务,无法保证数据一致性。
防止脑裂的步骤如下:
1)activestandbyElector在zookeeper创建临时节点的同时,会创建一个持久节点,
2)当 active状态的namenode正常关闭,会删除临时节点和持久节点,
3)当namenode异常关闭时,持久节点不会关闭,当查找到还有对应的持久节点时,可以调用hadoop自带的隔离机制:sshfence(直接通过端口查找进程id,kill进程)或shellfence方式(执行已有的shell脚本),执行fencing过程。
注: 峰值时间每秒请求数(QPS)