vlambda博客
学习文章列表

Hadoop (HDFS) HA架构通信机制

 HA高可用架构体系

首先,HDFS HA架构,一般指的是namenode的高可用,即:
1、一主一备两个namenode,他们通过Journalnode集群实现元数据等状态保持一致,一个出现健康问题,另一个就切换成新主,保证namenode稳定局面是保证hdfs集群稳定的关键所在
2、通过ZKFC持续监听两个namenode健康状态监控,若活跃节点出现健康问题,将由zookeeper对namenode锁释放,实现namenode高可用切换。
通过一张图我们除了看看namenode高可用通信机制,也同时看看datanode与namenode的通信情况:

如上图所示:

1. NameNode一主一备,当然是在不考虑联邦模式(Federation,联邦模式说白了也就是namenode的水平化伸缩,目的就是别把元数据和RPC操作都集中到一个地方,变成瓶颈,适合超大规模数据存储)的情况下。两个namenode通过对zookeeper集群目录的活跃锁争夺,来明确谁是活跃的(active)。

2. FailoverControllerActive(ZKFC)每个namenode上都有一个这样的服务,就是监控namenode健康,并把健康心跳不断报告给zookeeper,活动namenode不心跳了,zookeeper就把锁给另一个备着的namenode,那么它就成为Active namenode状态了。

3. 由多个Journalnode组成QJM高可用集群,提供active namenode各项元数据的状态信息存储服务,并为备用namenode提供这些信息状态同步服务,因此备用namenode就可以随时等待active namenode故障时,zookeeper对活跃锁的释放,使其切换成新的活动首领。



namenode和datanode直接通信关系

它们两个之间一种是直接通信的情况,另一种是客户端与它们两者建立直接通信(相当于两者是间接通信关系了)。
直接通信很好理解,分成了两个阶段
1. datanode初始化阶段,会创建namenode的代理对象,通过RPC调用,将datanode注册给namenode,包括存储信息、主机地址、UUID、端口、版本等等...,而namenode接收到datanode信息后,会记录到自己的网络拓扑数据结构中,namenode也是根据网络拓扑结构为客户端提供最佳位置(最近)的datanode副本。
2. 注册好以后,datanode通过namenode代理向其发送心跳(heartbeat),一般3秒建立一次心跳连接,如果在超过约定间隔,namenode探测到没与datanode的建立心跳,namende会认为这个datanode节点挂了,然后寻求一个新的datanode数据节点,根据相应挂掉节点的副本数据,为新的节点增加副本数据。


namenode和datanode间接通信的关系

由客户端主导并参与其中的通信机制——namenode和datanode之间没有直接通信关系,始终通过客户端保持一种间接通信的关系。
主要是通过客户端来实现数据的上传和下载

HDFS客户端读取流程概括图

如上图所示:

1. 客户端向hdfs namenode节点发送Path文件路径的数据访问的请求

2.  Namenode会根据文件路径收集所有数据块(block)的位置信息,并根据数据块在文件中的先后顺序,按次序组成数据块定位集合(located blocks),回应给客户端。
3. 客户端拿到数据块定位集合后,创建HDFS输入流,定位第一个数据块所在的位置,并读取datanode的数据流。之后根据读取偏移量定位下一个datanode并创建新的数据块读取数据流,以此类推,完成对HDFS文件的整个读取。

HDFS客户端写入流程概括图

如上图所示:

1. 客户端先通过namenode代理,请求namenode创建数据块和分配datanode。
2. 客户端通过HDFS输出流的方式将dfs包写入namenode指定的datanode数据块中,datanode通过写入链的方式完成其他副本的数据块写入,并依次返回完成确认。
3. 客户端的HDFS输出流在得到完成确认(ACK)之后,关闭HDFS文件流,并向namenode汇报完成。