04.Haoop2.0 HA 高可用版原理及搭建

1.HADOOP 2.0 存在的背景

1.Hadoop 1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题

2.HDFS存在的问题(2):

1)NameNode单点故障,难以应用于在线场景 (HA)

2)NameNode压力过大,且内存受限,影扩展性(F)

3.MapReduce存在的问题

1)JobTracker访问压力大,影响系统扩展性

2)难以支持除MapReduce之外的计算框架,比如Spark、Storm等

 

2.HADOOP 2.0 的构成

Hadoop 2.0由HDFSMapReduceYARN三个分支构成:

1)HDFS 储存:NN Federation(联邦)、HA;2.X:只支持2个节点HA3.0实现了一主多从

2)MapReduce 计算:运行在YARN上的MR;离线计算,基于磁盘I/O计算

3)YARN:资源管理系统

 

3.如何解决HADOOP 1.0 中的问题

1.解决HDFS 1.0中单点故障内存受限问题。

1)解决单点故障

  • HDFS HA:通过主备NameNode解决
  • 如果主NameNode发生故障,则切换到备NameNode上

2)解决内存受限问题

  • HDFS Federation(联邦)
  • 水平扩展,支持多个NameNode:

    (1)每个NameNode分管一部分目录;

    (2)所有NameNode共享所有DataNode存储资源

2.HADOOP 2.x仅是架构上发生了变化,使用方式不变

4.HADOOP 2.0 HA 架构图

1.主备NameNode

1)解决单点故障属性,位置

  • 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
  • 所有DataNode同时向两个NameNode汇报数据块信息(位置)
  • JNN:集群(属性):Journal Node,容毁率:过半机制。3台 JNN 必须有 2台正常运行
  • standby NN:备,完成了edits.log文件的合并产生新的image,推送回Active NN,不用再搭建 Secondary Namenode

2)两种切换选择

  • 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
  • 自动切换:基于Zookeeper实现

3)基于Zookeeper自动切换方案

  • ZooKeeper Failover Controller:监控NameNode健康状态,并向Zookeeper注册NameNode
  • NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
  • 同一时刻只能有 1个 Namenode 处于active 状态

 

5.HADOOP 2.0 Federation 架构图

1)通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展。

2)能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。

  • 横向扩展使用 Federation ,纵向使用 HA 高可用防止单点故障。

 

6. HADOOP HA 高可用版本搭建

1)2个 Namenode 之间实现自动切换功能

     所以 node01 和 node02 之间需要能自动切换。

     a.  cd /root/.ssh/

     b.  ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa   生存公钥

     c.  cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  先追加到自己的文件中

     d.  ssh local host 登入看一下是否已经成功免密登入

     e.   scp id_rsa.pub node01:`pwd`/node02.pub  把node02 的公钥分发到 node01 上去

 2) hdfs-site.xml 中的一些配置

     a. dfs.nameservices - the logical name for this new nameservice

     <property>
         <name>dfs.nameservices</name>
         <value>mycluster</value>
     </property>

          nameservice 的逻辑名称,作为接口用来指向之后做 主备2个节点的 Namenode

     b.dfs.ha.namenodes.[nameservice ID] 

   <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
   </property>

       注意:Currently, only a maximum of two NameNodes may be configured per nameservice.

                  意思是每个 cluster 只能有最多2个 NameNode

      c.dfs.namenode.rpc-address.[nameservice ID].[name node ID]

          上面设置的 nn1, nn2 都是 逻辑名称,需要设置需物理主机之间的映射 ,rpc 远程服务调用

     <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>node01:8020</value>
     </property>
     <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>node02:8020</value>
     </property>

     d.dfs.namenode.http-address.[nameservice ID].[name node ID] 

        http 协议用于浏览器与服务器之间的互通,浏览器的超文本传输协议。   

      <property>
         <name>dfs.namenode.http-address.mycluster.nn1</name>
         <value>node01:50070</value>
      </property>
      <property>
         <name>dfs.namenode.http-address.mycluster.nn2</name>
         <value>node02:50070</value>
      </property>


   e.dfs.namenode.shared.edits.dir 
       the URI which identifies the group of JNs where the NameNodes will write/read edits

   <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
   </property>

       This is where one configures the addresses of the JournalNodes which provide the shared edits storage, written to by the Active nameNode and read by the Standby NameNode to stay up-to-date with all the file system changes the Active NameNode makes. Though you must specify several JournalNode addresses, you should only configure one of these URIs.

    f. dfs.client.failover.proxy.provider.[nameservice ID] 

       故障转移 failover controller

  <property>
     <name>dfs.client.failover.proxy.provider.mycluster</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

   g.dfs.ha.fencing.methods

      状态隔离,只有1个 Namenode处于active 状态。一旦故障,立刻隔离。

       a list of scripts or Java classes which will be used to fence the Active NameNode during a failover

       Importantly, when using the Quorum Journal Manager, only one NameNode will ever be allowed to write to the JournalNodes, so there is no potential for corrupting the file system metadata from a split-brain scenario.

  •       sshfence - SSH to the Active NameNode and kill the process
      <property>
         <name>dfs.ha.fencing.methods</name>
         <value>sshfence</value>
      </property>
      <property>
         <name>dfs.ha.fencing.ssh.private-key-files</name>
         <value>/root/.ssh/id_rsa</value>
      </property>

  h.dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state

     JN 下面的存放目录

  <property>
     <name>dfs.journalnode.edits.dir</name>
     <value>/var/hadoop/ha/journalnode</value>
  </property>

3) vi core-site.xml 中的配置

    a.fs.defaultFS - the default path prefix used by the Hadoop FS client when none is given

  <property>
     <name>fs.defaultFS</name>
     <value>hdfs://mycluster</value>
  </property>
  <property>
     <name>hadoop.tmp.dir</name>
     <value>/var/hadoop/ha</value>
  </property>

4) Zookeeper 的搭建实现自动故障转移

    配置2个 component:a ZooKeeper quorum, and the ZKFailoverController process (abbreviated as ZKFC).

   Zookeeper 作用:

  •    Failure detection
  •    Active NameNode election 

    ZKFailoverController (ZKFC):

  •     Health monitoring
  •     ZooKeeper session management
  •     ZooKeeper-based election

   Zookeeper 部署(需要在集群启动之前完成):

  •   vi hdfs-site.xml  
 <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
 </property>
  •   vi core-site.xml
 <property>
    <name>ha.zookeeper.quorum</name>
    <value>node01:2181,node02:2181,node03:2181</value>
 </property>

          把修改的文件分发的到其他的节点上: scp core-site.xml hdfs-site.xml node02:`pwd`

                                                                        scp core-site.xml hdfs-site.xml node03:`pwd`

  •    下载 /解压 Zookeeper

          直接用了 xshell 上传文件,在自己配置的zookeeper 上安装。

  •   Zookeeper 的配置文件

         a. cd zookeeper-3.4.6/conf

         b. mv  zoo_sample.cfg  zoo.cfg 修改名字

         c. vi zoo.cfg:

             dataDir=/var/zk  在zoo.cfg中修改文件的存储路径

             最后添加3行(整个参与zookeeper的集群数量,需要配置 server id):

             server.1=node01:2888:3888
             server.2=node02:2888:3888
             server.3=node03:2888:3888

             2888 是主从节点直接的通讯端口,3888  发生挂断之后选举机制采用的端口 

        d.   scp -r zookeeper-3.4.6/ node02:`pwd`

              scp -r zookeeper-3.4.6/ node03:`pwd` 

       e. 创建路径: mkdir -p /var/zk
            node01 放入  id: echo 1 > /var/zk/myid

            node02  放入 id: echo 2 > /var/zk/myid

            node01 放入  id: echo 3 > /var/zk/myid

5) 配置 zookeeper 的环境变量

     a. vi + /etc/profile 中修改(以下是之前的java,hadoop 和现在的zookeeper 的环境变量):

  •     export JAVA_HOME=/root/software/jdk1.8.0_211
  •     export HADOOP_HOME=/root/software/hadoop-2.7.6
  •     export ZOOKEEPER_HOME=/root/software/zookeeper-3.4.6
  •     PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

     b. 把 node01 上的 /etc/profile 分发到其他的节点上:

  •     scp /etc/profile node02:/etc/  
  •     scp /etc/profile node03:/etc/  

    c. 启动程序:zkServer.sh start  zkServer.sh status 查看状态, zkServer.sh stop 关闭

       注意:在zookeeper.out 的日志碰到问题,没有 0.0.0.0, 所以需要 在 /etc/hosts 文件里面需要加入 0.0.0.0 localhost

  6)Journal Node 启动 & Namenode 启动

  • node01,node02,node03 都需要启动:hadoop-daemon.sh start journalnode
  • 格式化 active node,hdfs namenode  -format
  • 启动namenode01:hadoop-daemon.sh start namenode
  • 在备节点上执行:hdfs namenode -bootstrapStandby
  • 自动故障转移(ZKFC)在 Zookeeper 上注册: hdfs zkfc -formatZK
  • 启动集群: start-dfs.sh
  • 关闭及关闭后启动:stop-dfs.sh , zkServer.sh stop ; 再次启动,先启动 zkServer.sh start start-dfs.sh  无须再执行 JNN

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值