Ambari Auto Start(进程自动拉起)
文章作者: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
四 类似工具
进程的自动拉起也可以用进程守护工具比如Supervisor, God,不同的是Supersior是通过自己的daemon,fork出子进程的方式,通过监控子进程的方式获取进程状态而Ambari是通过pid或者端口监控的方式获取进程状态。
五 相关链接
WIKI: https://cwiki.apache.org/confluence/display/AMBARI/Recovery%3A+auto+start+components
Ambari Auto Start(进程自动拉起)的更多相关文章
- 通过/etc/rc.local实现开机自动拉起服务
添加服务到/etc/rc.local 如自动拉起apache服务: /etc/rc.local: #!/bin/sh # # This script will be executed *after* ...
- 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 ...
- python自动拉取备份压缩包并删除3天前的旧备份
业务场景,异地机房自动拉取已备份好的tar.gz数据库压缩包,并且只保留3天内的压缩包文件,用python实现 #!/usr/bin/env python import requests,time,o ...
- [ci] 构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码.
构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码. 拉取gitlab代码库: jenkins安装git插件 配置gitlab服务器和jenkins服务器身份互信 jenkin ...
- CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放 《CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放》来自张戈博客
张戈博客很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了.博客从此走上了经常被人拿来练手的不归之路. 当然,还是有不少朋友在生产环境使用,并且会留言询问相关问题.根据这些 ...
- jenkin+Git子模块自动拉取代码
jenkins+Git子模块自动拉取代码 添加Git子模块 先克隆想要添加子模块的仓库git clone ssh://git@ip:port/user/project.git,这个是主目录. 进入仓库 ...
- jenkins实现git自动拉取代码时替换配置文件
jenkins实现从git上自动拉取源代码——>自动编译——>发布到测试服务器——>验证测试,这个大家应该都知道,但是关于源代码里的配置文件,可能就会有点头疼了, 一般测试都会自己的 ...
- xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- FakeTaobaoDeepLink - 复制淘宝deeplink来拦截淘宝广告的自动拉起
Fake Taobao Deeplink 复制 ** com.taobao.tao.welcome.Welcome ** 的intent-filter来拦截误触广告后自动拉起淘宝app 完整工程 Gi ...
随机推荐
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- JAVA NIO 主要概念
NIO有三个主要概念: buffer channel selector channel间通过buffer通信,channel在selector注册后,可以由selector管理,实现非阻塞编程 buf ...
- Python学习笔记(五)--Python数据类型-数字及字符串
Python数据类型:123和'123'一样吗?>>> 123=='123'False>>> type(123)<type 'int'>>> ...
- C#方法中参数ref和out的解析
一.C#方法中参数类型 有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照. 二.C#方法中的参数 1.值参数 使用值参数,通过复制实参的值到形参的方式把数据传递 ...
- JAVA基础知识总结:十
一.抽象类 1.定义 当多个类中出现相同功能,但是功能主体是不同的,这是可以进行向上抽取的,只抽取功能的定义部分,使用抽象类实现 抽象类的存在就是为了被继承 2.使用 abstract 3.抽象类的特 ...
- 【工具】Spring项目转化Spring Web项目插件
前言 源于前一篇博文中提到,将Spring项目转化为Spring Web项目,发现添加项目文件和修改pom.xml文件等都是手动完成的,心想着开发一个Idea插件来自动化完成上面的过程,实现一键转化. ...
- 四、MVC简介
一.高内聚.低耦合 大学的时候,上过一门叫<软件工程>的课程,课程中讲到了耦合,解耦等相关的词汇,当时很懵懂,不解其意. 耦合:是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影 ...
- css是如何实现在页面文字不换行、自动换行、强制换行的
强制不换行 div{ white-space:nowrap; } 自动换行 div{ word-wrap: break-word; word-break: normal; } 强制英文单词断行 div ...
- Spring框架学习之依赖注入
Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台.单从Spring的本身来说,它贯穿着整个表现 ...
- hdu1285 确定比赛名次(拓扑排序)
有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...