文章作者:luxianghao

文章来源:http://www.cnblogs.com/luxianghao/p/7886850.html  转载请注明,谢谢合作。

免责声明:文章内容仅代表个人观点,如有不当,欢迎指正。

---

一 引言
Ambari作为一个集群管理工具自然不能少了进程自动拉起这个功能,具体的场景就是,当你的进程异常挂掉后,Ambari自动将进程拉起,恢复服务,避免人为介入。

二 版本迭代
Ambari早期就有这个功能,在2.2 2.3 2.4等版本不断的迭代,使其不断的完善易用,早期相关配置在ambari.properties中,由于这种方式相关的配置属性是静态的,修改后需重启Ambari Server和Amabari Agent,后来迁移到了cluster-env.xml中,并录入数据库,在Web端也做了支持,当修改了相关配置也不用重启服务了,相关的修改会随着心跳信息从Ambari Server发送到Ambari agent。支持总开关和组件粒度的开关,相关配置属性如下:
recovery_enabled:集群级别自动拉起功能的开关
recovery_type: 恢复功能的类型,不同类型会有不同的执行逻辑,如下表
recovery_lifetime_max_count:自动拉起生命周期的最大次数,如果Ambari Agent重启这个值会被重置
recovery_max_count:在一个时间窗口内,自动拉起动作的最大尝试次数,如果Ambari Agent重启这个值会被重置
recovery_window_in_minutes:自动拉起功能的时间窗口长度
recovery_retry_interval:两次重试之间的时间间隔

Attribute: recovery_type Commands State Transitions
AUTO_START Start INSTALLED → STARTED
FULL Install, Start, Restart, Stop INIT → INSTALLED, INIT → STARTED, INSTALLED → STARTED, STARTED → STARTED, STARTED → INSTALLED
DEFAULT None Auto start feature disabled

三 功能介绍 && 代码逻辑
Ambari概览中的Ambari Server架构图中我们可以看到Ambari Server维护了一个FSM(有限状态机),记录了每个组件的desired state(Ambari Server期望的组件状态),Ambari Agent会实时的检测自己的宿主机上的服务的current state(当前状态),当desired state和current state不一致就会触发recovery,状态的迁移如上面的表格中所述,2.4版本中recovery_type我们一般使用AUTO START,最常见的场景就是INSTALLED-->STARTED状态的迁移,该事件的逻辑如下:

                                        

备注:组件正常运行时状态为STARTED,异常宕掉或正常停止后状态为INSTALLED。

上述状态迁移发生的前提是两个开关要打开,如下图所示

1 recovery_enabled = True
2 enable components包含Service A
3 当我们不想关上面两个开关但又想某个节点上的组件不启用自启动功能时,我们可以利用Maintenance模式,下面几种情况都会造成组件处于Maintenance模式
a)该组件被置为Maintenance模式
b)组件所在主机被置为Maintenance模式
c)组件所属服务被置为Maintenance模式
d)组件所在主机所属的集群被置为Maintenance模式

相关的源代码文件
1 AmbariManagementControllerImpl.java
2 ServiceComponentDesiredStateEntity.java
3 ServiceComponentRecoveryChangedEvent.java
4 RecoveryConfigHelper.java
5 RecoveryManager.py
6 Controller.py
...

相关的服务log
INFO 2017-11-21 12:16:24,210 RecoveryManager.py:243 - Service A needs recovery.
INFO 2017-11-21 12:16:24,209 Controller.py:265 - Heartbeat response received (id = 15)
INFO 2017-11-21 12:16:24,210 RecoveryManager.py:243 - Service A needs recovery.
INFO 2017-11-21 12:16:24,210 RecoveryManager.py:798 - START command cannot be computed as details are not received from Server.
INFO 2017-11-21 12:16:34,210 Heartbeat.py:82 - Building Heartbeat: {responseId = 15, timestamp = 1511237794210, commandsInProgress = False, componentsMapped = True,recoveryTimestamp = 1511237693282}
INFO 2017-11-21 12:16:54,588 Controller.py:310 - Adding recovery command START for component Service A
INFO 2017-11-21 12:16:54,589 ActionQueue.py:117 - Adding AUTO_EXECUTION_COMMAND for role Service A for service 360HIVE_THRIFT of cluster DRUID to the queue.
INFO 2017-11-21 12:16:54,603 ActionQueue.py:195 - luxianghao process_command recovery_manager True.
INFO 2017-11-21 12:16:54,604 ActionQueue.py:238 - Executing command with id = 1-0 for role = Service A of cluster DRUID.
INFO 2017-11-21 12:16:54,705 Heartbeat.py:82 - Building Heartbeat: {responseId = 18, timestamp = 1511237814704, commandsInProgress = False, componentsMapped = True,recoveryTimestamp = 1511237693282}
INFO 2017-11-21 12:16:54,854 Controller.py:265 - Heartbeat response received (id = 19)
INFO 2017-11-21 12:16:58,982 ActionQueue.py:341 - After EXECUTION_COMMAND (START), current state of Service A to STARTED

相关patch
AMBARI-15077:Auto-start services: Backend API and DB changes for component auto start
AMBARI-14983:Auto-start services: Show list of Services/Component with status indicator
AMBARI-14023:Agents should not ask for auto-start command details if it has the details (smohanty)
AMBARI-13463:Auto start should allow selection of components that can be auto-started (smohanty)
AMBARI-13434:Expose Alert Grace Period Setting in Agents (aonishuk)
AMBARI-13954:Enable auto-start with alerting for AMS (dsen)
AMBARI-14182: Recovery alerts do not go away
AMBARI-14865: Auto start - Maintenance mode of components should be respected when handling agent registration
AMBARI-15141: Start all services request aborts in the middle and hosts go into heartbeat-lost state
AMBARI-15230: Auto-start services: Move default values in ambari.properties to cluster-env.xml
AMBARI-15474: Listen for changes to auto-start configuration and send them to the agent during heartbeats.
AMBARI-12517: Don't send install_packages command to hosts without versionable components

四 类似工具
进程的自动拉起也可以用进程守护工具比如SupervisorGod,不同的是Supersior是通过自己的daemon,fork出子进程的方式,通过监控子进程的方式获取进程状态而Ambari是通过pid或者端口监控的方式获取进程状态。

五 相关链接
WIKI: https://cwiki.apache.org/confluence/display/AMBARI/Recovery%3A+auto+start+components

Ambari Auto Start(进程自动拉起)的更多相关文章

  1. 通过/etc/rc.local实现开机自动拉起服务

    添加服务到/etc/rc.local 如自动拉起apache服务: /etc/rc.local: #!/bin/sh # # This script will be executed *after* ...

  2. 8.3 Customizing Git - Git Hooks 钩子 自动拉取 自动部署 提交工作流钩子,电子邮件工作流钩子和其他钩子

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  3. python自动拉取备份压缩包并删除3天前的旧备份

    业务场景,异地机房自动拉取已备份好的tar.gz数据库压缩包,并且只保留3天内的压缩包文件,用python实现 #!/usr/bin/env python import requests,time,o ...

  4. [ci] 构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码.

    构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码. 拉取gitlab代码库: jenkins安装git插件 配置gitlab服务器和jenkins服务器身份互信 jenkin ...

  5. CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放 《CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放》来自张戈博客

    张戈博客很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了.博客从此走上了经常被人拿来练手的不归之路. 当然,还是有不少朋友在生产环境使用,并且会留言询问相关问题.根据这些 ...

  6. jenkin+Git子模块自动拉取代码

    jenkins+Git子模块自动拉取代码 添加Git子模块 先克隆想要添加子模块的仓库git clone ssh://git@ip:port/user/project.git,这个是主目录. 进入仓库 ...

  7. jenkins实现git自动拉取代码时替换配置文件

    jenkins实现从git上自动拉取源代码——>自动编译——>发布到测试服务器——>验证测试,这个大家应该都知道,但是关于源代码里的配置文件,可能就会有点头疼了, 一般测试都会自己的 ...

  8. xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  9. FakeTaobaoDeepLink - 复制淘宝deeplink来拦截淘宝广告的自动拉起

    Fake Taobao Deeplink 复制 ** com.taobao.tao.welcome.Welcome ** 的intent-filter来拦截误触广告后自动拉起淘宝app 完整工程 Gi ...

随机推荐

  1. 苹果 AR 新专利马上登陆 Facetime|Facebook 要用 VR 玩直播

    附上VR技术福利视频 链接: https://pan.baidu.com/s/1boGGVs7 密码: viy8 点击关注有更多VR技术资源哦 苹果 AR 新专利马上登陆 Facetime ,使用光场 ...

  2. 使用 Proxy + Promise 实现 依赖收集

    (深入浅出Vue基于“依赖收集”的响应式原理) ,这篇文章讲的是通过一个通俗易懂例子,介绍了 如何用Object.defineProperty 实现的“依赖收集”的原理.Object.definePr ...

  3. win10 uwp 获得元素绝对坐标

    有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用. 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标. 首先需要获得元素,如果没有获得元素,那么如何得到他的坐标? ...

  4. PPT的应用

    ppt是Office中一个制作演示文稿的一个办公软件使阐述过程简明而又清晰,轻松又丰富详实,从而有效表达自己以及与他人沟通,所创建的文件被称为电子演示文稿,其扩展名为.PPT.一个演示文稿由若干张电子 ...

  5. 阿里巴巴Java开发规约插件p3c详细教程及使用感受

    阿里巴巴Java开发手册 在进入正题介绍这款插件之前,首先来谈一下<阿里巴巴Java开发手册>,2017年年初,首次公开的阿里官方Java代码规范标准手册可以说是引起了全民(IT界)代码规 ...

  6. Locust性能测试框架,从入门到精通

    1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 主要特点如下: 使用普通的P ...

  7. 启动tomcat爆错 the JRE could not be found

    启动报错,如下图: 之前更改了了一个较低的jdk的版本看了看一个项目的代码,不知所云,然后再改回来, 混乱之中只要启动Tomcat就出现这种错误,还是无法找到JRE,最后如此解决: 在Windows- ...

  8. js获取当前页面的URL并且截取?之后的数据,返回json

    js获取当前页面的URL并且截取'?'之后的数据,返回json格式的数据 最近想要把学到的东西整理一下,以后方便查找,也是一种自我累积,如果有错误或者更好的,欢迎提出! 这篇文档主要是写关于获取页面的 ...

  9. 【Telerik控件学习】-建立自己的图形编辑工具(Diagram)

    Telerik提供了RadDiagram控件,用于图形元素的旋转,拖拽和缩放.更重要的是,它还拓展了许多绑定的命令(复制,剪切,粘贴,回退等等). 我们可以用来组织自己的图形编辑工具. Step1.定 ...

  10. 使用gitbook

    前面的话 gitbook功能强大,可以自动实现搜索及翻页等功能,上手容易,用markdown书写即可,且可以自动生成响应式网站.本文将详细介绍如何使用gitbook 安装 1.使用npm全局安装git ...