[RM HA3] Zookeeper在RM HA的应用

RM HA(ResourceManager  HighAvailability)中使用Zookeeper的地方在ZKRMStateStore和ZKFailoverController,ZKRMStateStore继承于抽象类RMStateStore,从名字上可以看出RMStateStore是存储RM状态的存储器,ZKRMStateStore是其中的一种实现——使用Zookeeper存储RM状态。抽象类ZKFailoverController通过Zookeeper实现Master的Auto Failover,社区最新版本2.3只用在HDFS上控制Namanode的Auto Failover,RM还没有Auto Failover功能, CLoudera5已经实现了Namanode,Jobtracker和RM的Auto Failover。

本文简要介绍了Zookeeper在RM HA的应用。

问题1,Zookeeper存储哪些RM状态信息,如何存储?

RM HA第一个需要解决的问题是存储RM的状态信息,需要存储的信息包括app的状态,作业的TOKEN等。Zookeeper存储RM状态的目录格式如下所示:

* ROOT_DIR_PATH

* |--- VERSION_INFO

* |--- RM_ZK_FENCING_LOCK

* |--- RM_APP_ROOT

* |     |----- (#ApplicationId1)

* |     |        |----- (#ApplicationAttemptIds)

* |     |

* |     |----- (#ApplicationId2)

* |     |       |----- (#ApplicationAttemptIds)

* |     ....

* |

* |--- RM_DT_SECRET_MANAGER_ROOT

*        |----- RM_DT_SEQUENTIAL_NUMBER_ZNODE_NAME

*        |----- RM_DELEGATION_TOKENS_ROOT_ZNODE_NAME

*        |       |----- Token_1

*        |       |----- Token_2

*        |       ....

*        |

*        |----- RM_DT_MASTER_KEYS_ROOT_ZNODE_NAME

*        |      |----- Key_1

*        |      |----- Key_2

*                ....

可以看到,存储的信息主要包Application和SECRET_MANAGER(安全与权限相关)的信息。

问题2,如何实现Fencing(隔离)?

RM HA另一个需要解决的问题是如何防止两个RM(或一个RM的多个线程)同时对一个Zookeeper上的文件操作(包括读写,创建,删除等),这时就需要增加Fencing机制来保证。

由于RM HA使用的Zookeeper的权限控制实现Fencing,所以首先需要了解Zookeeper的权限控制方法。简单的说,在Zookeeper上创建目录的时候,需要指定用户和相应的权限,例如创建一个目录时可以指定只有自己能对这个目录读写,其他用户只有读的权限。

首先,ZKRMStateStore初始化的时候会创建ROOT_DIR_PATH,并指定该目录只有自己有读写权限,其他用户只有读权限。其次,在每一个ApplicationID目录进行操作的时,都需要现创建一个LOCK文件,创建成功后才开始实际的操作,操作结束后删除LOCK文件。如果创建LOCK文件抛出权限异常,说明这个目录是其他RM(RM HA环境下至少存在两个RM)创建的,这时候RM会强制让自己转换为standby;如果抛出其他的异常,则说明RM的多个线程可能同时对一个目录操作,这是不允许的,这时候RM会强制自己停止工作并退出进程。

问题3,ZKFailoverController如何实现RM的Auto Failover

ZKFailoverController中维护着 ActiveStandbyElector 和HealthMonitor , ActiveStandbyElector主要工作是。

1. 初始化时在 ZK 上创建一个Lock 文件,

2. Standby RM运行过程中监控 ZM 上的Lock 文件是否存在。

HealthMonitor的主要工作是检查自己(RM)的健康状态,通过 HAServiceStatus提供的 getServiceStatus() 和monitorHealth() 方法,如果自己健康的,则会试图创建 Lock 文件,按照结果成为 active或 standby 。

[RM HA3] Zookeeper在RM HA的应用的更多相关文章

  1. Zookeeper 三台主机 Ha集群的搭建

    前期准备1.修改Linux主机名 2.修改IP 3.修改主机名和IP的映射关系 /etc/hosts ######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机等 ...

  2. 【Zookeeper】利用zookeeper搭建Hdoop HA高可用

    HA概述 所谓HA(high available),即高可用(7*24小时不中断服务). 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA. ...

  3. xargs rm -rf 与 -exec rm

    # find ./ -exec rm {} \; # find ./ | xargs rm -rf 两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exe ...

  4. Apache版本的Hadoop HA集群启动详细步骤【包括Zookeeper、HDFS HA、YARN HA、HBase HA】(图文详解)

    不多说,直接上干货! 1.先每台机器的zookeeper启动(bigdata-pro01.kfk.com.bigdata-pro02.kfk.com.bigdata-pro03.kfk.com) 2. ...

  5. 部署hadoop2.7.2 集群 基于zookeeper配置HDFS HA+Federation

    转自:http://www.2cto.com/os/201605/510489.html hadoop1的核心组成是两部分,即HDFS和MapReduce.在hadoop2中变为HDFS和Yarn.新 ...

  6. rm -f + 文件名+* 与 rm -f + 文件名* 的不同效果,大坑呀。

    rm -f catalina.2018-10-22.*    与*号间无空格 rm -f catalina.2018-10-22. *    :多了空格:

  7. 3.16 使用Zookeeper对HDFS HA配置自动故障转移及测试

    一.说明 从上一节可看出,虽然搭建好了HA架构,但是只能手动进行active与standby的切换: 接下来看一下用zookeeper进行自动故障转移: # 在启动HA之后,两个NameNode都是s ...

  8. [RM HA 2] Hadoop 2.0 ResourceManager HA原理

    继上篇文章验证Cloudera RM HA功能后,现在开始分析Cloudera RM HA的原理. 设计目标 主要目的是为了解决两种问题 计划外的机器挂掉 计划内的如软件和硬件升级等. 架构 流程:两 ...

  9. 3.19 YARN HA架构及(RM/NM) Restart讲解

    一.ResourceManager HA ResourceManager(RM)负责跟踪集群中的资源,以及调度应用程序(例如,MapReduce作业). 在Hadoop 2.4之前,ResourceM ...

随机推荐

  1. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  2. iOS学习之Object-C语言内存管理高级

    一.属性的内存管理

  3. MVC4.0 使用Form认证,自定义登录页面路径Account/Login

    使用MVC4.0的时候,一般遇到会员登录.注册功能,我们都会使用Form认证,给需要身份验证的Action进行授权(需要登录后才能访问的Action添加[Authorize]属性标签),登录.注册的时 ...

  4. [rsync+inotify]——监控客户端文件变化,rsync同步到服务器

    关于rsync的配置请参考博文:http://www.cnblogs.com/snsdzjlz320/p/5630695.html 实验环境 (1) Rsync服务器:10.0.10.158 (2) ...

  5. cocos2dx中帧循环的伪代码实现

    1.在游戏开发中,帧率很大程度上体现了游戏的流畅度,帧循环是游戏中一个很重要的概念 2.下面用伪代码实现了cocos2dx中的帧循环 /*main函数调用*/ CCApplication::share ...

  6. JS获取字符串长度(英文占1个字符,中文汉字占2个字符)

    方法一: String.prototype.gblen = function() { var len = 0; for (var i = 0; i < this.length; i++) { i ...

  7. nodeJs事件之监听移除事件

    var EventEmitter=require('events').EventEmitter var life=new EventEmitter(); //comfort 求安慰,函数名: //fo ...

  8. preseed.cfg分区设定案例

    很久之前做ubuntu的PXE配置ubuntu的preseed费了很大的力气,总结的不多,现在温习一下. 就我所接触的,有分区普通磁盘,LVM,和raid三种方式.其中前两中方式比较多,raid方式是 ...

  9. C#基础——三元表达式

    采用三元操作符对?:对表达式进行运算,这种操作符比较特别,因为它有三个操作对象,但它确实属于操作符的一种,它最终也会生成一个值.其表达式采取下述形式: boolean-exp ? value0 : v ...

  10. 浅谈自我对git的初步认识

    本学期我们新增了一门课程,那就是软件工程,不知道为什么,感觉有种莫名的高大上.哈哈!难道是这个名称太抽象了吗?这个问题我感觉到后来肯定就明白了. 第一次博客,感觉好紧张哦,嘿嘿!老师让我们谈谈对git ...