一、目的
本指南描述了HDFS HA的特性以及如何使用QJM(Quorum Journal Manager)来配置和管理HA HDFS集群
二、HDFS架构图
image.pngDN: 同时向NN1 NN2发送心跳和块报告。
ACTIVE NN:
操作记录写到自己的editlog
同时写JN集群
接收DN的心跳和块报告
STANDBY NN:
同时接收JN集群的日志,显示读取执行log操作(重演),
使得自己的元数据和active nn节点保持一致。
接收DN的心跳和块报告
JounalNode:
用于active standby nn节点的同步数据
ZKFC: 单独的进程
监控NN监控健康状态
向zk集群定期发送心跳,使得自己可以被选举;
当自己被zk选举为active的时候,zkfc进程通过RPC协议调用使NN节点的状态变为active,
对外提供实时服务,是无感知的。
三、背景
在Hadoop 2.0.0之前,在一个HDFS集群中,NameNode是一个单一的节点,可能引起单点故障问题(SPOF)。一个集群只有一个NameNode,如果机器或者进程不可用,那么整个集群将会不可用直到NameNode重启或者在另外的机器启动NameNode。
这将影响HDFS集群的高可用性,主要体现在2个方面:
-
一个计划外的事件发生例如机器故障,那么整个集群在运维人员重启NameNode之前都不可用。
-
计划内的维护事件例如NameNode机器的软件或者硬件升级,将会导致整个集群停工。
HDFS HA特性使用在一个集群中提供2个NameNode来解决上述问题,让Active/Passive NameNode之间进行热备份。这样当一个机器故障或者管理者在系统运维过程中主动友好发起故障时,允许立即切换到一个可用的NameNode。
四、架构剖析
在一个典型的HA集群中,2个单独的机器被配置为NameNode。任意时间点,一个NameNode是Active状态,另一个是Standy状态。集群中客户端发来的请求都会由Active NameNode来负责,而Standby节点只是一个简单从节点,保存集群中的状态数据来作为故障切换时备用。
为了让Standy 节点和Active节点的状态同步,2个节点都同时和一组单独的称为JournalNodes(JNs)的后台程序进行通信。当Active 节点的任意命名空间被更改时,一条描述本次更改的持久化的日志就会被写入大部分的JNs。Standby节点能够读取JNs的这些edit,周期性的查看edit log的变化,一旦Standby节点查看到edit,就立刻应用到自己的命名空间。当故障发生时,Standby在自己变成Active 状态之间能够保证从JounalNodes 读完所有的edits,这样就能保证命名空间的状态跟故障发生之前完全同步。
为了提供一个快速的故障切换,Standy节点必须包含集群中文件块的最新的位置信息,为了实现这一目的,DataNode会和2个NameNode都配置好,同时向2个NameNode发送心跳和文件块位置信息。
任意时刻一个HA集群中只有一个NameNode是至关重要的,否则命名空间会在2个节点之间快速分割,导致数据丢失或者造成不正确的结果。为了保证这一特性避免发生所谓的“split-brain scenario”,JournalNodes 只允许同一时间只有一个NameNode是写状态。当故障发生主备切换时,即将变成active的NameNode就会很容易接管向JournalNodes 的写权限,同时阻止另一个NameNode继续维持Active状态,这样就能够保证安全的切换到新的Active
注:由于文件块位置信息也有一定大小,所以为了提供一个各快速的故障切换,
架构设计中DataNode也需要向 Standby NameNode发送心跳和文件块信息
五、注意点
1、HDFS HA中ZKFS为进程,YARN HA中 ZKFS为线程
2、HDFS HA架构中DN会向Standby NN发送心跳,但是YARN HA架构中NM不会像Standby RM发送心跳
3、HDFS的读写是通过主进程(NameNode)的,但是HBase的读写不是通过主进程(HMaster)的
4、HDFS HA中的命名空间(NameService)不是进程
5、HDFS单节点中的secondaryNamenode是一小时 checkpoint一次NameNode。存在很严重的单点故障
6、当集群规模达到200+后,一台机器上最好就部署ZK一个进程,ZK进程数量为2n+1
7、JounalNode一般不署2n+1
网友评论