高可用(HA) -- ZooKeeper

ZooKeeper

  • 一个开源的分布式的,为分布式应用提供服务的项目
  • 提供原语集合以便分布式应用可以在它之上构建更高层次的同步服务
  • 角色

    观察者模式:
            leader:        领导者负责进行投票的发起及决议, 更新状态
            学习者:
                follower:    接受客户端请求并发挥客户端返回结果,参与投票
                observer:    接受请求,转发给leader,不参与投票,只同步leader.
            客户端:    发起请求
        观察者模式的应用: 软件皮肤, 编辑工具设置
  • 安装

    1. 伪分布模式

      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. 完全分布模式

      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状态

开启故障自动转移

先停止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

觉地求生
20 声望3 粉丝