集群的高可用性----自动故障转移

自动容灾

当状态为Active的Namenode主机发生故障时,HDFS进行自动故障转移,让状态为Standby的Namenode主机转成状态为Active的Namenode进行工作。

组件

自动故障转移为HDFS部署添加了两个新组件:

Apache ZooKeeper
是一种高可用性服务,用于维护少量协调数据,通知客户端该数据的更改以及监视客户端是否存在故障。自动HDFS故障转移的实现依赖于ZooKeeper来实现以下功能:

  1. 故障检测
    集群中的每个NameNode计算机都在ZooKeeper中维护一个持久会话。如果计算机崩溃,ZooKeeper会话将过期,通知另一个NameNode应该触发故障转移。
  2. Active NameNode选举
    ZooKeeper提供了一种简单的机制,可以将节点专门选为活动节点。如果当前活动的NameNode崩溃,则另一个节点可能在ZooKeeper中采用特殊的独占锁,指示它应该成为下一个活动的节点。

ZKFailoverController(ZKFC)
是一个新组件,它是一个ZooKeeper客户端,它还监视和管理NameNode的状态。运行NameNode的每台机器也运行ZKFC,ZKFC负责:

  1. 运行状况监视
    ZKFC定期使用运行状况检查命令对其本地NameNode进行ping操作。只要NameNode及时响应健康状态,ZKFC就认为该节点是健康的。如果节点已崩溃,冻结或以其他方式进入了不健康状态,则运行状况监视器会将其标记为运行状况不佳。
  2. ZooKeeper会话管理
    当本地NameNode运行正常时,ZKFC在ZooKeeper中保持会话打开。如果本地NameNode处于活动状态,它还拥有一个特殊的“锁定”znode。此锁使用ZooKeeper对“短暂”节点的支持; 如果会话过期,将自动删除锁定节点。
  3. 基于ZooKeeper的选举
    如果本地NameNode是健康的,并且ZKFC发现没有其他节点当前持有锁znode,它将自己尝试获取锁。如果成功,那么它“赢得了选举”,并负责运行故障转移以使其本地NameNode处于活动状态。故障转移过程类似于上述手动故障转移:首先,必要时对先前的活动进行隔离,然后本地NameNode转换为活动状态。

Zookeeper的安装

  1. 下载zookeeper-3.4.6.tar.gz
  2. 上传到虚拟机中
  3. 解压
tar -zxvf zookeeper-3.4.6.tar.gz
  1. 创建软连接
  ln -s zookeeper-3.4.6 zookeeper

集群的高可用性----自动故障转移_第1张图片
5. 配置环境变量

 vim ~/.bash_profile

在这里插入图片描述

  1. 使当前会话生效(无需重启)
 source ~/.bash_profile

独立模式

  1. 在conf目录下复制一个zoo.cfg(有一个样本 zoo_sample.cfg)

集群的高可用性----自动故障转移_第2张图片

  1. 修改 zookeeper持久化数据的存储位置
    集群的高可用性----自动故障转移_第3张图片

  2. 在本地上开启server
    zkServer.sh start
    集群的高可用性----自动故障转移_第4张图片

  3. 使用客户端连接服务
    zkCli.sh [-server] [host]
    集群的高可用性----自动故障转移_第5张图片

  4. 客户端退出
    quit/close

  5. 服务器退出
    zkServer.sh stop

集群模式

  1. 修改zoo.cfg配置文件
    追加以下内容
    server.1=master1:2888:3888
    server.2=slave3:2888:3888
    server.3=slave4:2888:3888

集群的高可用性----自动故障转移_第6张图片

  1. 将zookeeper复制到相应节点
    scp ~/apps/zookeeper-3.4.6 wyc@slave1:~/apps/

  2. 添加myid文件
    在server.x对应的机器上的dataDir指定的目录下添加文件
    文件内容为server.x中的x(一一对应)
    集群的高可用性----自动故障转移_第7张图片

  3. 重启

配置自动故障转移

  1. hdfs-site.xml
    修改属性为true,支持自动容灾
    
		dfs.ha.automatic-failover.enabled
		true
	 
  1. core-site.xml中
    配置zookeeper服务器
      
		   ha.zookeeper.quorum
		   master:2181,slave2:2181,slave3:2181
	   
  1. 在namenode所在的机器中的一个上进行格式化
    hdfs zkfc -formatZK
  1. 就可以开启HA集群了
    步骤说明:
    step1. 开启zkServer.sh start(需要在所有配置了服务的主机上开启)
    step2. 开启HA集群
    start-dfs.sh
    说明:此shell脚本中会
    先开 两个namenode
    其次 datanode
    然后 journalnode
    最后 zkfc (如果手动开启zkfc: hdfs start zkfc)
    集群的高可用性----自动故障转移_第8张图片
    各节点对应进程如下
    集群的高可用性----自动故障转移_第9张图片

  2. 浏览器查看
    集群的高可用性----自动故障转移_第10张图片
    集群的高可用性----自动故障转移_第11张图片

  3. 进行自动容灾测试
    关闭nn2的namenode进程
    集群的高可用性----自动故障转移_第12张图片
    浏览器查看,无法访问nn2,nn1的状态自动切换为active
    集群的高可用性----自动故障转移_第13张图片

注意

  1. 需要在所有配置zkServer的节点上,均开启zkServer服务(zkServer.sh start)
  2. 需要检查myid文件是否配置正确
  3. 若开启集群之后(start-dfs.sh),两台namenode节点主机状态均为standby
    解决方法:
    首先关闭集群,删除hadoop下的tmp和logs目录删除
    其次启动相应节点上(通过查看hdfs-site.xml中可知)的journalnode守护进程
    hadoop-daemon.sh start journalnode

然后如果是新搭建的集群,选择其中一个namonde所在的机器进行格式化。

  hdfs namenode -format

开启格式化好的namenode

    hadoop-daemon.sh start namenode

在未格式化的namenode上,运行如下命令,同步元数据

    hdfs namenode -bootstrapStandby

关闭namenode

    hadoop-daemon.sh stop namenode

初始化,注意,journalnode必须是开启的(n-1/2)

     hdfs namenode -initializeSharedEdits

在namenode所在的机器中的一个上进行格式化

    hdfs zkfc -formatZK

开启所有节点的zkserver

    zkServer.sh start

最后启动集群

     start-dfs.sh

你可能感兴趣的:(Hadoop)