CDH4 HA方案

CDH4 HA方案

HDFS HA方案

HDFS QJM 方案

QJM手动切换方案


手动切换方案,即在管理员发现Active NN不工作以后,或者由于升级等原因,手动将Standby NN切换为Standby NN。

手动切换的流程为:
1. 管理员在Active NN上,通过Hadoop命令行工具,通过HAAdmin工具(实现了Tools接口),将Active NN切换为Standby NN

  hadoop HAAdmin  -transitionToStandby

成功后,集群变为两个Standby NN,此时客户端会在两个Standby NN之间来回重试。
2. 管理员在Standby NN上,通过Hadoop命令行工具,通过HAAdmin工具(实现了Tools接口),将Standby NN切换为Active NN
  hadoop HAAdmin  -transitionToActive

成功后,集群重新变为一个Active和一个Standby的状态,客户端开始连接新的Active NN工作。

不同于NFS方案,以上两步操作如果没有顺序执行,也不会出现同时又两个Active NN的情况。这也是QJM方案的核心优势之一。
下面,我们看一下,如果原Active NN没有切换为Standby的情况下,将 Standby切换为Active会发生什么情况:

首先,每个NN都持有一个QuorumJournalManager,QuorumJournalManager可以理解为JournalNode的客户端,通过它可以连接到任意JournalNode(在hdfs-site.xml文件里配置的dfs.namenode.shared.edits.dir,配置了所有JournalNode的地址:qjournal://ocdata16:8488;ocdata17:8488;ocdata18:8488/mycluster)。QuromJournalManager通过AsyncLoggerSet保存到所有JournalNode的连接,对loggers的每次操作,都会通过call.waitFor等待各个JournalNode的返回结果。对于大部分操作,waitFor传入的最小返回节点数为(总节点数/2+1),对于format等特殊操作,传入的最小返回节点数为总节点数。

将Standby切换为Active时,调用:NameNode.startActiveServices()->FSNamesystem.startActiveServices()->FSEditLog.recoverUnclosedStreams()->JournalSet.recoverUnfinalizedSegments()->QourumJournalManager.recoverUnfinalizedSegment()->QourumJournalManager.createNewUniqueEpoch()

这时候,首先向所有的JournalNode询问他们最后的Epoch,在收到半数返回后,选择最大的epoch,这个epoch就是原Active NN持有的epoch。把这个epoch加1,然后告诉所有的JournalNode 这个新的epoch。从此以后,原Active只要操作EditLog,JournalNode就会发现它的epoch已经小于自己的epoch了,于是拒绝操作。

Edit

JobTracker HA 方案

Edit

本文图片采用Graphviz生成,源码保存在PNG文件中。修改图片步骤:
  1. 下载图片
  2. 使用文本编辑工具打开图片,最后面为文件源码,如:
    digraph G {
        edge [fontname="FangSong"]
        node [fontname="FangSong"]
        compound=true
        subgraph cluster_1{
            fillcolor="#00FF80" 
            style=filled
            JournalNode3 JournalNode2 JournalNode1
        }
        subgraph cluster_2 {
            fillcolor="#FF8000" 
            style=filled
          DataNode5 DataNode4 DataNode3 DataNode2 DataNode1
        }
        subgraph cluster_NameNode_Active {
            fillcolor="#00FFFF" 
            style=filled
            label="NameNode(Active)" 
            QuorumJournalManager_L HAAdmin_L
        }
        subgraph cluster_NameNode_Standby {
            fillcolor="#00FFFF" 
            style=filled
            label="NameNode(Standby)" 
           QuorumJournalManager_R HAAdmin_R 
        }
        JournalNode2 -> DataNode3[style=invis]
    
        QuorumJournalManager_L -> JournalNode2[lhead=cluster_1,label="日志写入"]
        QuorumJournalManager_R -> JournalNode2[dir=back,lhead=cluster_1,label="日志读取"]
        QuorumJournalManager_L -> DataNode2[dir=back,lhead=cluster_2,ltail=cluster_NameNode_Active,label="BlockReport"]
        QuorumJournalManager_R -> DataNode4[dir=back,lhead=cluster_2,ltail=cluster_NameNode_Standby,label="BlockReport"]
    
        HAAdmin_L->QuorumJournalManager_L[style=invis]
        HAAdmin_R -> QuorumJournalManager_R[style=invis]
    
        User -> {HAAdmin_L HAAdmin_R}[label="手动切换"];
    
        User[label="用户",fillcolor="#5A99CC",style=filled]
        HAAdmin_L[label="HAAdmin"]
        HAAdmin_R[label="HAAdmin"]
        QuorumJournalManager_L[label="QuorumJournalManager"]
        QuorumJournalManager_R[label="QuorumJournalManager"]
    }
    
  3. 复制源码并修改
  4. 通过Graphviz重新生成图片
  5. 将修改后的源码保存在新生成文件的末尾 
原文地址:https://www.cnblogs.com/java20130722/p/3206921.html