[转帖]任务分发系统 -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 详解相似的内容:

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

https://www.infoq.cn/article/jSyxjsDCF2lrkt8XeHoj Qcmd 是 360 云平台底层的命令执行系统,为了让 Qcmd 能够更好的为业务提供服务,我们在 Qcmd 的上层封装了一层 Qcmd-http 任务分发系统,Qcmd-http 系统同样采用 Go

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

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

[转帖]crontab 定时任务,免交互式编写任务文件

Gq赵关注IP属地: 山东 0.0722020.08.26 17:22:08字数 144阅读 626 正常添加定时任务是在命令行使用命令 crontab -ecrontab -e编写完的文件怎么找到?文件默认保存在/var/spool/cron/root 举例:查看编写好的定时任务[root@k-u

[转帖]crontab 定时任务,免交互式编写任务文件

https://www.jianshu.com/p/8eab68bcfc8e 正常添加定时任务是在命令行使用命令 crontab -ecrontab -e编写完的文件怎么找到?文件默认保存在/var/spool/cron/root 举例:查看编写好的定时任务[root@k-user ~]# cron

[转帖]调整Redis定期任务的执行频率

https://help.aliyun.com/document_detail/142171.html 通过修改hz参数的值,您可以调整Redis执行定期任务的频率,从而改变Redis清除过期key、清理超时连接的效率。 Redis定期任务与hz参数的关系 为了定期检测资源和服务状态并根据预定策略执

[转帖]Linux | crontab定时任务及开机自启项

本文总结如何使用 crontab 创建定时任务及开启自启项 1。 本文基于 CentOS 7.9 系统所写。 Updated: 2022 / 9 / 5 Linux | crontab定时任务及开机自启 安装查询开机自启项开机自启动 设置开机自启项crond语法区别/etc/crontabcront

[转帖]Windows Server 2012/2016/2019的任务管理器中不显示硬盘

https://www.jianshu.com/p/70f67a16e3cb 1.Win+R 打开CMD(不是管理员的话请以管理员身份打开) 2.输入以下命令 diskperf -y image.png

[转帖]RabbitMQ高可用性

RabbitMQ消息应答 执行一个任务可能需要花费几秒钟,你可能会担心如果一个消费者在执行任务过程中挂掉了。一旦RabbitMQ将消息分发给了消费者,就会从内存中删除。在这种情况下,如果正在执行任务的消费者宕机,会丢失正在处理的消息和分发给这个消费者但尚未处理的消息。 但是,我们不想丢失任何任务,如

[转帖]并发delete导致oracle死锁问题的解决

项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA

[转帖]Jmeter中线程组和setUP线程组、tearDown线程组的区别

JMETER: setUP线程组:在测试任务ThreadGroup 运行前先被运行。通常用在运行测试任务前,做初始化工作。例如建立数据库连接初始分化工作、用户登录tearDown线程组:在测试任务线程组运行结束后被运行。通常用来做清理测试脏数据、登出、关闭资源等工作。例如关闭数据库连接线程组: 执行