Hadoop Ha的原理圖:
Hadoop1.X 中NameNode是HDFS集羣的單點故障,每一個集羣只有一個NameNode,如果這個機器或進程不可用,整個集羣就無法使用,直到重啓NameNode或者新啓動一個NameNode節點
影響HDFS集羣不可用主要包括以下兩種情況
- 類似機器宕機這樣的意外情況將導致集羣不可用,只有重啓NameNode之後纔可使用
- 計劃內的軟件或硬件升級,將導致集羣在短時間範圍內不可用。
Hadoop2.X的HDFS的高可用性(HA)就可以解決上述問題,通過提供選擇運行在同一集羣中的一個熱備的“主/備”兩個冗餘NameNode,允許在機器宕機或系統維護的時候,快速轉移到另一個NameNode。
架構解釋如下只有一個NameNode是Active的,並且只有這個ActiveNameNode能提供服務,改變NameSpace。以後可以考慮讓StandbyNameNode提供讀服務。
提供手動Failover,在升級過程中,Failvoer在NameNode-DataNode之間寫不變的情況下才能生效。
在之前的NameNode重新恢復之後,不能提供failback。
數據一致性比Failover更重要
儘量少用特殊的硬件
HA的設置和Failover都應該保證在兩者操作錯誤或者配置錯誤的時候,不得導致數據損壞
NameNode的短期垃圾回收不應該觸發Failover
DataNode會同時向NameNode Active和NameNode Standly彙報塊的信息。NameNode Active和NameNode Standby通過NFS備份MetaData信息到一個磁盤上面。
設定有4太機器,分別爲node1,node2,node3,node3
1. 配置機器如下:
NN | DN | JN | ZK | ZKFC | |
---|---|---|---|---|---|
node1 | 1 | 1 | 1 | ||
node2 | 1 | 1 | 1 | 1 | 1 |
node3 | 1 | 1 | 1 | ||
node4 | 1 | 1 |
2. 在hadoop集羣配置的基礎上hadoop的HDFS集羣的搭建,需要做的改進:
1)在node1,node2上配置免密鑰。
2)刪除每臺機器上面的masters文件(masters是設置SNN的,在Hadoop高可用中,沒有SNN,而是提供兩個NN)。
3) 修改配置文件,先在一臺機器上修改,然後同步到其他的機器上:
hadoop-env.sh 中配置JAVA_HOME;
hdfs-site.xml和core-site.xml
注意:清空hadoop.tmp.dir的文件目錄,每臺機器都要做。
core-site.xml配置:
- <configuration>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://ns1</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/home/tmp/data</value>
- </property>
- <property>
- <name>ha.zookeeper.quorum</name>
- <value>node1:2181,node2:2181,node3:2181</value>
- </property>
- </configuration>
hdfs-site.xml配置:
- <configuration>
- <property>
- <name>dfs.nameservices</name>
- <value>ns1</value>
- </property>
- <property>
- <name>dfs.ha.namenodes.ns1</name>
- <value>nn1,nn2</value>
- </property>
- <!-- nn1的RPC通信地址,nn1所在地址 -->
- <property>
- <name>dfs.namenode.rpc-address.ns1.nn1</name>
- <value>node1:8020</value>
- </property>
- <!-- nn1的http通信地址,外部訪問地址 -->
- <property>
- <name>dfs.namenode.http-address.ns1.nn1</name>
- <value>node1:50070</value>
- </property>
- <!-- nn2的RPC通信地址,nn2所在地址 -->
- <property>
- <name>dfs.namenode.rpc-address.ns1.nn2</name>
- <value>node2:8020</value>
- </property>
- <!-- nn2的http通信地址,外部訪問地址 -->
- <property>
- <name>dfs.namenode.http-address.ns1.nn2</name>
- <value>node2:50070</value>
- </property>
- <!-- 指定NameNode的元數據在JournalNode日誌上的存放位置(一般和zookeeper部署在一起) -->
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>
- </property>
- <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/opt/journal/data</value>
- </property>
- <!--客戶端通過代理訪問namenode,訪問文件系統,HDFS 客戶端與Active 節點通信的Java 類,使用其確定Active 節點是否活躍 -->
- <property>
- <name>dfs.client.failover.proxy.provider.ns1</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
- <!--這是配置自動切換的方法,有多種使用方法,具體可以看官網,在文末會給地址,這裏是遠程登錄殺死的方法 -->
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>sshfence</value> ----這個參數的值可以有多種,你也可以換成shell(/bin/true)試試,也是可以的,這個腳本do nothing 返回0
- </property>
- <!-- 這個是使用sshfence隔離機制時才需要配置ssh免登陸 -->
- <property>
- <name>dfs.ha.fencing.ssh.private-key-files</name>
- <value>/root/.ssh/id_rsa</value>
- </property>
- <!-- 配置sshfence隔離機制超時時間,這個屬性同上,如果你是用腳本的方法切換,這個應該是可以不配置的 -->
- <property>
- <name>dfs.ha.fencing.ssh.connect-timeout</name>
- <value>30000</value>
- </property>
- <!-- 這個是開啓自動故障轉移,如果你沒有自動故障轉移,這個可以先不配 -->
- <property>
- <name>dfs.ha.automatic-failover.enabled</name>
- <value>true</value>
- </property>
- </configuration>
4)安裝zookeeper並且配置環境變量ZOOKEEPER_HOME,把zoo_example.cfg重命名爲zoo.cfg配置文件
默認配置如下圖:
在文件結尾添加 zookeeper服務器的配置:
- server.1=node1:2888:3888
- server.2=node2:2888:3888
- server.3=node3:2888:3888
然後分別在node1,2,3dataDir目錄下創建myid文件 。對應機器的myid裏分別寫入1, 2, 3
5)先啓動JN,在node2,3,4上各自執行以下命令:
hadoop-daemon.sh start journalnode
6) 格式化namenode,在node1上執行格式化操作:
hdfs namenode -format
格式化後必須啓動node1,否則NN2進行格式化會報錯
hadoop-ademon.sh start namenode
7) 在另外一個namenode上同步格式化,node2上執行如下命令:
hdfs namenode -bootstrapStandby
8)啓動zookeeper集羣,分別在node1,2,3上執行如下命令:
zkServer.sh start
9)格式化zk,在node1上執行(必須在NN上執行)。如下命令:
hdfs zkfc -formatZK
10) 啓動集羣 start-dfs.sh
11) 訪問頁面 http://node1:50070 http://node2:50070
發現node1是active狀態,node2是standby狀態。