利用QJM和zookeeper实现HDFS高可用

为防止单点故障,在hadoop2.X中通常由两个NameNode组成,一个处于active状态(皇帝),另一个处于standby状态(太子)。Active NameNode负责和客户端的交流,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。

那么ActiveNameNode挂了怎么办?

这两台NameNode是以第三方的文件系统QJM为中介实现通信,Active NameNode做了什么会记录在edits文件中,镜像文件fsimage会进行备份,如果这两个文件储存在Active NameNode里,那么这台机器挂了之后,Standby NameNode即使接手也会导致数据丢失,所以edits文件被复制储存在第三方的文件系统中(不需要Secondary NameNode来合并文件了),而Standby NameNode定时与QJM通信,同步edits与fsimage文件。这样即使ActiveNameNode挂了,Standby NameNode也会完美接手他的工作。

QJM中journalnode挂了怎么办?

journalnode负责Active NameNode  edits文件和fsimage文件的储存,并把文件定时发送给Standby NameNode,若挂掉会导致瘫痪,所以我们多用几台journalnode以构成集群,并用zookeeper负责协调

如果ActiveNameNode假死怎么办?

ActiveNameNode和Standy NameNode身边都有一个zkfc(太监),皇帝身边的太监负责在zookeeper中注册监听器。如果皇帝死掉(假死),太子身边的太监将信息传递给太子,太子随即将standby状态切换为active(登基),但是皇帝是假死,所以出现了两个皇帝,这时客户端不知道该和谁交流,就会导致brain split(脑裂)。

脑裂怎么办?

新皇帝身边的太监首先会向老皇帝行凶(发送命令:ssh kill-9 namenode),如果没有成功,则会通知调用用户自定义脚本kill.sh,脚本执行后会返回一个状态码,0表示成功。

利用QJM和zookeeper实现HDFS高可用