女主宣言

今天女主给大家带来的是360云平台的一项很重要的功能 —— Qcmd 任务分发系统。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

Qcmd 是360云平台底层的命令执行系统,详细介绍请查看《深度剖析360命令执行系统Qcmd》,为了让 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 的状态 
    master 的结构是一主一从(也可以是一主多从),minion 与集群中的所有 master 都保持着连接,只有主 master 提供对外服务,qcmd-http 系统在数据库维护着 master 与集群的关系,以及 master 的主从状态,一旦主master出现故障,可以将从 master 与主 master 的角色互换,新的主 master 会继续提供对外的服务。

  2. minion 的状态 
    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 主机执行失败了,那么任务就终止了。 

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

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

  4. 组任务-串行,有时候业务的任务并不是简单的执行一行命令或者是一个脚本,而是很复杂的一个过程。拿我们 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多万。

扫描下方
二维码
了解更多内容

任务分发系统-Qcmd-http详解相关推荐

  1. Linux系统守护进程详解

    文中有不对或者有不清楚的地方,请大家告诉我,谢谢!   Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, ...

  2. 支付系统整体架构详解

    2019独角兽企业重金招聘Python工程师标准>>> 支付系统整体架构详解 http://www.dataguru.cn/article-11263-1.html http://w ...

  3. IBM p5服务器上的虚拟 分享,IBMp5服务器系统虚拟技术详解

    <IBMp5服务器系统虚拟技术详解>由会员分享,可在线阅读,更多相关<IBMp5服务器系统虚拟技术详解(10页珍藏版)>请在人人文库网上搜索. 1.IBM p5 服务器系统虚拟 ...

  4. 分布式表格系统Google Bigtable详解

    分布式表格系统Google Bigtable详解 概述 Bigtable架构 数据分布 保证 副本位置与负载均衡 存储 表的分裂与合并 存储引擎 垃圾回收 总结 概述 bigtable系统由表格组成, ...

  5. 升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

    华为鸿蒙2.0系统升级了怎么退回EMUI11系统?很多用户升级了又不知道如何才能退回到原来的系统,下面就让老铁下载小编为大家带来,2.0系统升级退回EMUI11系统操作教程详解. 这次开启华为鸿蒙2. ...

  6. 必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法

    必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法 作者 梓沐啊_(KylinDemons) 版权声明 Copyright © 2021 KylinD ...

  7. 浅析嵌入式系统之uboot详解(5.1)—时钟分频

    bootloader详解目录-废铁是怎么产生价值的 浅析嵌入式系统之uboot详解(1)-板子上电后uboot做了什么 浅析嵌入式系统之uboot详解(2)-CPU工作模式 浅析嵌入式系统之uboot ...

  8. windows系统各进程详解

    系统各进程详解 下面列出的都是操作系统的进程,而不是程序的进程,记住这些进程并了解他们的工作原理,用途,能让我们对系统进程的理解提升一个级别. system Idle Process系统进程介绍 al ...

  9. 浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)

    bootloader详解目录-废铁是怎么产生价值的 浅析嵌入式系统之uboot详解(1)-板子上电后uboot做了什么 浅析嵌入式系统之uboot详解(2)-CPU工作模式 浅析嵌入式系统之uboot ...

  10. 浅析嵌入式系统之uboot详解(1)—板子上电后uboot做了什么

    bootloader详解目录-废铁是怎么产生价值的 浅析嵌入式系统之uboot详解(1)-板子上电后uboot做了什么 浅析嵌入式系统之uboot详解(2)-CPU工作模式 浅析嵌入式系统之uboot ...

最新文章

  1. Atitit MATLAB 图像处理attilax总结
  2. php exec和query,关于Go SQL中的Query、Exec和Prepare使用对比(附网络抓包)
  3. 2011年8月51CTO壁纸点评活动获奖名单【已结束】
  4. java数独最快解_[分享]数独的JAVA解法
  5. 2021年三大顶会时间序列论文代码整理
  6. 直播 | ACL 2021论文解读:低资源语言场景下的跨语言文本摘要
  7. Android studio aar包多层嵌套,Add library ‘Gradle: __local_aars__: 。。。unspecified@jar‘ to classpath
  8. 基于arm下的Linux控制,基于ARMuCLinux的网络控制系统设计与实现
  9. LeetCode 2087. 网格图中机器人回家的最小代价(脑筋急转弯)
  10. LeetCode 1024. 视频拼接(动态规划/贪心)
  11. Java基础之十年面试杂记
  12. 新浪微博广告投放展现形式、展现位置!微博推广广告有效果吗?
  13. 如何进行产品原型设计
  14. 扫地机器人漫谈(一):扫地机的形状
  15. uni-app省市区地址选择器
  16. 记录开发错误:ORA-00911: 无效字符
  17. Beagle填充之坑ERROR: REF field is not a sequence of A, C, T, G, or N characters at
  18. G - Ania and Minimizing(模拟)
  19. 系统功能模块接口文档
  20. linux 拍照的软件,六款优秀的Linux照片管理软件

热门文章

  1. javascript焦点图
  2. Eclipse开发Android常用快捷键
  3. web导入excel数据
  4. leetcodeT14-最长公共前缀(两种解法+图解)
  5. Maven史上最全总结
  6. Shiro源码分析之Subject和SecurityManager
  7. 《微信小程序开发入门精要》——第2章,第2.8节带边距的水平等间隔排列
  8. 南阳14(会场安排问题)
  9. windos下安装redis
  10. ListView和SlidingDrawer