在Hadoop1.X的时候,我么是无法给Hadoop集群做HA的机制,NameNode是一个单点的服务。那么在过去的1.X中如何保证NameNode挂机后集群还能正常运行呢?
通过给Hadoop做双机备份使用AvatarNode 这么个技术。
先来看一张图
这里呢,Client需要获取到block的位置,是从Active中的Node读取block位置。
两个角色
AvatarNode完全封装了NameNode。AvatarNode运行有两种模式ActiveAvatar或者
Standby Avatar。
如果启动运行在ActiveAvatar模式,那么它就和当前NameNode功能完全一样,其实运行的代码就是NameNode的代码。运行Active Avatar模式的AvatarNode机器,保存HDFS事务日志(editlog)到一个共享的NFS。
在另外一台机器上,启动AvatarNode的另外一个实例,运行在Standby Avatar模式。
Standby AvatarNode封装了NameNode和SecondaryNameNode。Standby AvatarNode持续的从共享的NFS filer中读取HDFS editlog,并持续的把这些事务推送到Standby AvatarNode中NameNode实例。Standby AvatarNode中的NameNode运行在SafeMode(安全模式)。原因是不能让它负责NameNode的工作,但是必须保持和NameNode同步的NameNode Metadata信息(Standby AvatarNode从NFS中读取transaction log,同时作用在自己内存中的namespace,已使得尽量和Active AvatarNode的元数据相同)。
切换过程
HDFS客户端访问NameNode通过一个虚拟IP(Virtual IP Address,注:这块其实可以使用ZK来取代)。当发生故障需要快速切换时,管理员会在机器M1上杀掉Primary AvatarNode进程,然后在机器M2上设置Standby AvatarNode作为Primary Avatar。Standby AvatarNode会保证把所有提交的事务都处理完,因为Standby AvatarNode会重新打开edit log,并处理
完文件中所有的事务。这个假设是基于NFS-V3支持close-to-open cache coherency semantics。
Standby AvatarNode把所有NFS filer上的事务处理完后,退出SafeMode模式。管理员将M2的VIP换位M1(状态的切换,如0和1两个下标,将0的下标该为1),这样所有的HDFS客户端的请求就会提交到M2实例上。
这个failover一般情况只需要几秒钟。另外根本不需要单独一台SecondaryNameNode。
AvatarNode在Standby avatar模式时,可以履行SecondaryNameNode的职责。
Standby AvatarNode持续的处理从Primary Avatar来的所有事务,在处理事务日志的空闲间隙会唤醒SecondaryNameNode进程,创建并上传一个新的checkpoint,Copy到Primary AvatarNode,接着在回来处理事务日志
Avatar DataNode
DataNodes同时和Active、Standby通信,则Standby Avatar也有DataNode的最新的block信息,因此Standby可以在短时间内转换到Active Avatar。AvatarDataNode不使用VIP和AvatarNode连接。(HDFS客户端通过VIP连接AvatarNode).Avatar DataNodes从ZK那知道哪个Avatar是Active的,因此只执行从Active Avatar来的删除、复制操作请求,对Standby传来的请求则忽略。