查看原文
其他

自研可视化及并行自动化运维引擎

黄彪 新数科技 2024-04-15

在企业建设数据库云管理平台的过程中,数据库自动化运维和自助化服务是其中核心的功能。大部分数据库自动化运维操作都需要通过开发相应的脚本来实现,一个支持脚本发布、编排、管理、调度和执行的自动化运维引擎是实现自动化运维功能的关键。


目前市面上有很多作业系统在调度引擎和基础框架上有很多优点,例如分片执行、弹性扩容、高可用、多种触发策略、失败重试、任务告警等,比较优秀的有 Elastic-Job,XXL-Job 等,但它们在作业编排与实时监控方面有所欠缺,对终端用户来讲门槛略高,使用不够方便。


新数科技整合多个大型企业实施数据库自动化运维项目的经验,基于开源Ansible体系研究实现了一套自动化运维引擎,作为ShinData DMP云管理平台产品的重要基础结构模块,其主要特点有:

  1. 作业编排:可以自由选择相应的原子化操作,编排和发布新的作业流程

  2. 可视化: 通过拖拽鼠标编排作业流程和参数表单,作业运行与任务的状态可视化

  3. 并行调度: 同一个作业中的任务支持并行执行,在很多场景下能极大的缩短执行时间

  4. 实时监控: 任务的运行状态在页面上实时更新

  5. 断点执行: 执行错误的任务在修复错误后可以继续执行,不需要重新执行整个作业

  6. 任务回滚: 遇到错误,可以支持回滚作业中已经执行过的任务,恢复执行环境

  7. 作业模板: 可定制作业模板,用模板创建作业实例,避免重复工作

  8. 任务组: 在作业模板中把任务分组,在创建任务实例时候可以动态的复制任务组,相似的作业使用同样的模板,但又不限制于模板

  9. 计算表达式: 使用表达式动态的计算任务的参数值,能够极大的简化重复参数的输入以及复杂参数的拼接

  10. 动态参数:前面任务的输出作为后续任务的输入参数


为了更好的理解,先介绍系统中涉及 2 个核心概念,作业和任务:

  • 作业: 表示最终用户提交的一个自动化运维操作,完成一件事情并期望明确的结果;

  • 任务: 完成一个作业需要完成很多步骤,每个步骤定义为一个任务,任务也对应原子化操作,原子化操作可以在多个作业中重复使用。


一个作业由多个任务组成,以 MySQL自动安装部署为例,把整个安装过程定义为一个作业,完成安装需要经过很多步骤,例如创建用户、拷贝安装介质、安装环境检查、安装软件、配置参数、启动等步骤,每一个步骤定义为作业中的一个任务。


下面我们就从系统架构,作业的实时运行状态以及编排逐步进行介绍。

一、系统架构

系统主要分为以下几层:

1、交互功能: 自动化运维引擎对用户提供原子操作发布、作业编排、管理、作业调度和运行状态查看等功能;

2、作业引擎:  作业系统的调度核心,决定什么任务开始执行,作业是否执行完成,启动任务执行器执行任务,维护作业和任务的状态等

3、任务执行器: 执行任务的逻辑,针对多种场景扩展了不同的执行器,可以在一个作业流程中同时支持JDBC操作、执行脚本和执行HTTP API操作;由于执行器有各自的执行环境,天然支持多任务的高并发执行

4、消息中心: 任务执行结束后,通过消息驱动作业引擎进行后续任务的调度,任务执行器不与作业引擎直接交互,降低了系统的耦合度,且利于作业引擎的弹性扩容

二、作业执行

执行一个自动化运维操作就是通过作业模板来创建一个作业实例并执行,用户只需要填写和选择自动化运维操作的参数。在编排作业模板的时候会分析参数的特点,设计一个最优的表单,而不是每个任务 (原子操作) 的参数各自使用一个表单进行输入,这样的好处是重复的参数只需要输入一次,可以通过计算表达式或者全局参数进行引用,避免重复输入。


以下图安装 MHA 为例,MHA环境检查、安装MySQL、配置主从这些任务都需要每个服务器 的 IP地址,如果每个任务的参数都独立输入,那么这些 IP 就需要重复输入,不但使用繁琐,还容易出错。


此外,会根据参数的类型自动渲染为不同的输入组件,有下拉框、单选框、复选框、主机选择器、数据库 Schema 和数据库表选择器等。例如一个参数的类型是表,则会自动弹出一个表的选择框让用户从目标数据库中选择一个要操作的表,而不是让用户手动输入。在编排作业时还可以为参数添加提示,让用户了解每一个参数的意义。


参数输入完成之后,点击每一个任务,该任务的参数列表都会显示在右边,用户可以及时的检查参数输入是否有误 (部分参数值是输入的,部分是动态计算出来的)。

三、作业状态监控

对用户来说,最关心的是及时了解作业运行状态,及时发现错误并采取相应的措施。如当前正在执行任务哪些成功了、哪些失败了、查看任务的输出结果、查看失败的任务日志、回滚失败的任务然后重新执行、查看任务的执行时间等。


任务的状态有: 就绪 (等待执行)、执行中、执行成功、执行失败、回滚中、回滚成功、回滚失败、手动任务 (在某些需要手动执行的操作时使用手动任务,而不是调度中心让其自动执行)。


作业运行状态的页面会实时的从服务器端获取作业的所有状态,并更新到页面上。不同的状态显示为不同的样式,一目了然的全盘获悉作业的运行状态。


有时候由于参数输入错误导致任务执行失败,可以点击选中任务,修改其参数后继续执行;点击任务日志按钮也可以看到任务执行过程中输出的日志,对于查找错误原因也是非常方便。

四、脚本管理

在自动化系统中,相当多操作都是通过脚本执行的,我们可以将各种脚本作为原子化操作发布到平台中,通过任务引用需要的脚本,利用Ansible Playbook 执行具体的操作。


脚本在平台上发布成为原子操作之后,同一个脚本就可以编排在不同的任务中使用,例如安装 MongoDB 介质的操作定义为一个原子化操作,在安装 MongoDB 单实例 安装MongoDB 集群这两个作业中都可以引用同一个原子化操作,实现脚本的复用。操作的原子化也使任务的执行过程更清晰,出错的时候能够很容易的定位和追踪问题并进行解决。

五、作业编排

作业编排 (创建作业模板) 是将发布到平台中的原子化操作编排成一个自动化运维操作,首先是任务的分解:

  1. 需要把作业分解为任务,确定每个任务的功能和对应的原子化操作

  2. 确定任务之间的先后关系,任务是否可以并行执行

  3. 确定每个任务有哪些参数、参数的类型


如果到此为止,则所有参数都会显示到界面上让用户进行输入,但显然体验很不好,进一步为了优化参数输入表单,需要分析:

  1. 哪些参数是重复使用的

  2. 哪些参数需要使用其他参数进行拼接

  3. 设置参数类别选择更合适的输入组件

  4. 提炼全局参数、部分参数以供复用

  5. 参数是否有默认值、提交表单时是否需要对其进行校验

注:使用了全局参数、部分参数、计算表达式的参数不会显示在输入表单中,因为其值是自动计算出来的,是优化参数输入表单的核心。


在编排的时候,可以创建空任务,也可以选择系统管理的脚本创建任务 (参考脚本管理一节),会自动的识别出脚本的参数并用来创建任务的相关参数,不需要我们再手动的创建一次参数。拖拽任务的箭头创建连线建立任务之间的关系。作业应该是一个有向无环图,系统会自动检测出任务之间的环,只有有效的作业才能保存。

在任务的属性编辑弹窗中设置任务的执行器,预计执行时间 (用于判断任务是否执行超时) 、输出结果的格式等:

六、表单自动渲染

在执行一个作业的时候,会根据该作业的参数自动渲染作业输入参数的表单,而无需为每个作业单独开发前端表单,因此开发和发布一个新的自动化运维操作不需要修改平台任何代码,这样运维团队可以自主扩展自动化运维操作。


自动渲染出来的表单如下 (上面是表单,左下角是作业的拓扑图,右边是选中任务的参数):

七、计算表达式

为了实现参数的复用与复合使用,动态计算参数值,简化参数的输入,引入了表达式的机制,目前支持 5 种表达式:

  1. 任务参数: ${task-TASK_SEQUENCE_ID.ARG_NAME} (task- 为固定前缀)

  2. 全局参数: ${global.ARG_NAME} (global. 为固定前缀)

  3. 部分参数: ${partial.ARG_NAME[index]} (partial. 为固定前缀,index 为部分参数的 value 值的下标 (value 是一维数组,下标从 0 开始)

  4. 任务组参数: ${group-GROUP_ID} (group- 为固定前缀,在最后计算的时候,会展开为组的表达式)

  5. 任务结果: #{task-TASK_SEQUENCE_ID.result.RESULT_KEY} (task- 为固定前缀, .result. 也是固定的,RESULT_KEY 是任务输出的 JSON 结果中的属性名)


表达式包括前端计算和服务器端运行时计算: ${xxx} 在前端进行计算,#{xxx} 在服务器端任务调度的时候进行计算,表达式可以任意组合使用,例如 ${task-1.host}:${global.port}。


表达式的规则可视化如下图:

手动输入表达式很容易出错,于是我们还提供了表达式选择器,根据作业的内容动态计算出了所有可用的表达式,用户只需要选择使用即可:

八、任务分组

在作业模板中把一个逻辑单元的任务划分为组,执行作业的时候可以按组复制任务,只需要提供一个基础模板,就能应对多种需求。


例如下图为安装 Redis Cluster 的作业,每个 Redis 数据节点的安装和配置到集群中都由 7 个任务组成,在没有任务分组的功能时,有 4 个 Redis 数据节点的集群为一个作业模板,有 5 个 Redis 数据节点的集群则需要设计另一个模板,依次类推,每种不同的情况都要创建一个模板,重复了很多工作,如果哪里设计的不对,所有模板都要进行修改,工作量太大且不方便维护。

使用任务分组的功能把相关任务定义为一个组 (每组标记为不同的颜色),创建作业实例时,根据实际情况决定需要几个相同组的任务,点击复制菜单复制几次即可,而且任务之间的先后关系系统会自动计算出来,不需要我们手动维护,这样就能够使用一个基础模板,适配多种不同的情况,极大的简化了某些场景的工作量。

九、内置作业模板

ShinData DMP 数据库云管平台已经内置了上百种作业模板,支持各种不同种类数据库的自动化运维操作,开箱即用,例如:

  • MySQL 单实例安装

  • MySQL HA 安装

  • MySQL MHA安装部署

  • MHA 添加从节点(负载均衡)

  • MySQL_logstash 部署

  • MHA 主从主库宕机恢复

  • MGR 添加从节点

  • Oracle RAC 安装

  • Oracle DataGuard 搭建

  • Redis 单实例安装

  • Redis Sentinel 手动切换主从


将来会根据更多的场景增加作业模板库,覆盖更多的业务需求。


自动化运维引擎是自动化运维平台的基石,但光有好的引擎还不够,最终的功能都是要作为产品交付给用户使用,新数科技在强大的自动化运维引擎基础上,更加注重用户的使用体验,尽可能的可视化一切操作,以所见即所得的方式实现一个并行实时的自动化作业系统,不但满足用户的常规需求,在复杂的场景下尤其更具有吸引力。


作者简介 AUTHOR

黄彪

资深软件架构师,曾在IBM和大型互联网企业工作,设计和主导过大型软件和互联网应用的开发,目前在新数科技负责 ShinDB 分布式数据库和自动化运维引擎产品模块的架构设计等。


欢迎联系作者进行技术交流 

邮箱:tech@shindata.com

关于新数

ShinData新数科技成立于2014年,致力于为广大用户提供企业级数据库生态软件产品和云服务,产品形态兼有私有化部署和公有云SaaS模式,主要涵盖dbPaaS数据库云管理平台、分布式数据库和数据迁移传输平台等多种自主知识产权软件产品系列,应用于多家大型银行、证券、央企和能源制造行业企业,并提供创新性的云服务。为广大企业在新时代的云计算、大数据、人工智能环境下的数据库基础软件转型变革提供持久源动力和全生态支持。


推荐阅读

ShinSight | 秒级完成,从此数据库巡检变Easy

ShinSight | 7*24数据库监控告警保证数据安全

新数科技两项产品获北京市新技术新产品(服务)认定

岗位上新,新数科技ShinData招聘季扬帆启航!

ShinSight数据库监控与性能分析系统Lite版免费发布



继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存