【知識積累】大數據旅程- 使用Journal搭建HDFS HA

一、規劃角色

TIPS:

  • ZKFC和NN成對出現
  • NN:獨享硬件
  • ZK:單獨一個集羣

二、ZK配置(在node02、node03、node04上安裝ZK

1、解壓

2、配置環境變量(node02、node03、node04都配置,配置完成記得加載profile文件

vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/hadoop-2.6.5
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

3、配置ZK

cp zoo_sample.cfg zoo.cfg
dataDir=/var/zookeeper
clientPort=2181
server.1=192.168.224.12:2888:3888
server.2=192.168.224.13:2888:3888
server.3=192.168.224.14:2888:3888

創建目錄並將自己的數字寫入myid

mkdir -p zookeeper
echo 1 > zookeeper/myid

4、ZK原理

zk運行時有兩個狀態,一個可用(有主模型),一個不可用(無主模型)。
zk工作在主從模型,一個leader,多個follower,follower提交增刪改的操作給leader,leader是單點,當leader掛掉,即無法提供服務,此時進入無主模型,將進行選舉,選出新的leader對外提供服務。
當leader掛掉,然後選舉,再恢復,官方壓測結果爲200ms。端口2888用於有主模型,端口3888用於無主模型。

過半機制:
一半寫成功即成功,不爲強一致性,損失可用性。在事務決策和選舉時,一半成功即成功。

如何選舉:

  • 看zxid(事務id)

       數據版本的id,誰的更全,更大,誰就是leader

  • 看serverid

       server.1、server.2、server.3三個數字,當無主模型下,哪個數字大,哪個就是leader。

5、分發ZK到node03、node04,並配置myid

scp -r ./zookeeper-3.4.6/ node03:`pwd`
scp -r ./zookeeper-3.4.6/ node04:`pwd`
mkdir -p zookeeper
echo 2 > zookeeper/myid
mkdir -p zookeeper
echo 3 > zookeeper/myid

6、啓動ZK

啓動node02(因爲過半機制,三臺機器需要啓動兩臺才能進入有主模式

啓動node03(此時,選舉完成,node03是leader,node02是follower

啓動node04(此時,毫無意外,node04是follower

三、配置Hadoop

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

1、備份完全分佈式配置文件

2、配置NameNode(邏輯到物理的映射

vi 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>

TIPS:SecondaryNameNode的配置不再需要,它的功能由StandbyNameNode實現了

3、配置JournalNode

vi hdfs-site.xml

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property> #JournalNode的位置、數據目錄
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/hadoop/ha/jn</value> #持久化數據存放目錄
</property>

TIPS:

  • NN和JN的通信
  • 管理腳本啓動JN
  • 使用JN的數據目錄

4、故障轉移的實現和代理

vi hdfs-site.xml

<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_dsa</value>
</property>

5、配置ZKFC

vi hdfs-site.xml

<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

6、配置HDFS客戶端的路徑和數據存放目錄

vi core-site.xml

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/var/hadoop/ha</value>
</property>

7、在Hadoop中配置Zookeeper

vi core-site.xml

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

8、往node02、node03、node04分發hadoop配置

9、免密鑰

9.1、場景:

  • 管理節點給其他節點分發,node01到其他節點
  • ZKFC免祕鑰,node01到自己,node01到node02,node02到自己,node02到node01。

9.2、創建祕鑰node01、node02、node03、node04):

ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa

  • -t:類型
  • -P:密碼
  • -f:文件生成路徑(公鑰)
  • ls -a:顯示隱藏文件

9.3、對自己免密鑰node01、node02):

cat id_dsa.pub >> authorized_keys

9.4、對其他節點免祕鑰node01對node02、node03、node04)(node02對node01):

9.4.1、祕鑰分發到node02、node03、node04

scp id_dsa.pub node02:`pwd`/node01.pub
scp id_dsa.pub node03:`pwd`/node01.pub
scp id_dsa.pub node04:`pwd`/node01.pub

9.4.2、將node01的祕鑰添加到node02、node03、node04的授權文件

cat node01.pub >> authorized_keys(node02、node03、node04)

9.4.3、將node02的祕鑰發給node01

9.4.4、將node02的祕鑰添加到node01的授權文件

9.4.5、測試

四、部署

1、啓動JournalNode(node01、node02、node03

hadoop-daemon.sh start journalnode

TIPS:
JN裏面保存了edits,格式化需要清理的內容

2、格式化並啓動其中一臺NameNode(看到successfully formatted表示格式化成功

hdfs namenode -format

hadoop-daemon.sh start namenode

3、另外一臺NameNode以Standby方式啓動(去同步第一臺NameNode元數據

hdfs namenode -bootstrapStandby

TIPS:
此時不對ZK格式化並啓動ZK,工作模式就是半自動HA。

4、ZKFC格式化ZK(其實就是在zk下創建一個節點,不會影響到其他的HDFS集羣

hdfs zkfc -formatZK

5、查看ZK

6、啓動HDFS

start-dfs.sh

7、查看各個節點的角色

8、查看ZK

9、查看圖像化界面

http://node01:50070

http://node02:50070

五、驗證HA

1、手動殺死node01的NameNode

訪問http://node01:50070http://node02:50070,發現node01無法訪問,node02升級爲Active。

ZK的目錄鎖也變成node02的

2、恢復node01的NameNode

hadoop-daemon.sh start namenode

訪問http://node01:50070http://node02:50070,發現node01爲Standby,node02爲Active。

3、手動殺死node02的ZKFC

訪問http://node01:50070http://node02:50070,發現node01升級爲Active,node02降級爲Standby。

ZK的目錄鎖也變成node01的

4、恢復node02的ZKFC

hadoop-deamon.sh start zkfc

六、停止HDFS

stop-dfs.sh

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章