ZooKeeper安装效果演示

37次阅读

共计 10384 个字符,预计需要花费 26 分钟才能阅读完成。

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

正文完
 0