14.1为什么NameNode需要高可用
–NameNode是HDFS 的核心配置,HDFS 又是Hadoop的核心组件,NameNode在Hadoop集群中至关重要,NameNode机器宕机,将导致集群不可用,如果NameNode数据丢失将导致整个集群的数据丢失,而NameNode的数据的更新又比较频繁,实现NameNode高可用势在必行
?为什么NameNode需要高可用
–官方提供了两种解决方案
–HDFS with NFS
–HDFS with QJM
–两种翻案异同
NFS | QJM |
NN | NN |
ZKFailoverController | ZKFailoverController |
NFS |
JournalNode |
14.3 HA 方案对比
–都能实现热备
–都是一个active NN 和一个standby NN
–都使用Zookeeper 和ZKFC 来实现自劢失效恢复
–失效切换都使用fencing 配置的方法来active NN
–NFS 数据数据共享变更方案把数据存储在共享存储里面,我们还需要考虑NFS 的高可用设计
–QJM 不需要共享存储,但需要让每一个DN 都知道两个NN 的位置,并把块信息和心跳包发送给active和standby这两个NN
14.3 NameNode高可用方案(QJM)
–为了解决NameNode单点故障问题,Hadoop给出了HDFS 的高可用HA方案:HDFS 通常由两个NameNode组成,一个处于active 状态,另一个处于standby 状态。Active NameNode对外提供服务,比如处理来自客户端的RPC 请求,而Standby NameNode则丌对外提供服务,仅同步Active NameNode的状态,以便能够在它失败时迚行切换。
14.4 NameNode高可用架构
–一个典型的HA集群,NameNode会被配置在两*立的机器上,在任何时间上,一个NameNode处于活动状态,而另一个NameNode处于备份状态,活劢状态的NameNode会响应集群中所有的客户端,备份状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的转移。
–为了让Standby Node不Active Node保持同步,这两个Node都不一组称为JNS的互相独立的迚程保持通信(Journal Nodes)。当Active Node上更新了namespace,它将记录修改日志发送给JNS的多数派。Standby noes将会从JNS中读取这些edits,并持续关注它们对日志的变更。Standby Node将日志变更应用在自己的namespace中,当failover发生时,Standby将会在提升自己为Active之前,确保能够从JNS中读取所有的edits,即在failover发生乊前Standy持有的namespace应该不Active保持完全同步。
–NameNode更新是很频繁的,为了的保持主备数据的一致性,为了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。为了达到这一目的,DataNodes上需要同时配置这两个Namenode的地址,同时和它们都建立心跳链接,并把block位置发送给它们
–还有一点非常重要,任何时刻,只能有一个Active NameNode,否则将会导致集群操作的混乱,那么两个NameNode将会分别有两种丌同的数据状态,可能会导致数据丢失,戒者状态异常,这种情冴通常称为“split-brain”(脑裂,三节点通讯阻断,即集群中丌同的Datanode看到了丌同的Active NameNodes)。对于JNS而言,任何时候只允讲一个NameNode作为writer;在failover期间,原来的Standby Node将会接管Active的所有职能,并负责吐JNS写入日志记录,这中机制阻止了其他NameNode基于处于Active状态的问题。