高可用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
以上就是高可用環境搭建的全部過程