1、Hdfs的HA高可用:保证Hdfs高可用,其实就是保证namenode的高可用,保证namenode的高可用的机制有两个,editlog共享机制+ZKFC。ZKFC就是ZookeeperFailOverController,即zookeeper故障转移控制器。
2、nameNode的高可用机制:
(1)nameNode想要实现高可用,意味着集群中要存在多个nameNode,在nameNode出现故障的时候,能够进行快速切换。集群中平时只有一个nameNode在工作,这个nameNode就是active的,而其他nameNode是standby的。
(2)为了保证nameNode出现故障的时候,nameNode的切换速度。active nameNode将信息写入共享编辑日志文件,standby nameNode则读取共享文件,从而保持与active nameNode的同步。
(3)此外,集群中的dataNode要向所有的nameNode发送数据块处理报告。
(4)故障切换这个动作就需要ZKFC来保证,每个nameNode中都运行着一个ZKFC故障转移控制器,用于监视nameNode进程。而这个ZKFC是基于Zookeeper实现的,在启动的时候,会创建HealthMonitor和ActiveStandbyElector这两个组件,创建的同时,ZKFC也会向这两个组件中注册相应的回调方法。
(5)HealthMonitor初始化完成后会启动内部线程来定时调用nameNode的HAServiceProtocol Rpc接口,对nameNode进行健康监测。
(6)HealthMonitor如果检查到nameNode的健康状态发生了变化,就会回调ZKFC注册的相应方法进行处理。
(7)如果ZKFC经过判断后,认为需要进行主备切换话,会首先使用ActiveStandbyElector来进行自动的主备选举。
(8)ActiveStandbyElector完成了自动的主备选举后,会回调ZKFC的相应方法,通知相应的nameNode成为主nameNode或者备nameNode。
(9)ZKFC调用相应nameNode的HAServiceProtocol Rpc接口方法,将相应的nameNode设置成active或者standby。
3、Fencing实现:脑裂就是nameNode假死,Fencing就是防御脑裂。Hadoop公共库对外提供了两种Fencing实现,分别是sshfence和shellfence(缺省实现)。其中sshfence就是通过ssh登陆到目标nameNode节点上,用kill命令将其进程杀死;shellfence就是执行自定义的shell脚本。
4、如何判断是否发生了脑裂:判断持久化节点是否存在,持久化节点存在就是脑裂。