[转帖]任务分发系统 -Qcmd-http 详解

任务,分发,系统,qcmd,http,详解 · 浏览次数 : 0

小编点评

## 360 云平台 Qcmd 任务分发系统概述 Qcmd 是 360 云平台底层的命令执行系统,为了让 Qcmd 能够更好的为业务提供服务,我们在 Qcmd 的上层封装了一层 Qcmd-http 任务分发系统,Qcmd-http 系统同样采用 Golang 编写。 **主要功能:** * 实现 qcmd 的集群分布式,维护 qcmd 集群的高可用。 * 支持更复杂的任务类型以满足复杂的业务场景。 * 将业务与底层的 qcmd 彻底解耦。 **主要组件:** * **minion:** 奴才,最终执行任务的主机。 * **master:** 主机,接收业务方任务请求,下发给 minion 主机执行,并收集 minion 执行结果,将结果反馈给业务方的主机。 * **集群:** 为了维护系统的高可用,通常我们部署在 2 台主机上,两台 master 主机以及他们下面连接的 minion,称它为一个集群,具体集群的状态以及工作机制,稍后会有详细地介绍。 **任务类型:** Qcmd-http 支持了以下 4 种不同类型的任务: * **单任务-串行阻塞:** 比如你要在 minion-01,minon-02,minion-03 三台主机上执行命令 hostname,但是你想让 minion-01 主机先执行,如果 minion-01 主机执行成功了,再执行 minion-02 主机,如果 minion-01 主机执行失败了,那么任务就终止了。 * **单任务-串行非阻塞:** 与单任务的串行阻塞的原理相似,只不过当 minion-01 主机执行失败时,任务会继续往下执行,并不会终止,直到所有的 minion 执行完。 * **单任务-并行:** 线上业务的串行单任务场景并不多,大部分是并行任务。 * **组任务:** 当业务的任务不是简单的执行一行命令或者是一个脚本,而是很复杂的一个过程,那么业务可以把整个任务包装成一个组任务,把其中的每个步骤当成一个子任务。 **状态更新:** * 单任务的状态,单任务的状态是根据该任务下的 minion 的状态和单任务的类型来更新的。 * 组任务的状态,组任务的状态是根据其子任务的状态来更新的。 **回调:** * 单任务执行完会返回给调用方一个 job_id,组任务执行完会返回一个 group_id,qcmd-http 提供查询接口来支持查看任务的执行结果,同时,也支持任务回调的方式,业务在调用执行任务的接口时,可以同时指定一个回调地址,当任务执行结束,成功或者失败都会回调指定的回调地址通知对方任务的执行结果。 **Qcmd 任务系统整体设计:** * 总结最初设计 qcmd-http 的主要目的是将业务与底层的 qcmd 彻底解耦,让整个系统结构更清晰,责任也更明确。 *上线至今,qcmd-http 已经提供服务一年多了,目前执行过的单任务总数达到 50 多万,组任务数 20 多万。

正文

https://www.infoq.cn/article/jSyxjsDCF2lrkt8XeHoj

 

 

Qcmd 是 360 云平台底层的命令执行系统,为了让 Qcmd 能够更好的为业务提供服务,我们在 Qcmd 的上层封装了一层 Qcmd-http 任务分发系统,Qcmd-http 系统同样采用 Golang 编写。它主要负责以下几个事情:

 

1.实现 qcmd 的集群分布式,维护 qcmd 集群的高可用。

 

2.支持更复杂的任务类型以满足复杂的业务场景。

 

3.将业务与底层的 qcmd 彻底解耦。

 

1 360 云平台任务执行的流程图

首先,让我们在 360 云平台上,从页面的视角来观察一下整个执行的过程吧。

 

1.选择脚本,选择要执行的主机,执行任务。

 

 

注:zjl.sh 脚本是我随手写的,里面执行的是查看当前主机名的命令

 

2.任务的状态会经过处理中到执行成功,在任何时候,你都可以点击查看按钮来观察任务执行的当前状态以及每个 minion 的任务执行结果。

 

 

 

 

2 名词解释

1.minion,直译过来是奴才的意思,表示最终要执行任务的主机。比如你要执行一个 hostname 的命令,最终是在 minion 主机上执行的。

 

2.master,直译过来是主人的意思,表示接收业务方任务请求,下发给 minion 主机执行,并收集 minion 执行结果,将结果反馈给业务方的主机。

 

3.集群,为了维护系统的高可用,通常我们不会将 master 的系统只部署在一台机器上,实际上,我们目前是部署在 2 台主机上,这两台 master 主机以及他们下面连接的 minion,我们称它为一个集群,具体集群的状态以及工作机制,稍后会有详细地介绍。

 

4.分布式,如果只有一个集群,当 minion 的主机数据日渐增多时,master 的压力会比较大,而且北京的 master 给上海的 minion 下发任务,理论上肯定不如北京的 master 下发到北京的 minion 来的快,所以为了高性能并且去中心化,我们以机房为维度搭建了多个集群, 以达到不同的集群服务于不同的 minion 的作用,详见下面的分布式集群拓扑。

 

3 分布式集群

1.分布式集群拓扑

 

 

2.集群拓扑

 

 

4 集群的状态

  1. master 的状态

  2. master 的结构是一主一从(也可以是一主多从),minion 与集群中的所有 master 都保持着连接,只有主 master 提供对外服务,qcmd-http 系统在数据库维护着 master 与集群的关系,以及 master 的主从状态,一旦主 master 出现故障,可以将从 master 与主 master 的角色互换,新的主 master 会继续提供对外的服务。

  3. minion 的状态

  4. minion 的状态也有两种,up 和 down,主 master 每隔一段时间会给已经通过认证的 minion 主机发送 test-ping 心跳包,来获取当前 minion 的存活状态,如果 minion 主机 down 掉了,会通知 qcmd-http 分发系统,分发系统在数据库中将此 minion 的状态置为 down。

 

5 任务的类型

线上业务的任务不只是执行 hostname 这样简单的一条命令,为了满足绝大多数的业务使用场景,qcmd-http 分发系统支持了 4 种不同类型的任务

 

  1. 单任务-串行阻塞,比如你要在 minion-01,minon-02,minion-03 三台主机上执行命令 hostname,但是你想让 minion-01 主机先执行,如果 minion-01 主机执行成功了,再执行 minion-02 主机,如果 minion-01 主机执行失败了,那么任务就终止了。

 

 

  1. 单任务-串行非阻塞,与单任务的串行阻塞的原理相似,只不过当 minion-01 主机执行失败时,任务会继续往下执行,并不会终止,直到所有的 minion 执行完。

 

 

  1. 单任务-并行,线上业务的串行单任务场景并不多,大部分是并行任务。比如你想要同时在 minion-01,minion-02,minion-03 三台主机上执行任务,那么并行的单任务就比较合适了。

 

 

  1. 组任务-串行,有时候业务的任务并不是简单的执行一行命令或者是一个脚本,而是很复杂的一个过程。拿我们 mysql 的实例创建来说,它需要初始化主,初始化从,申请 lvs,初始化 failover 等等一系列的子任务,那么业务可以把整个 mysql 实例的创建包装成一个组任务,把其中的每个步骤当成一个子任务。整个组任务是串行执行的,只有当上一个子任务执行成功后,才执行下一个子任务,如果子任务执行失败,组任务就会终止。

 

 

6 任务的状态

  1. 主机的执行状态,不管是什么任务类型,最终都会落在 minion 主机上去执行,任务刚创建时,minion 处理等待执行的状态,master 收到任务请求后,会通知 minion 执行任务,并通知 qcmd-http 将 minion 的状态标记为处理中,minion 执行完后,将执行结果返回给 master ,master 再通知 qcmd-http 将 minion 的状态标记为成功或者失败。

  2. 单任务的状态,单任务的状态是根据该任务下的 minion 的状态和单任务的类型来更新的,分为等待处理,处理中,成功,失败和超时等几个状态。

  3. 组任务的状态,组任务的状态是根据其子任务的状态来更新的,组任务分为等待处理,处理中,成功,失败和超时等几个状态。

 

7 任务的回调

由于所有的任务都是异步执行的,单任务执行完会返回给调用方一个 job_id,组任务执行完会返回一个 group_id,qcmd-http 分发系统提供查询接口来支持查看任务的执行结果,同时,也支持任务回调的方式,业务在调用执行任务的接口时,可以同时指定一个回调地址,当任务执行结束,成功或者失败都会回调指定的回调地址通知对方任务的执行结果。

 

8 Qcmd 任务系统整体设计

 

总结

最初设计 qcmd-http 的主要目的是将业务与底层的 qcmd 彻底解耦,让整个系统结构更清晰,责任也更明确。

 

上线至今,qcmd-http 已经提供服务一年多了,目前执行过的单任务总数达到 50 多万,组任务数 20 多万。

 

本文转载自公众号 360 云计算(ID:hulktalk)。

 

与[转帖]任务分发系统 -Qcmd-http 详解相似的内容:

[转帖]Linux性能优化(十)——CPU性能分析工具

Linux性能优化(十)——CPU性能分析工具 https://blog.51cto.com/u_9291927/2594169 一、CPU性能指标 1、CPU使用率 CPU使用率是最常见的一个性能指标,描述了非空闲时间占总CPU 时间的百分比,根据CPU上运行任务的不同,分为用户CPU、系统CPU

[转帖]开发成长之路(21)-- 不可不知的操作系统知识(1)

https://cloud.tencent.com/developer/article/1879252?areaSource=&traceId= 文章目录 知识框图 操作系统的硬件环境 计算机系统的层次结构 操作系统主要作用 多道程序设计的基本概念 分时系统 实时系统 实时任务的类型 实时系统与分时

【转帖】虚拟化与云计算技术硬核内幕

这种将物理硬件分配给多个使用者的技术,叫做“时分复用”。计算机操作系统的任务调度模块,实质上提供的就是将CPU以“时分复用”的方式给不同任务使用的机制。 那么,如果在虚拟化系统中,也利用时分复用机制,将一个物理CPU或HT分配给多个虚拟机使用,就可以让多个虚拟机共用1个物理HT,也就是在虚拟机操作系

[转帖]linux top命令详解

一.top简介 top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。在Linux操作系统中,top是使用最频繁,也是比较全的一个命令。Top命令类似于Windows系统的任务管理器工具。它对于所有正在运行的进行和系统负荷提供不断更新的概览信息,

[转帖]通过实战理解CPU上下文切换

Linux是一个多任务的操作系统,可以支持远大于CPU数量的任务同时运行,但是我们都知道这其实是一个错觉,真正是系统在很短的时间内将CPU轮流分配给各个进程,给用户造成多任务同时运行的错觉。所以这就是有一个问题,在每次运行进程之前CPU都需要知道进程从哪里加载、从哪里运行,也就是说需要系统提前帮它设

[转帖]Linux 监测服务心跳、服务重启策略

文章目录 前言背景一、curl服务可用验证二、服务探测脚本三、配置系统定时任务四、Linux特殊字符转义总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、 提示:以下是本篇文章正文内容,下面案例可供参考 背景 当服务假死情况下,导致服务不可用,一时间定位不到服务假死原因,可以采用

[转帖]疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?

疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换。 linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将CPU轮流分配给他们,造成多任务同时运

[转帖]RabbitMQ学习笔记03:Work Queues

参考资料:RabbitMQ tutorial - Work Queues — RabbitMQ 前言 这篇文章我们会创建一个Work Queue,它会在多个worker(即消费者 consumer)中分发耗时的任务。Work Queue也叫做Task Queue是为了避免当处理一个占用资源的任务时必

[转帖]硬盘监控和分析工具:Smartctl

Smartctl(S.M.A.R.T自监控,分析和报告技术)是类Unix下实施SMART任务命令行套件或工具,它用于打印SMART自检和错误日志,启用并禁用SMRAT自动检测,以及初始化设备自检。 Smartctl对于Linux物理服务器非常有用,在这些服务器上,可以智能的对磁盘进行错误检查,并将硬

[转帖]Cat导致内存不足原因分析

背景 线上几亿的数据在回刷的时候容器服务会出现OOM而重启,导致任务中断 内存泄露分析 jmap -histo pid 找出了有几十亿的java.lang.StackTraceElement对象,找不到被谁引用了 jmap -dump:format=b,file=heapdump.hprof pid