1. 程式人生 > >HA高可用

HA高可用

mas node ssh ots fault check 完成 web 兩個

HA:高可用
-----------------------------------------------------------
1.Quorum Journal Manager:群體日誌管理
  個數2n+1個,保證節點宕機次數為(n-1)/2;一般情況下,JNS在slave節點開啟;
2.HA的namenode個數:一定是兩個:nn1和nn2;
3.搭建HA步驟:
0.創建軟連接:指向hadoop_cluster_HA
1.修改【hdfs-site.xml】
  <property>
    <name>dfs.nameservices</name>


    <value>mycluster</value>
  </property>
  //指定兩個namenode的唯一標識:註意一定是兩個
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>
  //修改namenode RPC訪問端口
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>

    <value>master:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>slave1:9000</value>
  </property>
  //修改http-WEBUI訪問端口
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>

    <value>master:50070</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>slave1:50070</value>
  </property>
  //標識NameNodes寫入/讀取編輯的一組JNs的URI
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>

  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/exampleuser/.ssh/id_rsa</value>
  </property>

2.修改【core-site.xml】
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hyxy/tmp/journal</value>
  </property>
3.將所有的配置項分發至其他節點
  $>scp -r hadoop_cluater_ha hyxy@slave1:~/soft/hadoop/etc/
  $>scp -r hadoop_cluater_ha hyxy@slave2:~/soft/hadoop/etc/
4.在【master:8485;slave1:8485;slave2:8485】三個節點上分別開啟journalnode
  $>hadoop-daemon.sh start journalnode
  $>jps
5.一旦啟動了JournalNodes,就必須首先同步兩個HA NameNodes的磁盤元數據。
  a.如果要設置新的HDFS集群,則應首先在其中一個NameNode上運行format命令
    $>hdfs namenode -format
    慎用!!!
  b.如果您已經格式化了NameNode,或者正在將啟用了HA的群集轉換為啟用HA,
  在未格式化的NameNode上,則現在應該通過運行命令“ hdfs namenode -bootstrapStandby”將NameNode元數據目錄的內容復制到另一個未格式化的NameNode上。
  運行此命令還將確保JournalNodes(由dfs.namenode.shared.edits.dir配置)包含足夠的編輯事務,以便能夠啟動兩個NameNode。
  確保JournalNodes開啟,在nn2上執行以下命令;
    $>hadoop-daemon.sh start namenode(首先在nn1開啟namenode進程)
    $>hdfs namenode -bootstrapStandby
  說明:將nn1節點的fsimage復制到nn2中【{HADOOP_TMP_DIR}/dfs/name】
  c.如果要將非HA NameNode轉換為HA,則應運行命令“ hdfs namenode -initializeSharedEdits ”,該命令將使用來自本地NameNode編輯目錄的編輯數據初始化JournalNodes。
  在nn1上,執行以下命令;
    $>hadoop-daemon.sh stop namenode(關閉namenode)
    $>hdfs namenode -initializeSharedEdits
6.start-dfs.sh
7.驗證:分別打開WebUI,查看nn1和nn2的相關信息,均為standby(備用狀態)
8.HA 集群管理:
用法:hdfs haadmin
[ -transitionToActive <serviceId>] // 將給定NameNode的狀態轉換為Active
[-transitionToStandby <serviceId>] // 將給定NameNode的狀態轉換為Standby
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>]
[-checkHealth <serviceId> ]
[-help <command>]

手動切換Active/Standby狀態:
  $>hdfs haadmin -transitionToActive nn1
  $>hadoop fs -put tt.txt
  $>hdfs haadmin -transitionToStandby nn1
  $>hdfs haadmin -transitionToActive nn2
  $>hadoop fs -put tt1.txt


自動容災
-----------------------------------------------
1.完成自動容災,需在HDFS部署環境中增加兩個組件:
  a.Zookeeper 集群
  b.ZKFC:zookeeper FailoverController process
2.Zookeeper作用:
  Apache ZooKeeper是一種高可用性服務,用於維護少量協調數據,通知客戶端該數據的更改以及監視客戶端的故障。自動HDFS故障轉移的實現依賴於ZooKeeper來實現以下功能:
  a.故障檢測:集群中的每個NameNode計算機都在ZooKeeper中維護一個持久會話。如果計算機崩潰,ZooKeeper會話將過期,通知另一個NameNode應該觸發故障轉移。
  b.active活躍節點的選舉:ZooKeeper提供了一種簡單的機制,可以將節點專門選為活動節點。如果當前活動的NameNode崩潰,則另一個節點可能在ZooKeeper中采用特殊的獨占鎖,指示它應該成為下一個活動的。
3.ZKFailoverController(ZKFC)作用:
  a.它是一個ZooKeeper客戶端,它還監視和管理NameNode的狀態。
  b.運行NameNode的每臺機器也運行ZKFC,ZKFC負責:
  運行狀況監視:ZKFC定期使用運行狀況檢查命令對其本地NameNode進行ping操作。只要NameNode及時響應健康狀態,ZKFC就會認為該節點是健康的。如果節點已崩潰,凍結或以其他方式進入不健康狀態,則運行狀況監視器會將其標記為運行狀況不佳。
  ZooKeeper會話管理:當本地NameNode運行正常時,ZKFC在ZooKeeper中保持會話打開。如果本地NameNode處於活動狀態,它還擁有一個特殊的“鎖定”znode。此鎖使用  ZooKeeper對“臨時”節點的支持; 如果會話到期,鎖定節點將自動刪除。
  選舉制度:如果本地NameNode是健康的,並且ZKFC發現沒有其他節點當前持有鎖znode,它將自己嘗試獲取鎖。如果成功,那麽它“贏得了選舉”,並負責運行故障轉移以使其本地NameNode處於活動狀態。故障轉移過程類似於上述手動故障轉移:首先,必要時對先前的活動進行隔離,然後本地NameNode轉換為活動狀態。
4.安裝zookeeper
  a.下載zookeeper3.4.6.tar.gz
  b.解壓至【/home/hyxy/soft】
  c.創建軟連接:$>ln -s zookeeper3.4.6/ zookeeper
  d.配置環境變量:在~/.bash_profile中追加
    export ZOOKEEPER_HOME=/home/hyxy/soft/zookeeper
    export PATH=$ZOOKEEPER_HOME/bin:$PATH
  e.修改【{ZOOKEEPER_HOME}/conf/zoo.cfg】zoo.cfg需cp
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/home/hyxy/tmp/zookeeper
    clientPort=2181
  f.開啟zookeeper Server
    $>zkServer.sh start
    $>jps
      5914 QuorumPeerMain //QuorumPeerMain:zookeeper Server的守護進程
      5931 Jps
  g.客戶端連接:
    $>zkCli.sh
      5988 ZooKeeperMain //ZooKeeperMain:zookeeper client的守護進程
  h.關機Zookeeper Server
    $>zkServer.sh stop

HA高可用