[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 。

最新文章

  1. WebForm基础
  2. Android按需添加Google Play服务
  3. BZOJ-2748 音量调节 DP+背包(脑残)
  4. Oracle PL/SQL之LOOP循环控制语句
  5. [转载] poll()函数
  6. vijos P1037搭建双塔
  7. SpeedPHP多入口设置 前台和后台入口分开
  8. Error Code: 1064 – You have an error in your SQL syntax解决几个方法
  9. 一个好用的web甘特图
  10. winform程序中为无边框窗体手动添加窗体拖动代码
  11. SQLite的总结与在C#的使用
  12. Web前端学习(4):显示图片、url与文件路径
  13. SVN错误:Attempted to lock an already-locked dir的解决
  14. SpringBoot多环境部署,在启动时动态设置相应的配置文件
  15. h5手机查看
  16. avalonjs学习笔记之实现一个简单的查询页
  17. Go 初体验 - 错误与异常处理 - recover和panic
  18. WCF寄宿IIS
  19. alpha冲刺(1/10)
  20. Maven项目打包成可执行Jar文件

热门文章

  1. JAVA数据结构-----栈
  2. Machine Learning 学习笔记 (3) —— 泊松回归与Softmax回归
  3. SQL Server2008 无法连接到 local
  4. 配置 Cocoapods的简单配置及胡思乱想
  5. WEB相关文件的加载顺序
  6. nodejs笔记三--url处理、Query String;
  7. Gentoo 网络接口配置文件说明
  8. android开发 替换bitmap中的颜色值
  9. PHP实现简单的学生信息管理系统(web版)
  10. 安装Symfony2