1、Zookeeper为基础的集群上,NameNode 部署在2个节点上;两个NameNode 在ZK中谁先注册,谁就是Active,剩余的就是Standly状态;而同一时间只有一个NameNode 对外提供服务 ->Active NameNode。
2、Zookeeper中有两个FailoverController,一个负责ANN的状态,一个监控SNN的状态,FailoverController通过心跳负责将监控信息保存在znode中。
3、Standly NN负责同步Active NN中的元数据信息,也接收Activie NN的块报告,所有的DN上的Block 块的信息会同时发送给active NN 和 Standly NN,这样他们的信息能够同步。(JN进程进行主从复制)
4、Edits日志只有Active状态的NameNode 节点可以进行写操作,但是两个NameNode 都可以读取Edits;
5、当Active NN节点发生故障,zookeeper 通过FailoverController 感知到,ZK会自动销毁Active znode(排它锁)。Standly NN的监控器检测到Active NN的znode被移除,通知NameNode 节点开始工作,并发送 kill -9 nameNode 进程号,杀掉进程,Standly NN切换到Active状态。