一般版2.x组成及基本功能

相较于一般版本高可用架构作出以下调整

  • 去掉了secondaryNamenode,并减少了一个新的namenode与状态(active和standby)
  • 减少了zookeeper与主备切换控制器failoverController(下文均称为zkfc)和衰弱监控health monitor机制

组成详解

  • 我的上一篇分布式文件系统有基本功能的图解本篇不具体讲,挑高可用重点讲
  • namenode: 两台互备,一台active为主namenode,对外读写任务调度,综合机架感知,网络拓扑,正本机制,告知client去哪个datanode进行读或者写
  • zkfc主备切换器:及时检测namenode的衰弱状态,activenamenode故障时主动进行主备选举和切换
  • zookeeper集群:为主备切换控制器提供主备选举反对能够看我之前的zookeeper性能和选举模式,简略来说就是利用watch配合会话长期目录实现抢锁,实现选举
  • 共享存储系统:保留namenode在运行过程产生的元数据,同步到备份节点。实现namenode的高可用
  • datanode

主备切换实现

  • zkfc
启动时会创立 healthMonitor和activestandbyelecor两个次要的外部组件,同时注册回调
  • HealthMonitor:检测namenode衰弱状态,宕机时会回调zkfc对应办法进行主备选举
  • ActiveStandByElector:次要负责实现主动的主备选举,并且回调zkfc的办法实现namenode主备状态切换

步骤

  • 0.zkfc初始化时创立healthMonitor
  • 1.healthMonitor初始化实现之后会启动外部的线程定时调用对应的namenode中HAServiceProtocol RPC接口办法,进行衰弱状态检测
  • 2.检测到衰弱状态变动,会回调zkfc注册对应办法解决
  • 3.判断须要主备切换,应用acitvestandbyelector进行主动的主备选举
  • 4.选举实现告诉新的主namenode和备namenode
  • 5.zkfc调用对应namenode的HAServiceProtocol RPC 接口的办法将 NameNode 转换为 Active 状态或 Standby 状态。

HealthMonitor,检测的次要局部

  • 次要工作

    • 1.检测namenode的两类状态 healthMonitor.state和HAServiceStatus。state反馈namenode节点健康状况,次要是磁盘存储资源是否短缺,异样状态有not_response,unhealthy,failed。

HAServiceStatus,检测中辅助作用

  • 反馈namenode的HA状态

ActiveStandbyElector主备选举

  • 利用zookeeper的写一致性和长期节点机制
  • 1.创立锁节点,创立胜利的namenode会切换到active,失败的为备选并且由ActiveStandbyElector回调zkfc将其转为standbyzookeeper性能和选举模式
  • 2.注册watcher监听,不论是否抢锁胜利都会注册一个watch来监听节点状态变动事件,ActiveStandbyElector次要关注节点的nodeDelete
  • 3.主动触发主备选举,

    • 3.1Active NameNode 对应的 HealthMonitor 检测到namenode状态异样,zkfc会被动删除在以后zookeeper上建设的锁节点,而standby状态的namenode的ActiveStandbyElector注册的监听器就会收到这个节点的nodedel事件,紧接着马上再次进入到创立锁的过程,创立胜利,standby便转为active
    • 3.2active的namenode整个机器宕机因为长期节点机制,锁节点被主动删除,也会主动进行一次主备切换
  • 4.避免脑裂

    • zookeeper客户端负载过高或正在进行jvm full gc导致与zookeeper服务端心跳不能失常收回屡次国有被断定为会话过期,假如namenode1对应zkfc假死,zookeeper认为其挂掉切换主机为namenode2,此时namenode1的zkfc随着负载降落恢复正常,但网络提早和cpu线程调度不确定导致namenode1可能会仍认为本人是active。namenode1与namenode2此时都能够对外提供服务对于一致性要求高的零碎来说是灾难性的
    • ActiveStandbyElector 采纳了fencing将旧节点隔离,不仅用了长期的锁节点(ActiveStandbyElectorLock),并且还生成一个长久节点(ActiveBreadCrumb),保留以后acitvenamenode地址信息,失常敞开zookeepersession时该长久节点是会删除的,但某次选举胜利后如果新的activenamenode发现旧的长久节点依然存在会回调zkfc办法对旧的namenode进行fencing
    • 4.1其余参考计划

      • 冗余心跳线,多条心跳线尽量减少裂脑事件
      • 智能磁盘锁,正在服务的一方,检测不到对方的心跳时启动磁盘锁
      • 仲裁机制:心跳断开时,ping网管ip,不通被动放弃竞争主动重启

zkfc实现

  • zkfc在创立healthMonitor和acitveStandbyElector的同时,会向healthMonitor和activeStandbyElector注册相应的回调,解决则次要靠这些回调
  • 如果ActiveStandbyElector选主胜利,对应的namenode成为主namenode,ActiveStandbyElector回调zkfc的becomeActive,而becomeActive会调用对应namenode的HAserviceprotocol rpc接口的transitiontoacive办法将namenode转为active
  • 选主失败,变为备namenode,activestandbyelector会回调zkfc的becomestandby调用对应namenode的HAServiceProtocol RPC接口的transitiontostandby办法将对应namenode变为standby
  • 选主胜利却发现上一个active留下来的长久化节点,则先调用zkfc注册的fenceOldActive尝试隔离旧的active namenode,过程为以下几局部

    • 1.尝试调用旧active namenode的HAServiceProtocol RPC接口的transittionToStandby办法,
    • 2.失败的话执行配置文件中的隔离措施

      • 2.1sshfence 通过ssh登录到指标机器执行fuser干掉对应过程
      • 2.2shellfence 执行一个用户自定义的shell脚本将对应的过程隔离
    • 3.只有在胜利进行fencing后才会再回调zkfc的becomeActive办法将对应的namenode切换为active对外提供服务

NameNode的共享存储实现

元数据存储,namenode启动复原

  • hdfs原理读写局部简略阐明就是namenode在执行hdfs客户端提交的操作时会把这些操作记录在edits中,肯定条件下,满64m或一小时或重启会新建并切换到一个edits记录,并且namenode会定期对edits进行合并生成fsimage,与1.x不同,本来由secondarynamenode实现此项工作,
  • namenode启动时须要将fsimage文件加载到内存后再加载edits复原到敞开前状态
  • QJM共享存储参考QJM数据同步

常见问题

  • zookeeper过于敏感导致无谓的namenode切换,session-timeout默认值调高
  • 羊群效应,大量节点监控一个节点,变动后须要告诉的节点很多导致性能降落,依据业务调整