一、HA的原理和架构
NameNode 保存了整个 HDFS 的元数据信息,一旦 NameNode 挂掉,整个 HDFS 就无法访问。为了提高HDFS的高可用性,在 Hadoop2.0 中,HDFS NameNode支持了高可用架构,如下图。
从上图中,我们可以看出 NameNode 的高可用架构主要分为下面几个部分:
Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。
主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。
Zookeeper 集群:为主备切换控制器提供主备选举支持。
共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务,主要有JournalNode 。
DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。
二、故障切换
当Active NN故障时,Zookeeper创建的临时节点ActiveStandbyElectorLock将要被删除,其他NN节点注册的Watcher 来监听到该变化,NN节点的ZKFailoverController 会马上再次进入到创建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点的流程,如果创建成功,这个本来处于 Standby 状态的 NameNode 就选举为主 NameNode 并随后开始切换为 Active 状态。
新当选的Active NN将确保从QJM(Quorum Journal Manager)同步完所有的元数据文件EditLog文件,然后切换为主节点,并向外提供服务。
备注:
- Active NN节点通过QJM组件Standby NN同步EditLog文件。
- Standby 节点定时checkpoint生成Fsimage文件,并通过http协议传给Active NN节点。
三、验证Failover
在active master节点上,通过jps
命令
找到master进程PID,执行kill -9 $PID,然后hdfs haadmin -getServiceState nn1 如下:
则证明已经切换成standby状态
触发 failover 需要的时间通过ha.zookeeper.session-timeout.ms 配置项,默认为 5 秒。
四、冷备份节点secondarynamenode操作
背景
SecondaryNameNode是namenode的冷备份,而namenode的HA高可用才是namenode的热备份。区别是SecondaryNameNode中存储的元数据不是实时的,滞后于namenode主节点。
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息、表名字等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。
- fsimage:它是NameNode启动时对整个文件系统的快照。
- edits:它是在NameNode启动后,对文件系统的改动序列。
由于NameNode合并FsImage和edits只在启动时,edits日志文件会变得很大在一段时间内并运行在繁忙的集群上 ,一个副作用是一个更大的edits文件会使NameNode在下次重新启动时需要更长的时间
Secondary NameNode定期合并FsImage和edits日志文件,并保持edits日志文件大小在一定限度。
命令介绍
代码语言:javascript复制hdfs secondarynamenode [-checkpoint [force]] | [-format] | [-geteditsize]
参数 | 说明 |
---|---|
-checkpoint [force] | 检查SecondaryNameNode,如果EditLog的大小超过fs.checkpoint.size,则更新EditLog到fsimage上。 如果使用force参数,则忽略目前EditLog大小,直接更新fsimage |
-format | 在启动时候,格式化本地存储 |
-geteditsize | 打印Namenode上没有合并入fsimage操作命令条数 |