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

HDFS-HA高可用


  1. HDFS-HA工作機制
通過雙NameNode消除單點故障
  1. HDFS-HA工作要點
1.元資料管理方式需要改變 記憶體中各自儲存一份元資料; Edits日誌只有Active狀態的NameNode節點可以做寫操作; 兩個NameNode都可以讀取Edits; 共享的Edits放在一個共享儲存中管理(qjournal和NFS兩個主流實現); 2.需要一個狀態管理功能模組 實現了一個zkfailover,常駐在每一個namenode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,利用zk進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split現象的發生。 3.必須保證兩個NameNode之間能夠ssh無密碼登入 4.隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務
  1. HDFS-HA故障轉移機制

如果斷網,(單一 隔離Fence)則另一臺zkfc不會貿然上線,防止腦裂 使用命令hdfs haadmin -failover手動進行故障轉移,在該模式下,即使現役NameNode已經失效,系統也不會自動從現役NameNode轉移到待機NameNode,下面學習如何配置部署HA自動進行故障轉移。自動故障轉移為HDFS部署增加了兩個新元件:ZooKeeper和ZKFailoverController(ZKFC)程序,如圖3-20所示。ZooKeeper是維護少量協調資料,通知客戶端這些資料的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的以下功能: 1)故障檢測:叢集中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移。 2)現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode。 ZKFC是自動故障轉移中的另一個新元件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個執行NameNode的主機也運行了一個ZKFC程序,ZKFC負責: 1)健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認為該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。 2)ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中開啟的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支援,如果會話終止,鎖節點將自動刪除。 3)基於ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責執行故障轉移程序以使它的本地NameNode為Active。故障轉移程序與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然後本地NameNode轉換為Active狀態。

 

配置HDFS-HA叢集 配置core-site.xml
<configuration> <!-- 把兩個NameNode)的地址組裝成一個叢集mycluster -->      <property>         <name>fs.defaultFS</name>          <value>hdfs://mycluster</value>      </property>      <!-- 指定hadoop執行時產生檔案的儲存目錄 -->      <property>         <name>hadoop.tmp.dir</name>         <value>/opt/ha/hadoop-2.7.2/data/tmp</value>      </property> </configuration>
配置hdfs-site.xml
<configuration>   <!-- 完全分散式叢集名稱 -->   <property>      <name>dfs.nameservices</name>      <value>mycluster</value>   </property>   <!-- 叢集中NameNode節點都有哪些 -->   <property>      <name>dfs.ha.namenodes.mycluster</name>      <value>nn1,nn2</value>   </property>   <!-- nn1的RPC通訊地址 -->   <property>      <name>dfs.namenode.rpc-address.mycluster.nn1</name>      <value>hadoop102:9000</value>   </property>   <!-- nn2的RPC通訊地址 -->   <property>      <name>dfs.namenode.rpc-address.mycluster.nn2</name>      <value>hadoop103:9000</value>   </property>   <!-- nn1的http通訊地址 -->   <property>      <name>dfs.namenode.http-address.mycluster.nn1</name>      <value>hadoop102:50070</value>   </property>   <!-- nn2的http通訊地址 -->   <property>      <name>dfs.namenode.http-address.mycluster.nn2</name>      <value>hadoop103:50070</value>   </property>   <!-- 指定NameNode元資料在JournalNode上的存放位置 -->   <property>      <name>dfs.namenode.shared.edits.dir</name>   <value> qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>   </property>   <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 -->   <property>      <name>dfs.ha.fencing.methods</name>      <value>sshfence</value>   </property>   <!-- 使用隔離機制時需要ssh無祕鑰登入-->   <property>      <name>dfs.ha.fencing.ssh.private-key-files</name>      <value>/home/zdsssg/.ssh/id_rsa</value>   </property>   <!-- 宣告journalnode伺服器儲存目錄-->   <property>      <name>dfs.journalnode.edits.dir</name>      <value>/opt/ha/hadoop-2.7.2/data/jn</value>   </property>   <!-- 關閉許可權檢查-->   <property>      <name>dfs.permissions.enable</name>      <value>false</value>   </property>   <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->   <property>         <name>dfs.client.failover.proxy.provider.mycluster</name>   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>   </property> </configuration>
拷貝配置好的hadoop環境到其他節點

 

啟動HDFS-HA叢集 1.    在各個JournalNode節點上,輸入以下命令啟動journalnode服務   sbin/hadoop-daemon.sh start journalnode 2.    在[nn1]上,對其進行格式化,並啟動   bin/hdfs namenode -format   sbin/hadoop-daemon.sh start namenode 3.    在[nn2]上,同步nn1的元資料資訊   bin/hdfs namenode -bootstrapStandby 4.    啟動[nn2]   sbin/hadoop-daemon.sh start namenode 6.    在[nn1]上,啟動所有datanode   sbin/hadoop-daemons.sh start datanode 7.    將[nn1]切換為Active   bin/hdfs haadmin -transitionToActive nn1
  1. 檢視是否Active
  bin/hdfs haadmin -getServiceState nn1 配置HDFS-HA自動故障轉移 1.    具體配置        (1)在hdfs-site.xml中增加 <property>   <name>dfs.ha.automatic-failover.enabled</name>   <value>true</value> </property>        (2)在core-site.xml檔案中增加 <property>   <name>ha.zookeeper.quorum</name>   <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> </property> 2.    啟動        (1)關閉所有HDFS服務: sbin/stop-dfs.sh        (2)啟動Zookeeper叢集: bin/zkServer.sh start        (3)初始化HA在Zookeeper中狀態: bin/hdfs zkfc -formatZK        (4)啟動HDFS服務: sbin/start-dfs.sh 3.    驗證        (1)將Active NameNode程序kill kill -9 namenode的程序id        (2)將Active NameNode機器斷開網路 service network stop
  1. YARN-HA工作機制
配置yarn-ha叢集 1.    環境準備 (1)修改IP (2)修改主機名及主機名和IP地址的對映 (3)關閉防火牆 (4)ssh免密登入 (5)安裝JDK,配置環境變數等        (6)配置Zookeeper叢集 2.    規劃叢集 3.    具體配置 (1)yarn-site.xml
<configuration>     <property>         <name>yarn.nodemanager.aux-services</name>         <value>mapreduce_shuffle</value>     </property>     <!--啟用resourcemanager ha-->     <property>         <name>yarn.resourcemanager.ha.enabled</name>         <value>true</value>     </property>       <!--宣告兩臺resourcemanager的地址-->     <property>         <name>yarn.resourcemanager.cluster-id</name>         <value>cluster-yarn1</value>     </property>     <property>         <name>yarn.resourcemanager.ha.rm-ids</name>         <value>rm1,rm2</value>     </property>     <property>         <name>yarn.resourcemanager.hostname.rm1</name>         <value>hadoop102</value>     </property>     <property>         <name>yarn.resourcemanager.hostname.rm2</name>         <value>hadoop103</value>     </property>       <!--指定zookeeper叢集的地址-->     <property>         <name>yarn.resourcemanager.zk-address</name>         <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>     </property>     <!--啟用自動恢復-->     <property>         <name>yarn.resourcemanager.recovery.enabled</name>         <value>true</value>     </property>       <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集-->     <property>         <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
       (2)同步更新其他節點的配置資訊 4.    啟動hdfs (1)在各個JournalNode節點上,輸入以下命令啟動journalnode服務: sbin/hadoop-daemon.sh start journalnode (2)在[nn1]上,對其進行格式化,並啟動: bin/hdfs namenode -format sbin/hadoop-daemon.sh start namenode (3)在[nn2]上,同步nn1的元資料資訊: bin/hdfs namenode -bootstrapStandby (4)啟動[nn2]: sbin/hadoop-daemon.sh start namenode (5)啟動所有DataNode sbin/hadoop-daemons.sh start datanode (6)將[nn1]切換為Active bin/hdfs haadmin -transitionToActive nn1 5.    啟動YARN (1)啟動yarn sbin/start-yarn.sh (2)啟動resourcemanager sbin/yarn-daemon.sh start resourcemanager (3)檢視服務狀態 bin/yarn rmadmin -getServiceState rm1