高可用(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/zkData4)启动zookeeper$bin/zkServer.sh start$ jps   #查看java进程如下2088 QuorumPeerMain5)查看zookeeper的状态$bin/zkServer.sh status        #信息如下JMX enabled by defaultUsing config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfgMode: 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:38883)创建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内容是35)启动3台的zookeeper    $ bin/zkServer.sh start6)检查进程    $ jps    3050 QuorumPeerMain    3111 Jps8)检查并核对状态3台的状态    $ bin/zkServer.sh statusZookeeper 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