关于HDFS1.0的知识可以看看这篇文章
下面我们根据HDFS2.0的一些新特性,从HA(高可用)、Federatio(联邦)、快照、缓存、ACL(权限)等方面来聊聊
HA(高可用)
首先我们要知道HA,是为了解决什么问题呢?
这是为了解决单点故障的问题,虽然HDFS1.0中有SNN(SecondaryNameNode),但是并不可靠,在HDFS2.0中,使用两个NameNode,一个Active,另一个StandBy。我们先看一下流程图,再详细讲解
我们从下往上说
1.为了保证两个NameNode的数据一致性,DataNode要对两个NameNode同时发送心跳
2.ActiveNameNode承担所有与客户端的操作,读写删除等操作
3.StandByNameNode不做其他操作,与active保持一个通信关系,与active保持数据同步。如果active挂掉,standby要做好称为active的准备
4.JN:主要目的是让ActiveNN和StandByNN保持数据同步(下面我们再详细讲)
5.引入ZooKeeper的目的是为了协调分布式集群中各个节点工作有序运行,完成故障转移
对流程有一个大概的了解之后,我们再针对细节讲解一下
1.引入Zookeeper主要是为了协调运行和完成故障转移,那么具体是怎么做到的呢?
a)在HDFS2.0中,ZKFC(ZooKeeperFailoverController-故障转移控制)是一个进程,和NN部署在同一个机器上,ZKFC的目的是负责对自己管辖之内的NN进行健康检查,通俗说就是检查NN是否挂掉。
ZKFC会在Zookeeper上注册一个临时节点,目的用于监控NN,一旦NN挂掉,相对应的临时节点消失,接下来开始选主(申请锁)流程
b)引入Zookeeper也是为了避免分歧,在任何情况下,NameNode只有一个active状态,否则导致数据的丢失及其他不正确的结果。在任何时间,JNs只允许一个NN充当writer,在故障恢复期间,将要变成active状态的NN将取得writer的角色,并阻止另外一个NN继续处于active状态
2.JN(JournalNodes),我们思考一个问题,DataNode要对两个NN同时发送心跳,目的保证一致性,但是为什么还需要JN?
这是因为两者保证的数据类型不同,JN是文件-->block,DadaNode的心跳是block-->DN,数据丢失可以根据心跳恢复,无需JN保管。
JN通常配置成奇数个(2N+1),如果N个数据是一致的,那么数据就能确定下来,会去同步standby目录镜像树
JN有两种技术选择
一是NFS,采用网络挂载的方式,需要额外的磁盘空间
二是QJM(最低法定人数管理机制),它的原理是,用2n+1台机器存储edit log,每次写数据操作属于大多数(n+1)时候,返回成功,保证高可用,本质上也是一个小集群。使用QJM有以下好处
a)不需要额外的磁盘空间
b)无单点问题
c)不会因为个别机器延迟,影响整体性能(大多数n+1的时候,返回成功),也不会因为JN的数据增多而影响(active数据变化会同步发送到JN上)
d)通过简单的系统配置就可以实现
3.节点的部署情况
1)NN和JN通常不在一台机器上
2)FC和NN在同一台机器上
3)RM(Yarn中的资源管理器,相当于1.0中的jobtracker的部分功能)和NN在同一台机器
4)zookeeper通常是单独维护的一套独立集群
NameNode Federation(联邦)
集群中提供多个NameNode,每个NameNode负责管理一部分的DataNode,目的是减轻单一的NameNode压力,将一部分文件转移到其他NameNode上管理
本质上是将元数据原理(NN)和存储(DN)进行解耦,但是实际情况是:数据的存储仍然是共享的
联邦实现了NameNode的横向扩展,使得Hadoop集群的规模可以达到上万台,突破了单独的NN的限制,支持更多数据存储
HDFS快照
HDFS快照是一个只读的基于时间点的文件系统拷贝,本质上也会占用空间(仅仅记录了block列表和大小而已,并不涉及数据本身的复制),快照创建的过程非常快,瞬间完成,很高效。
HDFS快照的作用主要是数据备份,灾备,快速恢复
HDFS缓存
HDFS缓存是集中式的缓存(不局限于具体的机器CPU和操作系统层面上的优化),集中式的缓存管理对于重复访问的文件很有用,允许用户指定要缓存的HDFS路径,而且明确的锁定可以阻止频繁使用的数据被从内存中清除
ACL(权限控制)
目前HDFS的权限控制与Linux一致,包括用户、用户组、其他用户组三类权限,这种方式有很大局限性,通过以下这张图就能了解权限是怎么构成的了