1. 程式人生 > >高可用HDFS叢集原理筆記及搭建過程

高可用HDFS叢集原理筆記及搭建過程

HDFS高可用叢集原理及搭建

如何實現HDFS高可用?

HDFS的高可用是HDFS持續對客戶端提供讀、寫服務的能力,因為客戶端對HDFS的讀寫操作之前要訪問namenode伺服器,客戶端需要從namenode端獲取元資料之後才能繼續進行讀、寫。HDFS的高可用的關鍵在於nodename元資料持續可用,之前的完全分散式中的secondaryNamenode是把namenode的fsimage和edit log做定期融合,融合後傳給namenode, 以確保備份到的元資料是最新的,這一點類似於做了一個元資料的快照。在高可用中存在兩個namenode,高可用完全分佈主要包括下圖所示部分:
在這裡插入圖片描述

Namenode節點

叢集中存在2個namenode,二者之中只能有一個namenode處於活躍狀態(active),另一個是待命狀態(standby),只有active的NN節點才能對外提供讀寫HDFS服務,也只有active態的namenode才能向JN寫入編輯日誌;standby狀態的namenode負責從JN小叢集中拷貝資料到本地。另外,各個datanode也要同時向兩個名稱節點報告狀態(心跳資訊、塊資訊)。

Journal Node叢集(簡稱JN)

同時在高可用完全分散式配置下,edit log不再存放在名稱節點,而是存放在一個共享儲存的地方,這個共享儲存由奇數個J4組成,一般是3個節點(JN小叢集), 每個JN專門用於存放來自namenode的編輯日誌,編輯日誌由活躍狀態的名稱節點寫入JN小叢集。2個namenode與3個JN構成的組保持通訊,活躍的名稱節點負責往JN叢集寫入編輯日誌,待命的名稱節點負責觀察JN叢集中的編輯日誌,並且把日誌拉取到待命節點,再加上兩個namenode各自的fsimage映象檔案,這樣一來就能確保兩個namenode的元資料保持同步。

主備切換控制器 (ZKFailoverController 簡稱ZKFC)

ZKFC作為獨立的程序執行,對 NameNode 的主備切換進行總體控制。ZKFC 能及時檢測到 NameNode 的健康狀況,在主 NameNode 故障時藉助 Zookeeper 實現自動的主備選舉和切換,當然 NameNode 目前也支援不依賴於 Zookeeper 的手動主備切換。一旦active nodename不可用,提前配置的zookeeper會把standby節點自動變為active狀態,繼續對外提供讀寫服務。

Zookeeper 叢集(簡稱ZK)

ZK:為主備切換控制器提供主備選舉支援。
共享儲存系統:共享儲存系統是實現 NameNode 的高可用最為關鍵的部分,共享儲存系統儲存了 NameNode 在執行過程中所產生的 HDFS 的元資料。主 NameNode 和
NameNode 通過共享儲存系統實現元資料同步。在進行主備切換的時候,新的主 NameNode 在確認元資料完全同步之後才能繼續對外提供服務。

高可用完全分散式環境的搭建

分散式叢集規劃圖

主機名 IP地址 NN-1 NN-2 DN ZK ZKFC JNN
node01 192.168.23.128
node02 192.168.23.129
node03 192.168.23.130
node04 192.168.23.131

搭建高可用完全分散式

1、配置免密登入

在完全分散式的基礎上需要再配置node02–>到node01上的免密
在node02節點執行,將node01的公鑰加入到其他節點的白名單中
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

2、關閉防火牆

sudo service iptables stop # 關閉防火牆服務。
sudo chkconfig iptables off # 禁止防火牆開機自啟。

3、所有節點配置JDK

(1)解壓JDK安裝包
(2)通過下面程式碼配置環境變數

#先刪除系統自帶的1.7版本的JDK
yum remove *openjdk*
#進入使用者環境變數配置
vim ~/.bashrc
# 接著需要配置JAVA環境變數.
# 在檔案最後新增(注:環境變數要與JDK存放位置對應)
export JAVA_HOME=/opt/software/jdk/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH
# 接下來需要使用source命令是環境變數生效.
source ~/.bashrc
#驗證是否生效
java -version.

4、安裝Hadoop

安裝Hadoop以及配置環境變數可參考HDFS偽分散式的環境搭建,這裡也不再細說。

5、時間同步

#各個節點安裝ntp 
yum install ntp
#安裝完成後每個節點都執行如下命令從而達到時間同步
#ntp1.aliyun.com為阿里的時間伺服器
ntpdate ntp1.aliyun.com

6、配置hosts檔案

vi /etc/hosts

// 實現主機名對映
192.168.23.128 node01
192.168.23.129 node02
192.168.23.130 node03
192.168.23.131 node04

7、修改hdfs-site.xml配置檔案

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:50070</value>
</property>
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/sxt/hadoop/ha/jn</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>/root/.ssh/id_rsa</value>
</property>
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>

8、配置core-site.xml

<property>
   <name>fs.defaultFS</name>
   <value>hdfs://mycluster</value>
</property>
<property>
   <name>ha.zookeeper.quorum</name>
   <value>node02:2181,node03:2181,node04:2181</value>
</property>

9、修改slaves配置檔案

修改為(注:之間用換行,且不能有空格)
node02
node03
node04

10、將配置好的HDFS安裝包拷貝到node02 node03 node04

11、搭建zookeeper

將zookeeper解壓在自定義目錄下
修改conf下的zoo_sample.cfg的名稱,改為zoo.cf(方便修改)
mv zoo_sample.cfg zoo.cfg
#修改zo.cfg
vi zoo.cfg
#配置檔案資訊
dataDir=/var/zfg/zookeeper
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888

在dataDir的目錄下建立myid檔案,在這個檔案中寫上當前節點id 與server後數字對應(需自己將上面的目錄結構創建出來,路徑可以自己自定義)。
將配置好的zookeeper安裝包拷貝到node03、node04,並且各節點建立myid號,與上面各節點的數字對應。
啟動zookeeper
到zookeeper/bin 目錄下
分別在三個節點上啟動 ./zkServer.sh start
(注:zookeeper要在叢集啟動前啟動)

12、格式化NameNode

#在node01、node02、node03分別執行如下命令
hadoop-daemon.sh start journalnode
#	隨機選擇一臺NameNode執行:
hdfs namenode -format
hadoop-daemon.sh start namenode
#另外一臺NameNode節點執行:
hdfs namenode  -bootstrapStandby
#格式化ZKFC
hdfs zkfc -formatZK

13、關閉所有節點,並重新啟動

#關閉所有節點上的程序 
 stop-dfs.sh
#啟動HDFS  
 start-dfs.sh

以上就是高可用環境搭建的全部過程