傅 强,雷 蒙
(中国科学技术信息研究所,北京 100038)
随着IT 技术和信息化建设的发展,应用系统功能体系不断完善,应用系统部署规模日益增长。考虑到互联网用户服务质量要求,应用系统通常采用模块化开发建设和分布式部署模式,少数系统部署规模甚至突破数万台服务器。系统开发建设以模块化方式组织,在长期系统服务、运行管理过程中积累大量系统模块版本以及部署记录等信息。如何有效管理这些模块,配置、记录信息,是现阶段运维管理的挑战。在运维管理过程中妥善记录各类应用模块的部署情况,可以支撑系统回退,从而有利于实现系统故障的快速部署调整。
复杂信息系统运维部署管理通常使用自动化服务器配置管理工具,可以对所管理的对象实行自动化配置,如系统管理、安装软件等,实现运维信息管理、部署操作管理、机房设备管理、应用系统管理,常用的工具有Chef、Ansible、Fabric等。这些管理工具详细记录复杂信息系统中每个应用模块的信息,包括部署文件、配置文件、部署记录、版本信息、数据库、文件备份、接口情况、服务监控等,保障了复杂信息系统的运维管理工作平稳有序开展。
在复杂信息系统的运维过程中,服务故障、系统漏洞、安全问题等时常发生,运维人员在故障定位、原因分析、系统升级等过程中通常花费较长时间,影响系统正常对外服务。一个应用模块的部署一般存在多个版本,如部署版本1、版本2、版本3.5,应用模块的多个部署版本是由功能完善、性能调优或bug 修复造成的。当一个较高版本的应用模块出现运维问题时,为快速做好故障处置,降低版本、降维运行是一个现实可行且实施高效的技术选择。当一个版本从较高版本(如版本3.5)回退到较低版本(如版本2)时,需要实施部署回退。
信息系统的建设过程中,各个应用模块分别部署在不同服务器上,每个应用模块的部署版本共同组成了信息系统的当前部署版本。例如,某个信息系统共计4 个应用模块,该信息系统的部署情况、应用模块关系与应用版本如图1 所示,表示应用模块的部署版本为3,到的箭头表示调用了的服务。随着信息系统功能不断发展迭代、不断优化和修复bug 后,组成信息系统的应用模块可能会增加,相关模块的部署版本会升级,图1 中信息系统升级后的部署情况如图2 所示。从图2 可见,信息系统升级时,增加了1 个应用模块,同时应用模块的部署版本从1 升级为2。
图1 4 个应用模块的信息系统
图2 5 个应用模块的信息系统
当某个应用模块因为功能缺陷、安全问题等原因需进行调整时,可以通过部署回退操作恢复系统服务。由于应用模块版本间可能存在依赖关系,稳妥方案是系统回退到出问题模块部署之前的系统版本。例如,图2 中的应用模块或发生故障时,信息系统将从图2 回退到图1 的部署状态。
在实际信息化工作中,信息系统的集成和部署规模都是庞大的,以科技部的科技计划项目申报管理系统——国家科技管理信息系统公共服务平台为例,经过15 年的发展,其部署规模约为300 台服务器,存在大量的应用模块和部署版本。以信息系统运维工作为基础,本文研究复杂信息系统回退方法,并应用在故障处置、系统降维运行过程中。通过这种方法,可以有效降低运维管理强度,提升故障处理效率。
运维工作需要记录的内容一般包括四个方面。
1)基本信息。包含应用的名称、工程名、开发单位、版本号、上线时间等。
2)配置参数。服务器IP、服务端口号、部署路径、中间件名称、中间件版本号等。
3)部署与备份文件。当前应用部署文件,以及以往的各类应用备份、用户文件备份、数据库备份等。
4)运维记录。运维人员操作内容与操作时间,包括应用升级、应用重启、修改配置、更新数据、安全补丁等。
为实现应用部署回退,本文提出一种应用部署模型,包含应用基本信息、服务性能、备份文件、运维记录等,该模型表达如下:
式中:表示应用基本信息,由多个键值对组成,包括应用名称、部署名称、版本号等基本属性;表示应用的配置参数,是系统部署、正常运行相关的各种信息;表示部署与备份文件,记录应用不同版本对应的部署、备份文件位置;表示运维记录,主要记录应用不同版本的上线、更新、下线等操作时间等信息。
本文采用有向图{,},表示某一时刻复杂信息系统部署关系,这种方法与邻接矩阵表示图的方法类似,将其定义为复杂信息系统部署关系的邻接矩阵表示法。其中为所有应用的集合,也就是图中的顶点,可用一维数组存储应用部署模型的信息。为应用之间的关系,即图中的边,可用二维数组表示两个应用之间的关联关系。
对于任意两个应用a和a,两者的部署关系为a调用a的服务,则在{,}中存在一条从a到a的边,记为<a,a>(≠),且r=1。本文定义{,}的邻接矩阵表示如下,是一个×的矩阵:
以5个应用组成的系统为例,系统部署关系如图3所示。图3 中:..version=1,..version=2,..version=3,..version=4,..version=5,则这个包含5 个应用系统的部署关系图用一个5×5 的矩阵表示为:
图3 系统部署关系示例
本文提出的复杂信息系统部署关系邻接矩阵表示法,采用图的邻接矩阵表示法记录复杂信息系统应用模块部署关系的同时,还将每一个应用模块的部署版本记录在邻接矩阵中,有利于应用模块版本控制与部署关系的统一运维管理。
复杂信息系统部署关系随着运维部署操作会产生变化,在不同的时间点,复杂信息系统的部署关系是不同的,因此可以用与时间点定义复杂信息系统在某个时刻的部署关系。结合复杂信息系统部署管理的上述特征,本文提出一种复杂信息系统部署关系模型,={,,}。实际上,是包含每个时刻复杂信息系统部署关系的集合。
式中:G是t时刻复杂信息系统的部署关系图,最早的系统部署关系图为,最新的系统部署关系图为G。根据复杂信息系统运维管理的增量变化特点,可以得出当t< t时,A⊆A且R⊆R。
复杂信息系统运维管理过程中,每一个应用系统、部署关系会发生变化,都会导致应用、部署关系发生变化。例如,一个新的应用模块部署、一个在线应用模块升级、一个应用模块下线等。可见,复杂信息系统的部署关系{,}随着特定部署操作,存在以下5 个特点。
1)应用模块会发生变更,包括基本信息、服务性能、备份文件、运维记录等。
2)应用部署关系随应用模块变更而变更。
3)在没有应用变更时,部署关系维持不变,发生新的运维操作时,才可能发生变化。
4)变更是在一个特定时间点发生的。
5)部署关系的变更,通常是由一个或少数几个应用的变更引起的,且仅与这些应用模块相关的部署关系会发生变更。
基于上述特点,复杂信息系统的部署管理过程可以采用有限状态机(Finite State Machine,FSM)表示运维部署操作引发的复杂信息系统整体状态的变化。本文提出一个适用于复杂信息系统部署状态模型,由三元组{,,}表示,其中:是部署状态模型的状态集合;是各类运维部署操作集合,分为常规操作、变更操作和回退操作;是一个状态迁移关系的矩阵,×≫,⊆×。
在部署状态模型中,运维操作触发信息系统部署状态的改变。是信息系统所有部署状态的集合,信息系统在某一个时间点的部署状态只对应一个特定的S。的任意2 个状态S和S都存在时间上的先后关系,当S早于S时,<。信息系统每一次部署状态变化都是由某一个运维部署操作引起的,其中常规操作通常不会改变部署状态,变更操作会触发部署状态变迁为新的状态,回退操作会触发部署状态变迁为旧的状态。表示因运维操作触发的一次部署状态迁移关系集合,可以看作是一个矩阵,这个矩阵记录了和的关系。的阶是由的数量决定的,因此矩阵是一个 ||阶矩阵。
图4 给出了一个信息系统部署状态模型的例子,其中={,,}。这个状态机模型的状态迁移关系矩阵如表1 所示,={,,,∅},∅记为空运维部署操作。
图4 部署状态模型示例
表1 部署状态模型状态迁移
结合系统部署关系模型,本文提出一种复杂信息系统部署回退算法。当复杂信息系统的部分应用模块发生故障时,通过回退算法将故障应用模块的部署版本回退到可用版本,同时处理好所有与故障应用模块存在依赖关系应用的部署关系与版本回退情况,快速恢复系统故障。发生故障的应用模块̑在部署关系模型G的A中,且̑⊆A。在回退算法中,针对故障应用模块̑无故障的上一个部署版本,结合部署关系、部署关系模型,通过部署回退算法计算出能稳定运行的部署关系模型对象G,从而实现部署关系模型G到稳定部署关系模型G的部署调整与服务切换,实现复杂信息系统故障快速恢复。
按照与故障应用模块̑的关系,部署关系模型G中应用集合A可划分为̑的父节点集合A、子节点集合A、无关联节点集合A,即A=A+A+A+̑。根据部署关系,从应用集合A的整体上分析,A调用̑的服务,̑调用A的服务,A与̑没有服务调用关系。因此,̑的版本回退只影响A的运行,并不会影响A和A,部署回退算法执行过程中重点关注̑和A的部署版本计算,A和A可维持当前部署版本不变。
复杂信息系统部署回退算法如下:
上述复杂信息系统部署回退算法主要分为4 个步骤,如图5 所示。
图5 复杂信息系统部署回退算法
1)寻找故障应用模块的稳定部署版本。在复杂信息系统部署关系模型中,遍历每一个部署关系模型对象G,寻找故障应用模块̑的上一个稳定的部署版本̑,以及̑所在的G和应用集合A,这个稳定版本记为。
2)寻找故障应用模块父节点集合。在部署关系模型G中,遍历部署关系邻接矩阵,寻找对̑有依赖关系的应用模块,即̑的父节点,然后再递归寻找̑父节点的父节点,所有符合条件的父节点应用模块集合记为A。
3)寻找故障应用模块的无关联节点集合。考虑到G演变到G的过程中可能出现新增的应用模块,因此故障应用模块的无关联节点在G中寻找。在应用集合A中,除去故障应用模块̑,以及̑的父节点集合A,剩余部分就是故障应用模块的无关联节点集合A。
4)生成可部署的应用组合。合并步骤1)中故障应用模块的稳定部署版本、步骤2)中故障应用模块的父节点集合以及步骤3)中故障应用模块的无关联节点集合,就形成了回退算法的计算结果,即可恢复故障的部署关系模型G。
在实际复杂信息系统运维管理过程中应用本文提出的部署回退算法,从服务监控、故障定位、算法执行、部署文件、应用更新、系统备份、服务启动等运维工作出发,可以形成一个闭环的运维操作流程,如图6 所示。
图6 回退算法在运维工作中的应用
1)服务监控。为实时掌握复杂信息系统的运行与服务情况,需要开展自动化服务监控。自动化的服务监控依赖监控软件,开源的监控软件有Zabbix、Nagios 等,收费的监控软件产品有北塔软件等。服务监控是为了能够掌握复杂信息系统中每个应用模块、中间件、操作系统、数据库、网络等各个方面的情况,本节重点是发现应用模块故障,例如页面加载失败、功能异常等问题,以此发现系统故障。
2)故障定位。运维人员收到监控系统的故障报警后,立刻启动故障定位与恢复处置。首先,运维人员根据报警信息,定位故障应用系统̑的名称、服务器、版本号等相关信息。然后,运维人员根据系统服务情况和应用部署信息,通过运维操作恢复故障。在故障定位与恢复过程中,对于无法在当前应用部署版本上实现故障恢复,需要启动整体集成系统做版本回退操作的情况时,执行本文提出的部署回退算法。
3)算法执行。以故障应用模块̑为输入,执行部署回退算法,利用本文提出的应用部署模型、部署关系邻接矩阵、部署关系模型,可快速计算故障应用模块̑的回退应用版本̑,以及相关联父节点应用节点集合A、其他应用节点集合A,最终输出待部署系统部署关系模型G。
4)部署文件。根据部署回退算法产生的部署关系模型G,遍历A中的每一个应用a以及a的版本号,通过应用部署模型a.记录的备份文件路径,形成待部署应用关系模型G的应用部署文件路径列表。
5)应用更新。依据应用部署文件路径列表,拷贝A中所有应用的部署与配置文件,存放在指定的服务器路径下,完成所有应用模块部署配置文件的拷贝与更新。
6)系统备份。任何一个信息系统都需开展系统备份工作,根据运维管理要求,一般在应用模块版本更新时会创建应用程序备份,形成本文提出的应用部署模型的备份文件。复杂信息系统的备份文件统一保存,与应用系统存在多对一的对应关系,这些关系也都记录在应用部署模型中,为回退算法的应用提供备份文件支撑。
7)服务启动。针对已完成拷贝和更新的应用列表,启动所有服务,完成复杂信息系统故障后的版本回退,实现系统服务的快速恢复。同时,记录相关的应用版本号,完成应用备份,持续开展服务监控。
本文根据信息系统运维部署实际情况,提出了一种适用于复杂信息系统运维管理的部署回退方法,可实现应用模块故障时快速恢复整体系统服务。首先定义了复杂信息系统中应用模块的部署模型,通过有向图表示应用模块之间的部署关系;再由部署关系定义了复杂信息系统的部署关系模型;最后利用状态机描述了复杂信息系统部署状态随着运维部署操作的变化关系,结合部署状态模型,提出了部署回退算法以及算法应用方法。
下一步将重点研究多个应用模块故障的部署回退方法,进一步提升复杂信息系统运维管理过程的故障应急响应效率。