1. 程式人生 > >HDFS-HA的配置-----自動Failover(ZKFC)

HDFS-HA的配置-----自動Failover(ZKFC)

1.1  ZK叢集:

    作為一個高可靠系統,能夠為一小部分協同資料提供監控,將資料的更改隨時反應給客戶端。HDFS的HA依賴zk提供的兩個特性:一個是錯誤監測,一個是活動節點選舉

Failure detection

   每個NN都會在ZK中註冊並且持久化一個session。一旦一個NN失效了,那麼這個session也將過期,那麼zk將會通知其他的NN    應該發起一個Failover

   Active NameNode election

   ZK提供了一個簡單的機制來保證只有一個NN是活動的。如果當前的活動NN失效了,那麼另一個NN將獲取ZK中的獨佔鎖,表名自    己是活動的節點。

1.2 ZKFailoverController(ZKFC)

作為一個ZK叢集的客戶端,用來監控NN的狀態資訊。每個執行NN的節點必須要執行一個zkfc。zkfc提供以下功能:

    Health monitoring
zkfc定期對本地的NN發起health-check的命令,如果NN正確返回,那麼這個NN被認為是OK的。否則被認為是失效節點。
    ZooKeeper session management
當本地NN是健康的時候,zkfc將會在zk中持有一個session。如果本地NN又正好是active的,那麼zkfc還有持有一個"ephemeral"的節點作為鎖,一旦本    地NN失效了,那麼這個節點將會被自動刪除。
 ZooKeeper-based election
如果本地NN是健康的,並且zkfc發現沒有其他的NN持有那個獨佔鎖。那麼他將試圖去獲取該鎖,一旦成功,那麼它就需要執行Failover,然後成為active的NN節點。Failover的過程是:第一步,對之前的NN執行fence,如果需要的話。第二步,將本地NN轉換到active狀態。

2、ZK叢集配置

  考慮到zk叢集的需要的資源不是很多,一般都建議將NN和ZK節點部署在同一個機器上。但是一般都希望將ZK的資料和HDFS的meta資料分放在不同的物理盤上。這樣即能保證資料的隔離又能保證效能。一般來說,ZK需要配置三五個節點足矣,下面詳述

ZK叢集配置及啟動

tickTime=2000
dataDir=/home/ziang/DfsDataDir/zookeeper
clientPort=31315
initLimit=5
syncLimit=2
server.1=dw13:31316:31317
server.2=dw14:31316:31317
server.3=dw23:31316:31317
由於ZK叢集中每個節點都需要知道其他節點的資訊,所以server.id=host:port:port就是為了完成這個任務的。其中個server.id這個引數由使用者分配給每個zk節點並放置在dataDir目錄下的myid檔案中。
3、myid檔案只有一行,內面是一個1-255的數字,必須保證唯一。如server 1的myid檔案內儲存“1”就夠了。
4、在每個zk的部署機器上配置好各個配置項到配置檔案:
mkdir -p /home/ziang/DfsDataDir/zookeeper/logs && mkdir -p /home/ziang/DfsDataDir/zookeeper/ && echo 1 >/home/ziang/DfsDataDir/zookeeper/myid          
mkdir -p /home/ziang/DfsDataDir/zookeeper/logs && mkdir -p /home/ziang/DfsDataDir/zookeeper/ && echo 2 >/home/ziang/DfsDataDir/zookeeper/myid          
mkdir -p /home/ziang/DfsDataDir/zookeeper/logs && mkdir -p /home/ziang/DfsDataDir/zookeeper/ && echo 3 >/home/ziang/DfsDataDir/zookeeper/myid
5、啟動ZK叢集,在每個zk的部署機器上執行
export ZOO_LOG_DIR=/home/ziang/DfsDataDir/zookeeper/logs&& sh bin/zkServer.sh start
6、測試叢集的正確性
java -cp zookeeper-3.3.5.jar:lib/log4j-1.2.15.jar:conf:lib/jline-0.9.94.jar   org.apache.zookeeper.ZooKeeperMain -server 127.0.0.1:31315
或者
sh zkCli.sh -server 127.0.0.1:31315

3、HDFS相關配置

完成了ZK的配置之後,剩下就配置HDFS了
1、在core-site.xml中,配置:
 <property>   
     <name>ha.zookeeper.quorum.hdpcdh4</name>    
     <value>dw13:31315,dw14:31315,dw23:31315</value>
 </property> 
下面兩個為了安全性,可選的。 <property>
     <name>ha.zookeeper.auth</name>
     <value>@/path/to/zk-auth.txt</value>
</property>
<property>
     <name>ha.zookeeper.acl</name>
     <value>@/path/to/zk-acl.txt</value>
</property>
2、在hdfs-site.xml中,配置:
<property>
     <name>dfs.ha.automatic-failover.enabled.hdpcdh4</name>
     <value>true</value>
</property> 下面也是可選的: <property>      <name>ha.zookeeper.parent-znode</name>      <value>/hadoop-ha</value> </property>

4、相關初始化

完成上述配置之後,就可以開始進行初始化了。進行初始化的時候,必須保證zk叢集已經啟動了。
1、在ZK中建立znode來儲存automatic Failover的資料,任選一個NN執行完成即可:
sh bin/hdfs zkfc -formatZK
2、啟動zkfs,在所有的NN節點中執行以下命令:
sh sbin/hadoop-daemon.sh start zkfc

5、叢集啟動

最後啟動叢集
sh sbin/start-dfs.sh