commandScript详解[三]
# 流程简述:21 步全链路解读
# Java端流程(服务请求到任务调度)
Ambari Server 端将一次 service_check 请求,从 API 接入直至下发到调度与命令派发,整体可以分为如下21步。每一步均是核心处理节点:
步骤 | 方法名 | 操作 | 说明 |
---|---|---|---|
1 | ClusterService.getRequestHandler() | 处理 service_check 请求 | 获取请求处理器,准备后续任务分发。 |
2 | RequestService.createRequests() | 创建请求对象 | 生成新的请求实例,表征一次服务检查请求。 |
3 | BaseRequest.process() | 处理请求 | 进入 CreateHandler.handleRequest() ,开启处理流程。 |
4 | CreateHandler.handleRequest() | 创建并处理请求 | 生成请求后准备持久化。 |
5 | BaseManagementHandler.persist() | 持久化请求 | 调用 PersistenceManagerImpl.create() ,保存请求到存储。 |
6 | PersistenceManagerImpl.create() | 持久化资源 | 数据入库,确保请求不会丢失。 |
7 | ClusterControllerImpl.createResources() | 创建资源 | 集群控制器根据请求内容准备所需资源。 |
8 | RequestResourceProvider.createResources() | 资源创建 | 执行实际的资源创建和调度。 |
9 | AmbariManagementControllerImpl.createAction() | 创建操作 | 生成操作计划并分配到各主机或组件。 |
10 | RequestStageContainer.persist() | 持久化阶段 | 保证各阶段任务持久、可追踪。 |
11 | ActionManager.sendActions() | 发送任务 | 写入数据库,待Agent领取。 |
12 | ActionManager.persistActions() | 持久化任务 | 任务落盘,便于失败恢复与重试。 |
13 | Scheduler.awake() | 唤醒调度器 | 调度器唤醒,准备分发任务。 |
14 | Scheduler.doWork() | 广播任务 | 向所有 Agent 广播新任务。 |
15 | agentCommandsPublisher.sendAgentCommand() | 发送命令 | 推送任务命令到 Agent。 |
16 | STOMPUpdatePublisher.publish() | 发布消息 | 通过 STOMP 协议下发到 Agent,服务端处理结束。 |
# Agent端流程(命令接收与执行)
Ambari Agent 端的执行链路,聚焦于命令的接收、解析、队列与最终执行:
步骤 | 方法名 | 操作 | 说明 |
---|---|---|---|
17 | CommandsEventListener.on_event() | 接收处理命令 | 监听到 STOMP 下发的命令消息,准备处理。 |
18 | ActionQueue.run() | 运行任务队列 | 管理待执行任务队列,调度下一步命令。 |
19 | ActionQueue.process_command() | 处理命令 | 解析服务器端命令,做参数适配。 |
20 | ActionQueue.execute_command() | 执行命令 | 实际执行已解析的操作命令。 |
21 | customServiceOrchestrator.runCommand() | 完成操作 | 最终运行命令,传入输出文件和重试参数,确保日志与健壮性。 |
# 图示流程(可直接引用于技术文档)
Java端链路:
ClusterService.getRequestHandler()
↓
RequestService.createRequests()
↓
BaseRequest.process()
↓
CreateHandler.handleRequest()
↓
BaseManagementHandler.persist()
↓
PersistenceManagerImpl.create()
↓
ClusterControllerImpl.createResources()
↓
RequestResourceProvider.createResources()
↓
AmbariManagementControllerImpl.createAction()
↓
RequestStageContainer.persist()
↓
ActionManager.sendActions()
↓
ActionManager.persistActions()
↓
Scheduler.awake()
↓
Scheduler.doWork()
↓
agentCommandsPublisher.sendAgentCommand()
↓
STOMPUpdatePublisher.publish()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Agent端链路:
CommandsEventListener.on_event()
↓
ActionQueue.run()
↓
ActionQueue.process_command()
↓
ActionQueue.execute_command()
↓
customServiceOrchestrator.runCommand()
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 端到端流程小结
一次 service_check 请求,在后端 API 被封装为请求对象,层层流转到请求队列并持久化,调度器激活并广播任务,经由 STOMP 下发到 Agent。 Agent 订阅到任务后,解包 JSON,适配参数,依次调度队列、处理并最终执行。执行过程中涉及输出文件生成、重试机制和执行日志归档,确保了分布式任务的可观测性与可靠性。
# 4. 最佳实践与技巧 💡
# 4.1 服务级别 vs 组件级别职责
- 服务级别:负责全局生命周期和集群健康,比如健康检查、批量重启等,跨节点、跨组件、强协作。
- 组件级别:聚焦单节点/单组件操作,如配置热更新、单节点进程控制等,粒度小、操作快速。
提示
健康检查这类全局行为必须归属于服务级别,而不是组件。
# 4.2 健康检查最佳实践
在
metainfo.xml
指定服务级commandScript
健康检查属于服务级责任,脚本和超时配置应如下设置:<!-- Redis 服务健康检查 --> <commandScript> <script>scripts/service_check.py</script> <scriptType>PYTHON</scriptType> <timeout>300</timeout> </commandScript>
1
2
3
4
5
6健康检查脚本规范 代码应逻辑分明,支持密码校验、可重试,易于维护:
# coding=utf-8 import time from resource_management.core.exceptions import Fail from resource_management.core.logger import Logger from resource_management.core.resources.system import Execute from resource_management.libraries.functions.format import format from resource_management.libraries.script.script import Script class RedisServiceCheck(Script): def service_check(self, env): """ 检查 Redis 集群健康,支持密码、重试等逻辑 """ import params env.set_params(params) redis_port = params.redis_port client_bin = params.client_bin redis_password = params.redis_password retries = 5 retry_delay = 5 self.check_redis_cluster(redis_port, client_bin, redis_password, retries, retry_delay) if __name__ == "__main__": RedisServiceCheck().execute()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24健康检查执行链 实际运维中,Ambari 通过如下命令触发 service_check:
/usr/bin/python /var/lib/ambari-agent/cache/stacks/BIGTOP/3.2.0/services/REDIS/package/scripts/redis_service_check.py SERVICE_CHECK ...
1由 Agent 通过发布订阅异步执行,检测结果实时反馈到服务端。
健康检查设计原则
- 健康检查是服务级责任,不应切分为组件级;
- 推荐实现重试机制,增强健壮性;
- 超时应合理设置,避免集群调度阻塞。
# 5. 总结与延伸学习 🚀
# 5.1 文章回顾
本篇围绕 Redis 服务健康检查案例,梳理了服务级与组件级 commandScript 分工、实际代码实现,以及 Ambari 执行链路全流程。你已经掌握:
- 服务级 vs 组件级如何分工与协作;
- 健康检查如何实现、配置、调用和回调;
- Ambari 如何端到端调度与执行脚本。