HDFS High Availability(HA)高可用配置

無暱稱老炮兒發表於2022-05-15

高可用性(英語:high availability,縮寫為 HA)

IT術語,指系統無中斷地執行其功能的能力,代表系統的可用性程度。是進行系統設計時的準則之一。 高可用性系統意味著系統服務可以更長時間執行,通常通過提高系統的容錯能力來實現。高可用性或者高可靠度的系統不會希望有單點故障造成整體故障的情形。 一般可以透過冗餘的方式增加多個相同機能的部件,只要這些部件沒有同時失效,系統(或至少部分系統)仍可運作,這會讓可靠度提高。

HDFS High Availability(HA)高可用配置

解決單點故障,實現系統服務高可用的核心並不是讓故障永不發生,而是讓故障的發生對業務的影響降到最小。因為軟硬體故障是難以避免的問題。 當下企業中成熟的做法就是給單點故障的位置設定備份,形成主備架構。通俗描述就是當主掛掉,備份頂上,短暫的中斷之後繼續提供服務。 常見的是一主一備架構,當然也可以一主多備。備份越多,容錯能力越強,與此同時,冗餘也越大,浪費資源。

HDFS High Availability(HA)高可用配置

1-HDFS NAMENODE單點故障問題

在Hadoop 2.0.0之前,NameNode是HDFS叢集中的單點故障(SPOF)。每個群集只有一個NameNode,如果該計算機或程式不可用,則整個群集在整個NameNode重新啟動或在另一臺計算機上啟動之前將不可用。

NameNode的單點故障從兩個方面影響了HDFS群集的總可用性:

  • 如果發生意外事件(例如機器崩潰),則在重新啟動NameNode之前,群集將不可用。
  • 計劃內的維護事件,例如NameNode計算機上的軟體或硬體升級,將導致群集停機時間的延長。

HDFS高可用性解決方案:在同一群集中執行兩個(從3.0.0起,超過兩個)冗餘NameNode。在機器崩潰的情況下快速故障轉移到新的NameNode,或者出於計劃維護的目的由管理員發起的正常故障轉移。

HDFS High Availability(HA)高可用配置

2-HDFS HA解決方案—QJM

QJM全稱Quorum Journal Manager,由cloudera公司提出,是Hadoop官方推薦的HDFS HA解決方案之一。

QJM中,使用zookeeper中ZKFC來實現主備切換;使用Journal Node(JN)叢集實現edits log的共享以達到資料同步的目的。

HDFS High Availability(HA)高可用配置

 2.1-QJM—主備資料同步問題解決

Journal Node(JN)叢集是輕量級分散式系統,主要用於高速讀寫資料、儲存資料。通常使用2N+1臺JournalNode儲存共享Edits Log(編輯日誌)。

HDFS High Availability(HA)高可用配置

任何修改操作在 Active NN上執行時,JournalNode程式同時也會記錄edits log到至少半數以上的JN中,這時 Standby NN 監測到JN 裡面的同步log發生變化了會讀取JN裡面的edits log,然後重演操作記錄同步到自己的目錄映象樹裡面,

當發生故障Active NN掛掉後,Standby NN 會在它成為Active NN 前,讀取所有的JN裡面的修改日誌,這樣就能高可靠的保證與掛掉的NN的目錄映象樹一致,然後無縫的接替它的職責,維護來自客戶端請求,從而達到一個高可用的目的。

3-叢集基礎環境準備

配置三臺主機

HDFS High Availability(HA)高可用配置

1.修改Linux主機名 /etc/hostname,修改和伺服器名稱對應,如node1配置。

vim /etc/hostname
node1

2.修改IP /etc/sysconfig/network-scripts/ifcfg-ens33

3.修改主機名和IP的對映關係 /etc/hosts

vim /etc/hosts

HDFS High Availability(HA)高可用配置

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叢集規劃

HDFS High Availability(HA)高可用配置

在三臺主機上分別建立目錄:

mkdir  -p /opt/export/server/
mkdir  -p /opt/export/data/
mkdir  -p /opt/export/software/

HDFS High Availability(HA)高可用配置

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

 HDFS High Availability(HA)高可用配置

node1配置profile完成後分發配置給node2,node3

cd /etc
scp -r /etc/profile root@node2:$PWD
scp -r /etc/profile root@node3:$PWD

HDFS High Availability(HA)高可用配置

三臺配置完之後一定要:

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 High Availability(HA)高可用配置

編輯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

HDFS High Availability(HA)高可用配置

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

HDFS High Availability(HA)高可用配置

網頁訪問
node1:9870

node2:9870

選擇選單Overview ,可以看到Node1已經啟動成功。

Overview 'node1:8020' (active)代表是主節點

HDFS High Availability(HA)高可用配置

Overview 'node2:8020' (standby)代表從節點

HDFS High Availability(HA)高可用配置

通過kill殺死node1的NameNode。重新重新整理node1和node2網頁 可以檢視node2以切換為主節點。

HDFS High Availability(HA)高可用配置

本篇遺憾是還未搭建Yarn排程叢集。只是簡單搭建了HDFS的叢集,具體Yarn搭建後,後期更新進入文章內。

相關文章