HDFS高可用与联邦机制
1.HDFS高可用
-
对于HDFS ,NN存储元数据在内存中,并负责管理文件系统的命名空间和客户端对HDFS的读写请求。但是,如果只存在一个NN,一旦发生“单点故障”,会使整个系统失效。
-
虽然有个SNN,但是它并不是NN的热备份
-
因为SNN无法提供“热备份”功能,在NN故障时,无法立即切换到SNN对外提供服务,即HDFS处于停服状态。
-
HDFS2.x采用了HA(High Availability高可用)架构。
-
在HA集群中,可设置两个NN,一个处于“活跃(Active)”状态,另一个处于“待命(Standby)”状态。
-
由zookeeper确保一主一备(讲zookeeper时具体展开)
-
处于Active状态的NN负责响应所有客户端的请求,处于Standby状态的NN作为热备份节点,保证与active的NN的元数据同步
-
Active节点发生故障时,zookeeper集群会发现此情况,通知Standby节点立即切换到活跃状态对外提供服务
-
确保集群一直处于可用状态
-
-
如何热备份元数据:
-
Standby NN是Active NN的“热备份”,因此Active NN的状态信息必须实时同步到StandbyNN。
-
可借助一个共享存储系统来实现状态同步,如NFS(NetworkFile System)、QJM(Quorum Journal Manager)或者Zookeeper。
-
Active NN将更新数据写入到共享存储系统,Standby NN一直监听该系统,一旦发现有新的数据写入,就立即从公共存储系统中读取这些数据并加载到Standby NN自己内存中,从而保证元数据与Active NN状态一致。
-
-
块报告:
-
NN保存了数据块到实际存储位置的映射信息,为了实现故障时的快速切换,必须保证StandbyNN中也包含最新的块映射信息
-
因此需要给所有DN配置Active和Standby两个NN的地址,把块的位置和心跳信息同时发送到两个NN上。
-
2.联邦机制
虽然HDFS HA解决了“单点故障”问题,但HDFS在扩展性、整体性能和隔离性方面仍有问题
-
系统扩展性方面,元数据存储在NN内存中,受限于内存上限(每个文件、目录、block占用约150字节)
-
整体性能方面,吞吐量受单个NN的影响
-
隔离性方面,一个程序可能会影响其他程序的运行,如果一个程序消耗过多资源会导致其他程序无法顺利运行
-
HDFS HA本质上还是单名称节点
HDFS联邦可以解决以上三个问题
-
HDFS联邦中,设计了多个命名空间;每个命名空间有一个NN或一主一备两个NN,使得HDFS的命名服务能够水平扩展
-
这些NN分别进行各自命名空间namespace和块的管理,相互独立,不需要彼此协调
-
每个DN要向集群中所有的NN注册,并周期性的向所有NN发送心跳信息和块信息,报告自己的状态
-
HDFS联邦每个相互独立的NN对应一个独立的命名空间
-
每一个命名空间管理属于自己的一组块,这些属于同一命名空间的块对应一个“块池”的概念。
-
每个DN会为所有块池提供块的存储,块池中的各个块实际上是存储在不同DN中的