大數據 - hadoop - HDFS+Zookeeper實現高可用

高可用(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

相關文章
相關標籤/搜索