高可用(Hign Availability,HA)node
1、概念linux
做用:用於解決負載均衡和故障轉移(Failover)問題。web
問題描述:一個NameNode掛掉,如何啓動另外一個NameNode。怎樣讓兩個NameNode數據同步。算法
實現原理:apache
在另外一臺服務器上有一個相同的NameNode節點,這臺服務器上的 NameNode的狀態爲standBy。正在運行的NameNode的狀態爲Active。 bootstrap
解決兩個NameNode信息同步問題:由於若是一個NameNode掛掉,另外一個NameNode的editlog和fsimage不必定能實時同步,會形成路徑信息丟失,也就形成了文件丟失。那如今的同步方式爲:NameNode(Active)會實時的把editlog和fsimage保存到JournalNode節點中,也就是對應的服務器磁盤中,NameNode(standBy),從JournalNode節點中取出editlog和fsimage,進行同步。服務器
解決一臺服務器NameNode掛機,另外一臺服務器NameNode啓動問題:這兩個NameNode須要把本身的狀態,都同步到zookeeper上,由zookeeper調配,解決腦裂問題。NameNode和Zookeeper的通訊,是經過ZKFC服務進行的。其中healthMonitor是用於實時監控NameNode狀態的線程,stateController是用於接受zookeeper命令,改變 NameNode狀態的線程,讓active狀態的NameNode獲取znode鎖。負載均衡
DataNode的運行過程當中。全部的DataNode都會向兩個NameNode彙報本身的狀態信息。ssh
2、配置部署分佈式
一、在mudole文件夾下建立目錄HA
mkdir HA
二、把hadoop-2.7.2往HA中拷貝一份。
cp -r hadoop-2.7.2/ HA/
三、修改core-site.xml文件
<configuration>
<!-- 把兩個NameNode的地址組裝成一個集羣mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/admin/modules/HA/hadoop-2.7.2/hadoop-data</value>
</property>
<!--配置journalnode服務器存儲目錄-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/admin/modules/HA/hadoop-2.7.2/jn/mycluster</value>
</property>
</configuration>
四、修改hdfs-site.xml
<configuration>
<!-- 徹底分佈式集羣名稱(必須和core-size.xml中mycluster同樣) -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集羣中NameNode節點都有哪些 ,nn1\nn2是兩個namenode的名稱-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>linux01:8020</value>
</property>
<!-- nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>linux02:8020</value>
</property>
<!-- nn1的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>linux01:50070</value>
</property>
<!-- nn2的http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>linux02:50070</value>
</property>
<!-- 指定NameNode元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://linux01:8485;linux02:8485;linux03:8485/mycluster</value>
</property>
<!-- 配置隔離機制,即同一時刻只能有一臺服務器對外響應 ,防止腦裂-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時須要ssh無祕鑰登陸-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/atguigu/.ssh/id_rsa</value>
</property>
<!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 指定數據冗餘份數,默認3份,會佔用磁盤空間 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 關閉權限檢查,非hadoop用戶不能夠操做hadoop集羣 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 瀏覽hdfs的方式,一種是webhdfs,一種格式https -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
五、分發到linxu0二、linux03
在modules路徑下:
scp -r HA linux02:/home/admin/modules/
scp -r HA linux03:/home/admin/modules/
3、啓動HDFS-HA集羣
一、打開三臺服務器上的JouranlNode節點:
sbin/hadoop-daemon.sh start journalnode
二、格式化linux01的namenode
bin/hdfs namenode -format
三、啓動namenode
sbin/hadoop-daemon.sh start namenode
四、在linux02中,同步linux01中的active的namenode
sbin/hdfs namenode -bootstrapStandby
五、啓動全部的DataNode
分別在三臺服務器上,執行:
sbin/hadoop-daemons.sh start datanode
************* 測試 *************
linux01:50070,Overview看他們狀態。
linux02:50070,Overview看他們狀態。
六、將linux01的NameNode切換爲Active
bin/hdfs haadmin -transitionToActive nn1
七、把linux01的NameNode切換爲Standby,再把linux02的NameNode切換爲Active
bin/hdfs haadmin -transitionToStandby nn1
bin/hdfs haadmin -transitionToActive nn2
八、關閉linux01的namenode節點,把linux02強制切換爲active
sbin/hadoop-daemon.sh stop namenode
bin/hdfs haadmin -transitionToActive nn2 -forceactive
4、安裝zookeeper
一、在HA文件加下,執行解壓命令。把zookeeper安裝到HA下
tar -zxf /home/admin/softwares/installations/zookeeper-3.4.5.tar.gz -C ./
二、修改/conf路徑下文件名稱,修改該配置文件
mv zoo_sample.cfg zoo.cfg 修更名稱。
把dataDir的路徑改成:/home/admin/modules/HA/zookeeper-3.4.5/zkData
在最後配置節點ip:
server.1=192.168.137.20:2888:3888
server.2=192.168.137.21:2888:3888
server.3=192.168.137.22:2888:3888
三、在zookeeper-3.4.5目錄下,建立文件夾zkData,在zkData中,建立文件myid,在myid文件中追加一個1,對應server.1,在linux02中的myid爲2...
mkdir zkData
touch myid
echo 1 > myid
四、zookeeper分發到linux0二、linux03
scp -r zookeeper-3.4.5 linux02:/home/admin/module/HA
五、給三臺服務器的hadoope中配置zookeeper
在core-size.xml中添加
<property>
<name>ha.zookeeper.quorum</name>
<value>linux01:2181,linux02:2181,linux03:2181</value>
</property>
在hdfs-size.xml中添加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
5、結合zookeeper實現高可用
一、先關閉全部服務器的HDFS
sbin/stop-dfs.sh
二、啓動全部服務器的zookeeper,查看三臺服務器的zookeeper的狀態
(paxos算法,讓一臺服務器的zookeeper狀態爲leader,其餘節點爲follower)
bin/zkServer.sh start
bin/zkServer.sh status
三、初始化zookeeper
bin/hdfs zkfc -formatZK,將新配置的高可用namenode,在zookeeper中格式化
四、先手動啓動journalnode
sbin/hadoop-daemon.sh start journalnode
五、啓動HDFS服務
sbin/start-dfs.sh
注意:先手動啓動journalnode,若是沒有使用start-dfs.sh命令啓動服務,每一個服務單獨啓動,
測試、
一、進到zookeeper客戶端
bin/zkCli.sh