作者简介

运小宇    百度高级研发工程师

负责基础运维组件相关开发工作,致力于运维基础设施的建设,夙兴夜寐,只为提高设备操作的便利性,一桥飞架南北,天堑变通途。

前文回顾

今天我们来聊一个很基础的话题:如何执行一条命令

干货概览

书接前文,在上一篇文章中我们介绍了大规模命令执行的意义以及所面对的问题和困难,简单介绍了百度集群控制系统(Cluster Control System,以下简称CCS系统)通过构建两级数据模型四级调度模型三级代理执行的方式解决了这些问题,在本篇文章中,我们将续接前文,继续对CCS系统的设计实现进行详细剖析。

两级数据模型

设计考量

回顾前文,在面临的需求中我们提到,需要在大规模的服务器上执行命令并且能够灵活控制。为了满足这样的需求,建立数据模型时,只有执行信息是不够的,还要有控制信息,如路由、并发度、暂停点等,两者组合在一起,构成了CCS系统中的数据模型。

控制信息

控制信息包括命令传递所需的“路由”信息和调度过程的控制信息,如下:

  • 目标机器:命令执行的目标服务器列表,可以是IP,也可以是Hostname。

  • 并发程度:分组并发执行时每组的机器数量,用于控制分组执行,避免系统升级时所有服务器同时升级造成业务中断。

  • 暂停节点:指定执行到第几台服务器时暂停执行,方便先操作几台服务器并确认没问题后再继续执行,若有问题也可将问题控制在小范围内。

执行信息

执行信息是指命令到达目标机器后开始执行时所必需的信息,如下:

  • 认证信息:标示执行者是谁的信息,用来确认执行者的合法性,如不合法则拒绝执行。

  • 鉴权信息:标示执行者所持有的权限,如果权限不够也要拒绝执行。

  • 命令信息:真正要在目标机执行的命令,也是数据模型这个包装盒中最有价值的信息。

除去控制信息和执行信息这两个关键信息外,还有一些辅助信息如任务类型、任务创建/结束时间、任务超时时间等也是数据模型实际应用中的必要信息,但并非关键,不再详述。

四级调度模型

设计考量

在调度模型设计上,考虑到服务器的地域分布特点、任务调度与业务的强相关性、单机环境的复杂性以及传输过程的稳定性要求,我们将传输模型分为四层,自顶向下分别是统一接入层、分级调度层、机房汇聚层、代理执行层,分别负责全局业务接入、按业务等级的分级调度、机房内服务器的任务管理、单机层面的任务执行。同时为保障可用性,每一层均要保证足够的冗余度(通过无状态集群/多机热备实现)与数据容灾性(通过在每层设置缓存与持久层实现)。

各层介绍
  • 统一接入层:统一接入层的目的之一是为用户提供一致的接入体验,要达到这个目的有很多种方案,目前在CCS系统中,是通过VIP的方式实现。统一接入层的目的之二是通过Quota与Block对用户流量进行控制,在实现用户分账的同时,避免突发流量将CCS系统后端冲垮。

  • 分级调度层:分级调度层是任务调度的核心层,起到承上启下的作用,在通信上各节点与机房执行层建立逻辑上的Full-Mesh连接,如图1所示,使每一个节点都有能力将命令送达百度内部的每一台服务器。这里还要注意分级调度层中的分级概念,分级通过区分不同业务的重要程度,独占或混用此层的某个调度节点,而通过各节点之间互相隔离,可做到重要业务间互不干扰。通过设立分级调度层,在保证全网调度能力的同时,可以有效区分不同等级的业务,使业务间相互隔离,互不干扰。

图1  分级调度层与机房汇聚层的Full-Mesh连接

  • 机房汇聚层:在网络基础设施中,有网络汇聚层的概念,起到本地流量汇聚的作用。机房汇聚层与之类似,负责本机房所有机器的状态看护、命令下发、结果收集。机房汇聚层通过心跳消息(由各服务器上的执行代理定时上报)与下层进行通信,心跳消息有两方面的作用,一是保活,二是命令批量下发与结果回收,业务信息借助周期性的心跳消息搭车传递,既减少了消息量,又避免了复杂的实现逻辑。通过建立机房汇聚层,将一个机房内的机器统一管理,避免了内部大量的心跳消息传播到其他机房,在保障通信可靠性的同时还可减少公网带宽占用。

图2  机房汇聚层通过心跳与执行代理层通信

  • 执行代理层:这里是命令传输的终点,也是命令执行的起点,命令信息通过部署在服务器上的执行客户端(以下简称CCS-Agent)与机房汇聚之间的一次次心跳被拉取到目标机器,在通信层面上来说,命令信息到这里就结束了,但执行代理的功能不止于此,相关内容在下一节中详细介绍。

三级代理执行

设计考量

在单机执行方案的设计上,最重要的问题就是执行端的稳定性,万分之一发生率的问题,部署在几十万台服务器上后也会对业务造成严重影响。为了实现这样的超稳态,我们设计了如图3所示的单机执行架构,将最重要的命令执行逻辑从CCS-Agent中分离出来,组成独立的通用执行层,在CCS-Agent中只保留认证、鉴权、备份、命令组装这些非执行逻辑。同时为了保证通用执行层各用户进程间的异常隔离,我们又将执行层分为执行代理进程执行端进程用户进程三部分,每一个执行端进程与一个用户进程对应,负责用户进程的启停控制与结果收集。

图3  执行代理层

详细介绍
  • CCS-Agent:在执行层面,如前所述,主要负责用户认证/用户鉴权/数据备份/命令组装等命令执行前的准备工作,在前文中有读者对认证与鉴权提出疑问,这两个功能也是CCS-Agent最主要的功能,这里着重讲一下。CCS系统有着严格的认证/鉴权机制,毕竟在线上服务器执行命令是一项高危操作。在CCS系统中,用户的权限控制不是基于Linux系统的账号系统,而是基于身份与角色,如zhangsan想要在机器A上执行一条命令,当命令下发到目标机器时,CCS-Agent就会首先对zhangsan这个用户进行身份认证,确认身份的合法性,如身份合法则还要对此身份所属的角色(如RD、QA、OP等,RD与QA具有线上系统的查看权限,OP具有变更权限)进行验证,只有身份合法,角色适当,才可以执行相应的命令。

  • 通用执行层:如前所述,通用执行层分为执行代理进程、执行端进程和用户进程,除了可以隔离用户进程异常,带来稳定性的提升外,还有一个好处——无损升级。当执行代理需要升级时,可以将执行代理进程直接停止,由于此时已经执行的任务由执行端进程控制,结果可以正常回传,不受影响,已经下发到执行代理还没来得及执行的任务,在执行代理重新启动后CCS-Agent会重新下发,也不会受影响。当执行端需要升级时则更简单,可以直接升级执行端,升级完成以后,旧的执行端会继续执行到结束,新的任务则会启动新的执行端。

异常处理

在系统运行过程中,免不了会发生各种问题,此处我们将设计与实践中遇到的一些问题以及相应解决方案拿出来与大家一起探讨。

容量不足

自CCS系统上线以来,由容量问题引起的系统异常是最多的,当前的CCS系统特性有很多都是以前的经验与教训的总结,最突出的就是统一接入层的加入和分级调度理念的引入。

统一接入层除了给用户提供一致的体验外,更重要的一层意义是统一分级Quota与Block,通过设置分级流量配额和阈值,可以给不同用户不同的访问配额,在必要时还可以暂停某个用户的任务下发,避免CCS系统后端因突发流量被拖垮。

如果说统一接入层的加入消除了突发任务的影响,那么分级调度理念的引入则保障了重要任务不受影响。未引入分级调度之前,不同重要等级的任务混合在一起调度,曾经发生过因某一任务数据结构异常引起整个调度节点挂死的惨案。在这之后,通过对调度节点分级,对任务分级并将任务从统一接入层分级导流的方式,解决了重要任务得不到保障的问题。

网络抖动

网络抖动对CCS系统最直接的影响就是丢消息。在任务调度过程中,单纯的Client端拉取执行进度消息与Server端主动推送执行进度消息都有各自的弊端,前者可靠性高但时延不好控制,后者时延低但稳定性不足。为了保障CCS系统的高可用性,在通信模型的层间采用推拉结合的方式,Client端拉取信息时通过降低拉取频率降低性能消耗,此时的时延上升由Server端主动推送来弥补。

单机执行异常

在统一执行代理没有诞生的史前时代,命令单机执行过程中我们遇到过数不清的异常,典型的三方软件Bug型(如Python Bug导致的程序hung住),资源耗尽型(操作系统PID耗尽导致的新命令无法执行),操作系统Bug型(如内核Bug导致的服务器突然重启),不可抗力型(如电力故障导致的批量服务器断电等情况)等。

为了保证异常不丢任务、异常快速恢复,我们在设计中主要遵循了以下两点:

  • 备份优先:执行端收到任务的第一步不是考虑如何执行,而是考虑如何备份,即使后续执行端出现异常,也可以用备份信息重新执行。

  • 单线程优先:单线程优先主要是为了使执行端的逻辑尽量简化,避免复杂的多线程操作,毕竟越简单越容易保证稳定,这也是执行端使用epoll执行代理进程+多执行端进程模式的主要原因。

遵循以上原则设计和实现的统一执行层,在百度内部的所有服务器上部署,在长时间的运行中体现出了极高的稳定性。

总结

通过构建CCS系统,我们解决了命令在大量服务器上规模执行的问题,目前已在百度内部广泛使用。但回顾从设计到上线运行至今的用户反馈及故障处理,还有很多不完美的地方,如命令传输的时效性现在只达到了秒级,目前我们正在尝试优化,多机热备方案是否必要,我们也在着手分析,希望一段时间以后,我们可以拿出更优的方案与大家分享。

相关文章

今天我们来聊一个很基础的话题:如何执行一条命令

↓↓↓ 点击"阅读原文" 【了解更多精彩内容】

今天我们来聊一个很高级的话题:如何设计一个大规模远程命令执行系统相关推荐

  1. 一个很小的图标需要另一个HTTP请求是不是很愚蠢? 如何将收藏夹图标放到精灵中?

    本文翻译自:Isn't it silly that a tiny favicon requires yet another HTTP request? How can I put the favico ...

  2. Java黑皮书课后题第10章:***10.8(金融:Tax类)编程练习题8.12使用数组编写一个计算税款的程序。设计一个名为Tax类,该类包含下面的实例数据域

    ***10.8(金融:Tax类)编程练习题8.12使用数组编写一个计算税款的程序.设计一个名为Tax类,该类包含下面的实例数据域 题目 程序解释 代码 Test8.java Test8_Tax.jav ...

  3. c++继承与派生(设计一个圆类Circle和一个桌子类Table,另设计一个圆桌类Roundtable,它是前面两个类的派生类,要求编写测试程序给出输出一个圆桌的高度、面积和颜色等数据。)

    #设计一个圆类Circle和一个桌子类Table,另设计一个圆桌类Roundtable,它是前面两个类的派生类,要求编写测试程序给出输出一个圆桌的高度.面积和颜色等数据. #include<io ...

  4. 一个有趣的问题 : 如何设计一个线程池

    理解Java并发工具包线程池的设计 深度解读 java 线程池设计思想及源码实现 分布式锁unlock 问题产生原因分析: Step 1 :线程A先上同一个锁(Key)(20秒), 然后执行耗时业务, ...

  5. python设计一个学生类求最高分_设计一个学生类班级类

    第一题 设计一个学生类 属性:姓名.学号.年龄.成绩 设计一个班级类要求:实现向班级中添加学生.删除学生.查看学生.按照指定条件排序 属性:班级代号,所有学生 需要使用 calss, __int__, ...

  6. 如何抓取一个网站的分页_如何设计一个吸引人的网站

    做网站的好处就是能够利用网站来展示推广产品,提升公司形象,为公司的发展提供有效的平台,还能扩大销售渠道.但是,想要建设一个吸引人的网站是要求非常高的,今天八爪网就来教大家如何设计一个吸引人的网站,一起 ...

  7. java设计一个立方体类box_实例1: 设计一个立方体类Box,定义三个属性,分别是长,宽,高。定义二个方法,分别计算并输出立方体的体积和表面积。_学小易找答案...

    [填空题]表达式 list(filter(lambda x:x>2, [0,1,2,3,0,0])) 的值为 _________ . [填空题]表达式 len(' 中国 '.encode('ut ...

  8. java设计一个user类_关于JAVA设计一个用户类

    关于JAVA设计一个用户类 关注:152  答案:2  mip版 解决时间 2021-02-02 05:51 提问者安分守己的小青春 2021-02-02 02:23 设计一个用户类,该类有用户编号. ...

  9. 用java设计一个动物声音 模拟器,Java语言 设计一个动物声音“模拟器”(用接口实现)...

    设计一个动物声音"模拟器",希望模拟器可以模拟许多动物的叫声,要求如下. 编写接口Animal Animal接口有两个抽象方法cry()和getAnimalName(),即要求实现 ...

  10. java请设计一个一百亿的计算机,请设计一个一百亿的计算器

    A:你好,卧室是人们休息的主要处所,卧室布置得好坏,直接影响到人们的生活.工作和学习,所以卧室也是家庭装修的设计重点之一.卧室设计时要注重实用,其次才是装饰.具体应把握以下原则: 1.要保证私密性.私 ...

最新文章

  1. Linux sendmail发送邮件失败诊断案例(一)
  2. Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)
  3. 爬虫好学吗python-小白python学到什么程度可以学习网络爬虫? ?
  4. 崔巍 计算机考研怎么样,中国科学院大学研究生导师教师师资介绍简介-崔巍
  5. 网易云轻舟微服务深度解读:基于开源,强于开源
  6. linux怎么下载yum包,Linux下yum下载依赖包
  7. 字典类型处理函数及方法实例解析
  8. i5 11300h和R5 5600H 参数对比哪个好
  9. django内置服务器
  10. block传值 链接
  11. nginx学习文档之一 安装nginx-Linux下安装nginx
  12. python的前端和后端_前端与后端的数据交互(jquery ajax+python flask)
  13. mysql 执行计划 改变_数据量增加导致mysql执行计划改变解决_MySQL
  14. [渝粤教育] 西南科技大学 交通运输经济 在线考试复习资料
  15. php的一些编码问题
  16. 会议OA之我的审批(查询签字)
  17. 第二章 信息化规划与组织
  18. Android上图片文字识别
  19. GStreamer基础教程10——GStreamer工具
  20. 微信小程序使用前置摄像头拍照

热门文章

  1. 产品读书《自控力:斯坦福大学最受欢迎的心理学课程》
  2. 肿瘤基因组变异相关概念
  3. AJAX学习(一)AJAX基础
  4. 解决网页上内容不能复制的几种方法
  5. SRGAN——使用与超分辨率重建的GAN
  6. gateway中的局部过滤器_SpringCloud系列Gateway:过滤器总结
  7. 国内/国外常见搜索引擎
  8. Java ques: Unknown initial character set index ‘255‘ received from server. Initial client character
  9. 来自网页的消息服务器不能创建对象,ActiveXObject(Excel.application)引发Automation 服务器不能创建对象...
  10. 证券分析软件测试面试题,光大证券面试经验