高可用性(英語:high availability,縮寫為 HA)
IT術語,指系統無中斷地執行其功能的能力,代表系統的可用性程度。是進行系統設計時的準則之一。 高可用性系統意味著系統服務可以更長時間執行,通常通過提高系統的容錯能力來實現。高可用性或者高可靠度的系統不會希望有單點故障造成整體故障的情形。 一般可以透過冗餘的方式增加多個相同機能的部件,只要這些部件沒有同時失效,系統(或至少部分系統)仍可運作,這會讓可靠度提高。
解決單點故障,實現系統服務高可用的核心並不是讓故障永不發生,而是讓故障的發生對業務的影響降到最小。因為軟硬體故障是難以避免的問題。 當下企業中成熟的做法就是給單點故障的位置設定備份,形成主備架構。通俗描述就是當主掛掉,備份頂上,短暫的中斷之後繼續提供服務。 常見的是一主一備架構,當然也可以一主多備。備份越多,容錯能力越強,與此同時,冗餘也越大,浪費資源。
1-HDFS NAMENODE單點故障問題
在Hadoop 2.0.0之前,NameNode是HDFS叢集中的單點故障(SPOF)。每個群集只有一個NameNode,如果該計算機或程式不可用,則整個群集在整個NameNode重新啟動或在另一臺計算機上啟動之前將不可用。
NameNode的單點故障從兩個方面影響了HDFS群集的總可用性:
- 如果發生意外事件(例如機器崩潰),則在重新啟動NameNode之前,群集將不可用。
- 計劃內的維護事件,例如NameNode計算機上的軟體或硬體升級,將導致群集停機時間的延長。
HDFS高可用性解決方案:在同一群集中執行兩個(從3.0.0起,超過兩個)冗餘NameNode。在機器崩潰的情況下快速故障轉移到新的NameNode,或者出於計劃維護的目的由管理員發起的正常故障轉移。
2-HDFS HA解決方案—QJM
QJM全稱Quorum Journal Manager,由cloudera公司提出,是Hadoop官方推薦的HDFS HA解決方案之一。
QJM中,使用zookeeper中ZKFC來實現主備切換;使用Journal Node(JN)叢集實現edits log的共享以達到資料同步的目的。
2.1-QJM—主備資料同步問題解決
Journal Node(JN)叢集是輕量級分散式系統,主要用於高速讀寫資料、儲存資料。通常使用2N+1臺JournalNode儲存共享Edits Log(編輯日誌)。
任何修改操作在 Active NN上執行時,JournalNode程式同時也會記錄edits log到至少半數以上的JN中,這時 Standby NN 監測到JN 裡面的同步log發生變化了會讀取JN裡面的edits log,然後重演操作記錄同步到自己的目錄映象樹裡面,
當發生故障Active NN掛掉後,Standby NN 會在它成為Active NN 前,讀取所有的JN裡面的修改日誌,這樣就能高可靠的保證與掛掉的NN的目錄映象樹一致,然後無縫的接替它的職責,維護來自客戶端請求,從而達到一個高可用的目的。
3-叢集基礎環境準備
配置三臺主機
1.修改Linux主機名 /etc/hostname,修改和伺服器名稱對應,如node1配置。
vim /etc/hostname
node1
2.修改IP /etc/sysconfig/network-scripts/ifcfg-ens33
3.修改主機名和IP的對映關係 /etc/hosts
vim /etc/hosts
4.關閉防火牆參考文章(https://www.cnblogs.com/LaoPaoEr/p/16273501.html)
5.SSH免密登入/叢集時間同步參考文章(https://www.cnblogs.com/LaoPaoEr/p/16273456.html)
6.安裝java的JDK,配置環境變數等 /etc/profile(請自行百度)。
7.Zookeeper的叢集環境搭建(自行百度)。
3.1-Ha叢集規劃
在三臺主機上分別建立目錄:
mkdir -p /opt/export/server/
mkdir -p /opt/export/data/
mkdir -p /opt/export/software/
3.2-上傳解壓Hadoop安裝包
自行復制連結下載:http://archive.apache.org/dist/hadoop/core/hadoop-3.1.4/hadoop-3.1.4.tar.gz
解壓命令:
cd /opt/export/software
tar -zxvf hadoop-3.1.4-bin-snappy-CentOS7.tar.gz -C /opt/export/server/
3.3-在三臺主機配置Hadoop環境變數
vim /etc/profile
#adoop高可用的節點配置檔案
export HADOOP_HOME=/opt/export/server/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
node1配置profile完成後分發配置給node2,node3
cd /etc
scp -r /etc/profile root@node2:$PWD
scp -r /etc/profile root@node3:$PWD
三臺配置完之後一定要:
source /etc/profile
3.4-修改Hadoop配置檔案
cd /opt/export/server/hadoop-3.1.4/etc/hadoop
vim hadoop-env.sh
增加配置:
JAVA_HOME=/export/server/jdk1.8.0_60 這裡配置自己伺服器java的JDK的版本
export JAVA_HOME=/export/server/jdk1.8.0_60
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
在node1上建立資料存放目錄,JournalNode資料的存放目錄:
mkdir -p /opt/export/server/hadoop-3.1.4/data
mkdir -p /opt/export/server/hadoop-3.1.4/qj_data
編輯core-site.xml
cd /opt/export/server/hadoop-3.1.4/etc/hadoop
vim core-site.xml
在<configuration></configuration>之間新增配置
<!-- HA叢集名稱,該值要和hdfs-site.xml中的配置保持一致 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- hadoop本地磁碟存放資料的公共目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/export/server/hadoop-3.1.4/data</value>
</property>
<!-- ZooKeeper叢集的地址和埠-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
編輯hdfs-site.xml
cd /opt/export/server/hadoop-3.1.4/etc/hadoop
vim hdfs-site.xml
在<configuration></configuration>之間新增配置
<!--指定hdfs的nameservice為mycluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:9870</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:9870</value>
</property>
<!-- 指定NameNode的edits後設資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁碟存放資料的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/export/server/hadoop-3.1.4/qj_data</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</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>
<!-- 使用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>
編輯workers
cd /opt/export/server/hadoop-3.1.4/etc/hadoop
vim workers
#配置工作主機
node1
node2
node3
3.5-叢集同步安裝包
在node2和node3伺服器上建立目錄 /opt/export/server
ssh node2
mkdir -p /opt/export/server
ssh node3
mkdir -p /opt/export/server
分發到node2和node3,使用scp前需要提前配好免密登入。
cd /opt/export/server
scp -r hadoop-3.1.4 root@node2:$PWD
scp -r hadoop-3.1.4 root@node3:$PWD
4-HA叢集初始化
4.1-啟動zk叢集
這一步需要存在ZK叢集。配置好ZK叢集的環境變數。
zkServer.sh start
zkServer.sh status
4.2-手動啟動JN叢集
在三臺主機(node1\node2\node3)上都要執行:
hdfs --daemon start journalnode
4.3-格式化Format namenode
在node1執行格式化namenode:
在node1啟動namenode程式:
hdfs namenode -format
hdfs --daemon start namenode
在node2上進行namenode後設資料同步
hdfs namenode -bootstrapStandby
4.4-格式化zkfc
注意:在哪臺機器上執行,哪臺機器就將成為第一次的Active NN
hdfs zkfc -formatZK
5- HA叢集啟動
在node1上啟動HDFS叢集
start-dfs.sh
網頁訪問
node1:9870
node2:9870
選擇選單Overview ,可以看到Node1已經啟動成功。
Overview 'node1:8020' (active)代表是主節點
Overview 'node2:8020' (standby)代表從節點
通過kill殺死node1的NameNode。重新重新整理node1和node2網頁 可以檢視node2以切換為主節點。
本篇遺憾是還未搭建Yarn排程叢集。只是簡單搭建了HDFS的叢集,具體Yarn搭建後,後期更新進入文章內。