HDFS的高可用
可用性用小时来衡量,如:7*24小时、364 * 24高可用
不能简单的通过keepalive来进行NameNode的高可用。因为NameNode需要有大量的状态信息维护。
可行的方法:两个NameNode,一个对外工作(active),一个后补(standby),这就涉及到元数据同步的问题。可以将edits保存到第三方,standy的NameNode即可收到edits,从而保持元数据的更新。
如果active宕机了,standby立即可以切换到active状态并对外提供服务。
为了系统的稳定,第三方的组件最好也实现高可用。叫做qjournal,基于ZooKeeper实现,功能是进行edits日志管理。这样提高了可靠性和可用性,但是牺牲了一部分数据一致性。
每个NameNode中有个程序ZKFC用来同qjournal同步自己的状态,基于ZooKeeper做状态切换。ZKFC通过RPC的接口调用NameNode,然后就可以确认NameNode的状态。一旦active上面的ZKFC发现active挂掉了,它向ZooKeeper发送状态变化信息。
standby的ZKFC监听到节点变化后,通知NameNode切换到Active状态,随后在ZooKeeper上建立状态锁。通知切换之前为了保证之前的NameNode一定被隔离,ZKFC会直接调用kill -9杀掉之前的NameNode进程,如果等一段时间没有响应,会调用用户脚本来进行操作,用户脚本返回0表示隔离成功。
先前宕机的active修复重启后,ZKFC会检测到状态锁的存在,让其处于standby状态。此时不需要SecondaryNameNode了,交给standby的NameNode负责。
YARN的高可用
YARN由于不需要记录元数据和状态信息,所以YARN的高可用不是那么迫切,但是也实现了高可用。就是做了多个ResourceManager。
机制也很简单,就在ZooKeeper上注册一把锁,如果ResourceManager挂了,通过一些选举,重新顶上去就可以了。
如果挂的时候用户正在跑程序,也没关系,用户的程序再跑一次即可。
最后上一张图。