HDFS-HA的配置-----自动Failover(ZKFC)

转载于http://blog.csdn.net/chenpingbupt 

http://www.wuzesheng.com/?p=2475


1、概述

    在手动FailOver的基础上,自动Failover增加了两个东西:一个是ZooKeeper集群,一个是ZKFailoverController(简称:ZKFC)

1.1  ZK集群:

    作为一个高可靠系统,能够为一小部分协同数据提供监控,将数据的更改随时反应给客户端。HDFS的HA依赖zk提供的两个特性:一个是错误监测,一个是活动节点选举

   Failure detection

   每个NN都会在ZK中注册并且持久化一个session。一旦一个NN失效了,那么这个session也将过期,那么zk将会通知其他的NN    应该发起一个Failover

   Active NameNode election

   ZK提供了一个简单的机制来保证只有一个NN是活动的。如果当前的活动NN失效了,那么另一个NN将获取ZK中的独占锁,表名自    己是活动的节点。

1.2 ZKFailoverController(ZKFC)

   作为一个ZK集群的客户端,用来监控NN的状态信息。每个运行NN的节点必须要运行一个zkfc。zkfc提供以下功能:

     Health monitoring
zkfc定期对本地的NN发起 health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效节点。
    ZooKeeper session management
当本地NN是健康的时候,zkfc将会在zk中持有一个session。如果本地NN又正好是active的,那么zkfc还有持有一个"ephemeral"的节点作为锁,一旦本    地NN失效了,那么这个节点将会被自动删除。
         ZooKeeper-based election
如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。那么他将试图去获取该锁,一旦成功,那么它就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的话。第二步,将本地NN转换到active状态。

2、ZK集群配置    

  考虑到zk集群的需要的资源不是很多,一般都建议将NN和ZK节点部署在同一个机器上。但是一般都希望将ZK的数据和HDFS的meta数据分放在不同的物理盘上。这样即能保证数据的隔离又能保证性能。一般来说,ZK需要配置三五个节点足矣,下面详述ZK集群配置及启动

2、创建一个任意名字的File文件,配置如下参数:
tickTime=2000
dataDir=/home/ziang/DfsDataDir/zookeeper
clientPort=31315
initLimit=5
syncLimit=2
server.1=dw13:31316:31317
server.2=dw14:31316:31317
server.3=dw23:31316:31317
由于ZK集群中每个节点都需要知道其他节点的信息,所以server.id=host:port:port就是为了完成这个任务的。其中个server.id这个参数由用户分配给每个zk节点并放置在dataDir目录下的myid文件中。
3、myid文件只有一行,内面是一个1-255的数字,必须保证唯一。如server 1的myid文件内保存“1”就够了。
4、在每个zk的部署机器上配置好各个配置项到配置文件:
mkdir -p /home/ziang/DfsDataDir/zookeeper/logs && mkdir -p /home/ziang/DfsDataDir/zookeeper/ && echo 1 >/home/ziang/DfsDataDir/zookeeper/myid          
mkdir -p /home/ziang/DfsDataDir/zookeeper/logs && mkdir -p /home/ziang/DfsDataDir/zookeeper/ && echo 2 >/home/ziang/DfsDataDir/zookeeper/myid          
mkdir -p /home/ziang/DfsDataDir/zookeeper/logs && mkdir -p /home/ziang/DfsDataDir/zookeeper/ && echo 3 >/home/ziang/DfsDataDir/zookeeper/myid
5、启动ZK集群,在每个zk的部署机器上运行
export ZOO_LOG_DIR=/home/ziang/DfsDataDir/zookeeper/logs&& sh bin/zkServer.sh start
6、测试集群的正确性
java -cp zookeeper-3.3.5.jar:lib/log4j-1.2.15.jar:conf:lib/jline-0.9.94.jar   org.apache.zookeeper.ZooKeeperMain -server 127.0.0.1:31315   
或者
sh zkCli.sh -server 127.0.0.1:31315
          

3、HDFS相关配置

完成了ZK的配置之后,剩下就配置HDFS了
1、在core-site.xml中,配置:
 <property>   
     <name>ha.zookeeper.quorum.hdpcdh4</name>    
     <value>dw13:31315,dw14:31315,dw23:31315</value>
 </property> 
下面两个为了安全性,可选的。
<property>
     <name>ha.zookeeper.auth</name>
     <value>@/path/to/zk-auth.txt</value>
</property>
<property>
     <name>ha.zookeeper.acl</name>
     <value>@/path/to/zk-acl.txt</value>
</property>
2、在hdfs-site.xml中,配置:
<property>
     <name>dfs.ha.automatic-failover.enabled.hdpcdh4</name>
     <value>true</value>
</property>
下面也是可选的:
<property>
     <name>ha.zookeeper.parent-znode</name>
     <value>/hadoop-ha</value>
</property>

4、相关初始化

完成上述配置之后,就可以开始进行初始化了。进行初始化的时候,必须保证zk集群已经启动了。
1、在ZK中创建znode来存储automatic Failover的数据,任选一个NN执行完成即可:
sh bin/hdfs zkfc -formatZK
2、启动zkfs,在所有的NN节点中执行以下命令:
sh sbin/hadoop-daemon.sh start zkfc

5、集群启动

最后启动集群
sh sbin/start-dfs.sh 

6、基本原理

zk的基本特性:
(1) 可靠存储小量数据且提供强一致性
(2) ephemeral node, 在创建它的客户端关闭后,可以自动删除
(3) 对于node状态的变化,可以提供异步的通知(watcher)

zk在zkfc中可以提供的功能:
(1) Failure detector: 及时发现出故障的NN,并通知zkfc
(2) Active node locator: 帮助客户端定位哪个是Active的NN
(3) Mutual exclusion of active state: 保证某一时刻只有一个Active的NN

7 、模块

(1) ZKFailoverController(DFSZKFailoverController): 驱动整个ZKFC的运转,通过向HealthMonitor和ActiveStandbyElector注册回调函数的方式,subscribe HealthMonitor和ActiveStandbyElector的事件,并做相应的处理
(2) HealthMonitor: 定期check NN的健康状况,在NN健康状况发生变化时,通过回调函数把变化通知给ZKFailoverController
(3) ActiveStandbyElector: 管理NN在zookeeper上的状态,zookeeper上对应node的结点发生变化时,通过回调函数把变化通知给ZKFailoverController
(4) FailoverController: 提供做graceful failover的相关功能(dfs admin可以通过命令行工具手工发起failover) 

8、系统架构

zkfc-arch
如上图所示,通常情况下Namenode和ZKFC同布署在同一台物理机器上, HealthMonitor, FailoverController, ActiveStandbyElector在同一个JVM进程中(即ZKFC), Namenode是一个单独的JVM进程。如上图所示,ZKFC在整个系统中有几个重要的作用:
(1) Monitor and try to take active lock: 向zookeeper抢锁,抢锁成功的zkfc,指导对应的NN成为active的NN; watch锁对应的znode,当前active NN的状态发生变化导致失锁时,及时抢锁,努力成为active NN
(2) Monitor NN liveness and health: 定期检查对应NN的状态, 当NN状态发生变化时,及时通过ZKFC做相应的处理
(3) Fences other NN when needed: 当前NN要成为active NN时,需要fence其它的NN,不能同时有多个active NN

9、线程模型

ZKFC的线程模型总体上来讲比较简单的,它主要包括三类线程,一是主线程;一是HealthMonitor线程; 一是zookeeper客户端的线程。它们的主要工作方式是:
(1) 主线程在启动所有的服务后就开始循环等待
(2) HealthMonitor是一个单独的线程,它定期向NN发包,检查NN的健康状况
(3) 当NN的状态发生变化时,HealthMonitor线程会回调ZKFailoverController注册进来的回调函数,通知ZKFailoverController NN的状态发生了变化
(4) ZKFailoverController收到通知后,会调用ActiveStandbyElector的API,来管理在zookeeper上的结点的状态
(5) ActiveStandbyElector会调用zookeeper客户端API监控zookeeper上结点的状态,发生变化时,回调ZKFailoverController的回调函数,通知ZKFailoverController,做出相应的变化

10、 类关系图

zkfc_class

11、参考资料

(1) https://issues.apache.org/jira/secure/attachment/12521279/zkfc-design.pdf

(2) http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop 3.x 中,可以通过配置 Hadoop HA(High Availability)实现高可用集群。 以下是配置 Hadoop HA 的基本步骤: 1. 配置 Hadoop 的 core-site.xml 文件,启用 HA: ```xml <property> <name>ha.zookeeper.quorum</name> <value>zk1:2181,zk2:2181,zk3:2181</value> <description>Quorum的Zookeeper服务地址</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> <description>默认文件系统</description> </property> <property> <name>ha.zookeeper.session.timeout.ms</name> <value>10000</value> <description>Zookeeper会话超时时间</description> </property> ``` 其中,ha.zookeeper.quorum 配置 Zookeeper 的地址,fs.defaultFS 配置默认文件系统,ha.zookeeper.session.timeout.ms 配置 Zookeeper 会话超时时间。 2. 配置 Hadoop 的 hdfs-site.xml 文件,启用 NameNode HA: ```xml <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>nn1:8020</value> <description>第一个NameNode的RPC地址</description> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>nn2:8020</value> <description>第二个NameNode的RPC地址</description> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>nn1:50070</value> <description>第一个NameNode的HTTP地址</description> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>nn2:50070</value> <description>第二个NameNode的HTTP地址</description> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value> <description>QJM的Journal节点地址</description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/data1/dfs/journalnode,/data2/dfs/journalnode,/data3/dfs/journalnode</value> <description>Journal节点的存储路径</description> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>启用自动故障转移</description> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <description>启用sshfence作为fencing方法</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> <description>SSH私钥文件路径</description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> <description>SSH连接超时时间</description> </property> ``` 其中,dfs.namenode.rpc-address.mycluster.nn1 和 dfs.namenode.rpc-address.mycluster.nn2 分别配置两个 NameNode 的 RPC 地址,dfs.namenode.http-address.mycluster.nn1 和 dfs.namenode.http-address.mycluster.nn2 分别配置两个 NameNode 的 HTTP 地址,dfs.namenode.shared.edits.dir 配置 JournalNode 的地址,dfs.journalnode.edits.dir 配置 JournalNode 存储路径,dfs.ha.automatic-failover.enabled 启用自动故障转移,dfs.ha.fencing.methods 配置 fencing 方法,dfs.ha.fencing.ssh.private-key-files 配置 SSH 私钥文件路径,dfs.ha.fencing.ssh.connect-timeout 配置 SSH 连接超时时间。 3. 配置 Hadoop 的 yarn-site.xml 文件,启用 ResourceManager HA: ```xml <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> <description>启用ResourceManager HA</description> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>mycluster</value> <description>ResourceManager集群ID</description> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> <description>两个ResourceManager的ID</description> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>rm1</value> <description>第一个ResourceManager的主机名</description> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>rm2</value> <description>第二个ResourceManager的主机名</description> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>rm1:8088</value> <description>第一个ResourceManager的Web地址</description> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>rm2:8088</value> <description>第二个ResourceManager的Web地址</description> </property> ``` 其中,yarn.resourcemanager.ha.enabled 启用 ResourceManager HA,yarn.resourcemanager.cluster-id 配置 ResourceManager 集群 ID,yarn.resourcemanager.ha.rm-ids 配置两个 ResourceManager 的 ID,yarn.resourcemanager.hostname.rm1 和 yarn.resourcemanager.hostname.rm2 分别配置两个 ResourceManager 的主机名,yarn.resourcemanager.webapp.address.rm1 和 yarn.resourcemanager.webapp.address.rm2 分别配置两个 ResourceManager 的 Web 地址。 4. 启动 JournalNode: ```bash hdfs --daemon start journalnode ``` 5. 启动 NameNode: ```bash hdfs namenode -format start-dfs.sh ``` 6. 启动 ResourceManager: ```bash start-yarn.sh ``` 7. 启动 ZKFC: ```bash hdfs zkfc -formatZK hdfs --daemon start zkfc ``` 8. 验证 HA 配置是否生效: ```bash hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 yarn rmadmin -getServiceState rm1 yarn rmadmin -getServiceState rm2 ``` 如果输出为 active,则表示当前节点为 active 节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值