ZooKeeper安裝、效果演示

高可用(HA) -- ZooKeeper

ZooKeeper

  • 一個開源的分佈式的,爲分佈式應用提供服務的項目
  • 提供原語集合以便分佈式應用能夠在它之上構建更高層次的同步服務
  • 角色java

    觀察者模式:
            leader:        領導者負責進行投票的發起及決議, 更新狀態
            學習者:
                follower:    接受客戶端請求併發揮客戶端返回結果,參與投票
                observer:    接受請求,轉發給leader,不參與投票,只同步leader.
            客戶端:    發起請求
        觀察者模式的應用: 軟件皮膚, 編輯工具設置
  • 安裝node

    1. 僞分佈模式web

      1)安裝ZooKeeper (再次注意權限)
      $ tar -zxf  /opt/software/zookeeper-3.4.5.tar.gz -C  /opt/modules/
      
      2)新建一個Zookeeper的data目錄
      $ mkdir zkData   --//能夠不用手動建立,啓動自動生成
      
      3)修改配置文件${ZOOKEEPER_HOME}/conf  (注意: 配置文件爲模板,需拷貝重名爲zoo.cfg)
      $cd /opt/modules/zookeeper-3.4.5/    ##切換目錄到zookeeper-3.4.5
      $ cp conf/zoo_sample.cfg conf/zoo.cfg  ##拷貝
      $ vi conf/zoo.cfg                        ##修改12行,設置如下:
      dataDir=/opt/modules/zookeeper-3.4.5/zkData
      
      4)啓動zookeeper
      $bin/zkServer.sh start
      $ jps   #查看java進程以下
      2088 QuorumPeerMain
      
      5)查看zookeeper的狀態
      $bin/zkServer.sh status        #信息以下
      JMX enabled by default
      Using config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfg
      Mode: standalone    #單機模式
      6)一些命令的認識
      $ bin/zkCli.sh    #進入zookper
       help        #查看命令
       quit        #退出
       create     #建立 -e臨時znode -s 自動編號
            get path    #查看信息
           ls path     #查看指定目錄的列表
            rmr path    #刪除
      
      ls /   #查看根目錄
      create -e /myapp  msg #建立目錄
       get /myapp             #查看myapp建立信息
       ls / watch            # 添加關注事件
      rmr    /myapp        #刪除觸發關注事件
       quit
    2. 徹底分佈模式shell

      1.安裝JDK(3臺PC都要安裝JDK)
      2.安裝徹底分佈式集羣
      1)安裝zk(注意權限)
          $ tar -zxvf /opt/software/zookeeper-3.4.5.tar.gz -C /opt/modules/
      2)配置zoo.cfg文件
          $ cd /opt/modules/zookeeper-3.4.5/
          $ cp conf/zoo_sample.cfg conf/zoo.cfg
          $ vi conf/zoo.cfg         #修改添加如下內容
          #修改
          dataDir=/opt/modules/zookeeper-3.4.5/zkData
          #15行添加
          server.1=centos01.ibeifeng.com:2888:3888
          server.2=centos02.ibeifeng.com:2888:3888
          server.3=centos03.ibeifeng.com:2888:3888
      3)建立zkData目錄,在zkData目錄目錄下建立myid文件,分發
          $ mkdir zkData
          $ touch zkData/myid
          $ cd /opt/modules/    #切到modules下
          從pc1分發到pc2, pc3
          $ scp -r zookeeper-3.4.5/ centos02.ibeifeng.com:/opt/modules/
          $ scp -r zookeeper-3.4.5/ centos03.ibeifeng.com:/opt/modules/
      
      4) 修改pc1, pc2, pc3 的myid文件
          $ cd /opt/modules/zookeeper-3.4.5/
          $ vi zkData/myid    #根據conf/zoo.zfg中綁定的server.n對應
          pc1的zkData/myid內容是1
          pc2的zkData/myid內容是2
          pc3的zkData/myid內容是3
      5)啓動3臺的zookeeper
          $ bin/zkServer.sh start
      
      6)檢查進程
          $ jps
          3050 QuorumPeerMain
          3111 Jps
      
      8)檢查並覈對狀態3臺的狀態
          $ bin/zkServer.sh status
      
      Zookeeper shell命令
      bin/zkCli.sh -server 主機名:2181 或者 bin/zkCli.sh
I) 文件系統(數據結構)
        Znode
            1.表明zookeeper文件系統中的一個目錄,
            2.表明客戶端(如:Namenode)
        
        |---/
            |---app
                |---app1
                |---app2
                |---app2

        動物 -> hadoop 中的節點 Namende


    II) Watch事件
        1.NameNode啓動,而後向Zookeeper,觸發註冊事件,同時會建立一個惟一的目錄
        2.經過心跳信息,來確認節點的狀態(存活或者宕機)
        3.若是宕機,長時間未收到心跳,觸發節點丟失事件,刪除這個目錄

    III)投票(偶數可能僵持)
        leader的候選人必須獲取到超過半數的選票 n+1
        zookeeper集羣中存活的節點數據必須過半數

Namenode HA

一)安裝hadoop
此步驟要求,ip映射,主機名,jdk安裝配置,hadoop解壓
若是分佈式已經搭建好,需對三臺進行操做.
    注意刪除data,logs目錄!!!
    注意修改搭建前,中止相關進程
    刪除/tmp/*.pid文件 (注意不要全刪了!!!!,是刪除/tmp/的以pid結尾的)
    $ rm /tmp/*.pid
    免密登陸
    能夠按照下面的步驟修改便可
二)配置環境文件
    檢查
    hadoop-env.sh
    mapred-env.sh
    yarn-env.sh
    配置
    export JAVA_HOME=/opt/modules/jdk1.7.0_67

三)配置hdfs文件

1.========core-site.xml========
    <!--NameNode HA的邏輯訪問名稱-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns1</value>
    </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/modules/hadoop-2.5.0/data</value>
    </property>

    2.=======hdfs-site.xml=============
    <!-- 分佈式副本數設置爲3 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 關閉權限檢查用戶或用戶組 -->
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
    <!-- 指定hdfs的nameservice爲ns1,須要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>ns1</value>
    </property>
    
    <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.ns1</name>
        <value>nn1,nn2</value>
    </property>
    
    <!-- nn1的RPC通訊地址 -->
    <property>
        <name>dfs.namenode.rpc-address.ns1.nn1</name>
        <value>centos01.ibeifeng.com:8020</value>
    </property>
    <!-- nn1的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.ns1.nn1</name>
        <value>centos01.ibeifeng.com:50070</value>
    </property>
    
    <!-- nn2的RPC通訊地址 -->
    <property>
        <name>dfs.namenode.rpc-address.ns1.nn2</name>
        <value>centos02.ibeifeng.com:8020</value>
    </property>
    <!-- nn2的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.ns1.nn2</name>
        <value>centos02.ibeifeng.com:50070</value>
    </property>
    
    <!-- 指定NameNode的edit文件在哪些JournalNode上存放 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://centos01.ibeifeng.com:8485;centos02.ibeifeng.com:8485;centos03.ibeifeng.com:8485/ns1</value>
    </property>
    <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/modules/hadoop-2.5.0/journal</value>
    </property>
    
        <!-- 當Active出問題後,standby切換成Active,此時,原Active又沒有中止服務,這種狀況下會被強制殺死進程。-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>
    
    <!-- 使用sshfence隔離機制時須要ssh免登錄  /home/hadoop爲個人用戶家目錄,個人是hadoop,  ssh也能免密登陸了, 才行,切記!!  -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    
    <!-- 配置sshfence隔離機制超時時間 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    
    3. ==========配置 slaves start==========
    centos01.ibeifeng.com
    centos02.ibeifeng.com
    centos03.ibeifeng.com



    4. ============向第二臺和第三臺分發數據===============
    $ cd /opt/modules/hadoop-2.5.0/
    
    其餘兩臺機器安裝了hadoop,直接覆蓋對應的配置文件
    (若是沒有其餘的服務器沒有hadoop,能夠把hadoop-2.5.0分發到其餘兩個服務器上)
    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  centos02.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  centos03.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
    
    使用命令檢查是否分發成功在對應的pc上
    $  cat etc/hadoop/hdfs-site.xml 
    $ cat etc/hadoop/core-site.xml 
    切換到
    $ cd /opt/modules/zookeeper-3.4.5/


四) 啓動相關進程
1. ============啓動zookeeper相關===========
    $ bin/zkServer.sh start
    $ jps    #查看進程
        3129 QuorumPeerMain
    $ bin/zkServer.sh status # 查看狀態
        JMX enabled by default
        Using config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfg
        Mode: leader  #或者是follower




    2. ============啓動HDFS HA  start=================
    ## 注意:每個步驟都嚴格按照如下步驟執行
        $ cd /opt/modules/hadoop-2.5.0/        #切換目錄
        1. 啓動journalnode
            $ sbin/hadoop-daemon.sh start journalnode    #在三臺分別啓動, 日誌同步的journalnode進程
        $ jps #三臺服務器顯示
            3422 Jps
            3281 QuorumPeerMain
            3376 JournalNode
    2. 格式化namenode    在第一臺上操做!!!!! 切記
        $ bin/hdfs namenode -format
        出現提示:successfully formatted
    3. 在第一臺(centos01)上啓動namenode
        $ sbin/hadoop-daemon.sh start namenode  #jps 查看是否啓動
    4. 切到第二臺(centos02.ibeifeng.com)服務器,讓另外一個namenode 拷貝元數據
        $ bin/hdfs namenode -bootstrapStandby
        $ sbin/hadoop-daemon.sh start namenode    #啓動namenode
    
        能夠在web頁面觀察,如今只有namenode啓動了, 都是standby狀態
        http://centos01.ibeifeng.com:50070
        http://centos02.ibeifeng.com:50070
    
    5. 使用如下命令將一個namenode  active
        $ bin/hdfs haadmin -transitionToActive nn2 #將第二個namenode做爲active
        http://centos02.ibeifeng.com:50070  發現centos2服務器的namenode 時active狀態

開啓故障自動轉移apache

先中止HDFS進程,在機器centos01上執行
    $ sbin/stop-dfs.sh
    
    1.配置故障轉移 ( 追加)
        1)=====core-site.xml
            <!-- 向哪一個zookeeper註冊 -->
            <property>
                <name>ha.zookeeper.quorum</name>
                <value>centos01.ibeifeng.com:2181,centos02.ibeifeng.com:2181,centos03.ibeifeng.com:2181</value>
            </property>

        2)====hdfs-site.xml
            <!--  開啓ha自動故障轉移 -->
            <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
            </property>
            
            <property>
                <name>dfs.client.failover.proxy.provider.ns1</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
            </property>

    2.分發配置文件
        $ scp etc/hadoop/core-site.xml  etc/hadoop/hdfs-site.xml centos02.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
        $ scp etc/hadoop/core-site.xml  etc/hadoop/hdfs-site.xml centos03.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    3.啓動故障轉移服務
            1)首先中止hdfs和zk
            $ sbin/stop-dfs.sh
            ##關閉zk(3臺服務器)
            $ bin/zkServer.sh stop        
            重啓##啓動zk(3臺服務器)
            $ bin/zkServer.sh start        

            2)初始化zkfc[PC1也就是nn1]  在第一臺(cd /opt/modules/hadoop-2.5.0/  )
            $ bin/hdfs zkfc -formatZK  ##初始化ZKFC
            17/12/22 04:50:55 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns1 in ZK.
            17/12/22 04:50:55 INFO zookeeper.ZooKeeper: Session: 0x2607abd3bee0000 closed
            17/12/22 04:50:55 INFO zookeeper.ClientCnxn: EventThread shut down
            3) 啓動hdfs 在centos01啓動便可
            $ sbin/start-dfs.sh            ##啓動hdfs
        
            $ bin/hdfs haadmin -getServiceState nn1     #查看nn1狀態
            $ bin/hdfs haadmin -getServiceState nn2     #查看nn2狀態
    4. 查看三臺進程,確認開啓
            $jps 
            [centos01]
            [hadoop@centos01 hadoop-2.5.0]$ jps
            3281 QuorumPeerMain
            4793 JournalNode
            4610 DataNode
            5137 Jps
            4518 NameNode
            4974 DFSZKFailoverController

            [centos02]
            [hadoop@centos02 hadoop-2.5.0]$ jps
            3129 QuorumPeerMain
            4270 Jps
            4176 DFSZKFailoverController
            3892 NameNode
            3955 DataNode
            4046 JournalNode

            [centos03]
            [hadoop@centos03 hadoop-2.5.0]$ jps
            3630 Jps
            3553 JournalNode
            3022 QuorumPeerMain
            3465 DataNode
    5. 模擬active namenode 故障
        $ kill -9 4518  #殺死active namenode  standby namenode 切爲active
        $ sbin/hadoop-daemon.sh start namenode  #於該主機再次namenode  ,爲standby

ResourceManager HA

集羣規劃
    PC01        PC02            PC03
    NameNode    NameNode
    ZKFC        ZKFC
                ResourceManager    ResourceManager
    DataNode    DataNode        DataNode
    JournalNode    JournalNode        JournalNode    
    NodeManager    NodeManager        NodeManager
    ZooKeeper    ZooKeeper        ZooKeeper

    先中止hdfs進程
    $ sbin/hadoop-daemon.sh start namenode

    1) 修改配置文件

        =====yarn-site.xml (覆蓋)
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        
        <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
        </property>
        
        <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>86400</value>
        </property>

        <!--啓用resourcemanager ha-->
        <property>
           <name>yarn.resourcemanager.ha.enabled</name>
           <value>true</value>
        </property>
            
        <property>
           <name>yarn.resourcemanager.cluster-id</name>
           <value>rmcluster</value>
        </property>

        <property>
           <name>yarn.resourcemanager.ha.rm-ids</name>
           <value>rm1,rm2</value>
        </property>

        <property>
            <name>yarn.resourcemanager.hostname.rm1</name>
            <value>centos02.ibeifeng.com</value>
        </property>

        <property>
            <name>yarn.resourcemanager.hostname.rm2</name>
            <value>centos03.ibeifeng.com</value>
        </property>

        <!--指定zookeeper集羣的地址--> 
        <property>
           <name>yarn.resourcemanager.zk-address</name>  
           <value>centos01.ibeifeng.com:2181,centos02.ibeifeng.com:2181,centos03.ibeifeng.com:2181</value>
        </property>

        <!--啓用自動恢復--> 
        <property>
           <name>yarn.resourcemanager.recovery.enabled</name>
           <value>true</value>
        </property>

        <!--指定resourcemanager的狀態信息存儲在zookeeper集羣--> 
        <property>
           <name>yarn.resourcemanager.store.class</name>
           <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>


    2) 分發配置文件
        將yarn-site.xml分發到其餘兩臺
        $ scp etc/hadoop/yarn-site.xml  centos02.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
        $ scp etc/hadoop/yarn-site.xml  centos03.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
    3) 啓動ResourceManagere
        先在centos01啓動hdfs
            $ sbin/start-dfs.sh 
        在rm1(centos02)上:
            $ sbin/start-yarn.sh

        在rm2(centos03)上手動啓動:
            $ sbin/yarn-daemon.sh start resourcemanager
    4) 檢查進程是否啓動
        $ jps

        [hadoop@centos01 hadoop-2.5.0]$ jps
        6737 DFSZKFailoverController
        6559 JournalNode
        3281 QuorumPeerMain
        6375 DataNode
        6975 Jps
        6277 NameNode
        6854 NodeManager

        [hadoop@centos02 hadoop-2.5.0]$ jps
        5471 DataNode
        4917 ResourceManager
        5403 NameNode
        3129 QuorumPeerMain
        6020 Jps
        5866 NodeManager
        5687 DFSZKFailoverController
        5564 JournalNode

        [hadoop@centos03 hadoop-2.5.0]$ jps
        3022 QuorumPeerMain
        4373 NodeManager
        4174 DataNode
        4577 Jps
        4263 JournalNode
        4518 ResourceManager

    5) 查看serverid爲rm1的resourcemanager節點的狀態
        $ bin/yarn rmadmin -getServiceState rm1
        或網頁查看
        http://centos02.ibeifeng.com:8088/cluster
        http://centos03.ibeifeng.com:8088/cluster
        
    6) 測試ResourceManager HA
        kill -9  4917    而後查看web界面的訪問
        centos03變爲active
        
        再次啓動centos02的resourcemanager  狀態爲standby
相關文章
相關標籤/搜索