zoukankan      html  css  js  c++  java
  • [RM HA3] Zookeeper在RM HA的应用

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

  • 相关阅读:
    nsq main里面golang多个协程管理写法
    关于centos压测的问题
    Jaeger全链路go实现,包含http和消息队列的链式传递
    mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法
    Axure9:一键复制Iconfont图标到Axure的插件安装
    Axure9:导入阿里云DataV.GeoAtlas矢量地图到Axure
    Axure:编辑技巧:拖动复制、编组、组内选中、穿透选中、选中模式
    Axure学习一:打开软件,预览和生成HTML原型、安装Chrome插件
    Axure RP授权码
    vm 安装rethat和centos
  • 原文地址:https://www.cnblogs.com/shenh062326/p/3547786.html
Copyright © 2011-2022 走看看