论软件可靠性设计
2013
【论文三】论软件可靠性设计技术的应用
随着软件的日益普及,系统中软件成分不断增加,使得系统对软件的依赖越来越强。软件的可靠性对系统可靠性的影响越来越大。而实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,为此提出了软件可靠性设计的概念。
软件可靠性设计就是在常规的软件设计中,应用各种方法和技术,使软件设计在兼顾用户功能和性能需求的同时,全面满足软件的可靠性要求。软件可靠性设计应和软件的常规设计紧密结合,贯穿于软件设计过程的始终。
请围绕“软件可靠性设计技术的应用”论题,依次从以下三个方面进行论述。
1.概要叙述你参与管理和开发的软件项目以及你在其中所承担的主要工作。
2.结合项目实际,论述你在项目开发过程中,进行软件可靠性设计时遵循的基本原则;论述你在该项目中所采用的具体可靠性设计技术。
3.阐述你在具体的可靠性设计工作中,为了分析影响软件可靠性的主要因素,所采用的可靠性分析方法。
2014
试题三 论软件的可靠性设计
现代军事和商用系统中,随着系统中软件成分的不断增加,系统对软件的依赖性越来越强。软件可靠性已成为软件设计过程中不可或缺的重要组成部分。实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,由此提出了可靠性设计的概念。可靠性设计就是在常规的软件设计中,应用各种方法和技术,使程序设计在兼顾用户的功能和性能需求的同时,全面满足软件的可靠性要求。
请围绕“软件的可靠性设计”论题,依次从以下三个方面进行论述。
1.概要叙述你参与管理和开发的软件项目以及你在其中所担任的主要工作。
2.简要说明目前比较主流的软件可靠性设计技术,结合项目实际情况,阐述所选择的可靠性设计技术及其原因。
3.结合你具体参与管理和开发的实际项目,举例说明所选取的软件可靠性技术的具体实施过程,并详细分析实施效果。
摘要:
2022年3月,我负责了某公司基于云原生理念的“自动化运维系统”的建设项目,由我担任系统架构设计师,负责系统架构设计工作,在该项目的实施过程中,我们认为系统的可靠性设计尤为重要,在可靠性设计方面,我们选择了容错技术、检错技术、降低程序复杂度三种技术,这可靠性设计设计时,我们遵守如下三个原则:可靠性设计不能与软件设计的其他原则冲突;可靠性设计以软件的可靠性为目标;可靠性设计不能过度设计。该项目总投入近450万,历时15个月,于2023年6月交付至今,不仅帮助运维人员高效、安全的管理云上应用和后端服务器资源,同时帮助开发和测试人员实现应用的快速迭代和测试,大大提升了团队之间的协作效率,消除了运维和开发之间的壁垒,得到了用户的一致好评
正文:
随着云原生技术的发展,企业也逐渐引入相关技术,在基础设施层,越来越多的企业开始购买云上服务器,如应用服务器企业可选择阿里云的ECS服务器,数据库服务器企业可选择阿里云的RDS,DNS服务企业可选择阿里云的域名解析,云上资源购买十分方便,在页面中点击几下即可购买成功,但在实际工作中,不能随意购买,需要结合企业成本和服务器资源使用情况来综合考量,避免资源浪费,所以对云上资源的成本、资源使用情况的可视化管理就很重要。同时,随着容器技术和微服务架构的发展,企业应用也都选择微服务架构,采用容器的方式部署在kubernets集群中,在这种情况下,应用的快速发布、容器资源管理、监控告警就显得尤为重要。
为了实现云上资源的可视化管理和基于云原生应用的快速发布,我所在的公司决定开发一个“自动化运维”系统,我们称之为云平台,并在2022年3月正式启动该项目的建设工作,我被任命为系统架构设计师,负责系统架构设计工作。该项目总投入450万元人民币,建设周期从2022年3月至2023年6月截止,历时15个月。该系统主要包括应用中心、发布中心、监控中心、成本中心、容器中心、权限管理和变更管理七大模块,应用中心是整个系统的数据中心,其他模块的功能都围绕“应用”来进行资源的展示和操作;发布中心以“应用”为单位,向用户提供应用的快速发布功能;监控中心以“应用”为单位,向用户提供应用的监控告警功能;成本中心以“应用”为单位,向用户展示每个应用的成本;容器中心以“应用”为单位,展示应用的相关容器资源;权限管理是对用户分类,使得不同的用户可看到不同的模块;变更管理主要对云上资源的变更进行管控,避免对云上资源的误操作导致系统故障。
软件可靠性设计的设计原则有:软件可靠性设计贯穿软件整个生命周期,可靠性设计原则不能与软件的其他设计原则相冲突;软件可靠设计的目标是提升软件系统的可靠性;软件可靠性设计不能过度设计,需要综合考量软件系统的用户需求、功能、性能、成本等指标。软件可靠性设计方法主要有容错技术、检错技术、降低软件复杂度,其中容错技术包含N版本程序设计、后备块、冗余技术,我们项目主要采用了容错技术、检错技术、降低复杂度三种技术,下面将详细介绍这三种技术的实际应用场景和落地方案。
在容错技术方面,我们主要采用冗余技术来提升软件系统的可靠性。冗余方案主要包含应用集群的冗余、应用实例的冗余、关系型数据库的冗余和非关系型数据库的冗余。
在集群冗余方面,由于我们平台是基于云原生的技术架构,所以系统的多个模块采用微服务架构,多个微服务采用容器的方式部署在kubernetes集群中,那么kubernetes集群的可靠性就很重要,使整个平台稳定运行的基础,如果集群宕机,整个平台则无法使用,所以在架构设计时,我们选择了使用两个kubernets集群来提供服务,每个集群的服务器节点数便少了,提升了基础设施的可靠性。
在应用实例冗余设计上,我们为每个应用配置了多实例,即使用kubernets集群的Deployment资源,每个应用在每个集群都配置一个Deployment资源,每个Deployment至少配置1个容器,保证每个应用在每个集群至少拥有一个实例,同时为每个Deployment配置了HPA弹性伸缩资源,当应用CPU使用率超过80%时,能够自动进行扩容,当CPU使用率低于30%时,能自动缩容,大大提升了应用实例的可靠性。
在非关系型数据冗余方面,我们选择Redis作为非关系型数据库,Redis的集群方案主要有主从模式、哨兵模式和Cluster集群模式,由于我们的架构相对简单,数据量相对较低,所以我们选择了哨兵模式,当主节点宕机时,能够自动切换到从节点,同时,Redis的数据备份方面,我选择了RDB备份方式,因为RDB是定时全量备份,数据恢复速度很快,当Redis集群出现问题时,能以最快的速度恢复应用。
在关系型数据冗余方面,我们选择了mysql数据库的主从架构,当主节点宕机时,从节点能够提供服务,同时,也对mysql中的数据做了备份方面,书写脚本,每晚进行增量备份,每周进行一次全量备份,只为保证数据不丢失。
在检错技术的应用上,我们为每个微服务、kubernets集群节点服务器、kubernetes集群资源配置了监控和告警,告警方式分为钉钉消息,如果告警持续,就要进行电话告警,打电话给运维人员,例如当微服务的实例数小于2,就说明一个集群中服务出现了问题,就要进行告警;当kubernets集群节点ping不通时,说明集群节点宕机,进行告警。当集群中HPA弹性伸缩资源、Service负载均衡资源被删除时,进行钉钉消息告警。
在降低复杂度的应用中,所有应用采用微服务架构,使用grpc 进行通信,同时,由于云原生技术是以golang语言为主,所以所有的微服务我们都选择了go语言进行后端的编码,前端全部使用vue-cli脚手架,同时使用vue-element开源组件,实现技术的统一,提升系统的可修改性和可维护性。
经过近15个月的项目开发,“自动化运维系统”顺利投入使用,开发人员和测试人员可通过该系统实现应用发布的自动化,无需运维人员的协助,消除了运维和开发的固有壁垒;运维人员可通过该系统高效管理云上资源,实时查看云上资源的使用率和成本,减少资源浪费,提高资源使用率。当然,在本项目中还有一些不足之处,在进行云上资源成本统计时,最初我们通过阿里云的费用接口来拉取各个产品的成本,由于产品很多,写了很多逻辑,后来通过和阿里云的技术人员沟通,可以在阿里云平台上将所有产品的费用一键转储到oss中,直接通过oss的sdk即可快速查询所有产品的费用,后来我们开发人员快速修改下成本获取的逻辑,并没有对项目产生什么影响。由于架构合理且考虑周全,进展顺利,得到了公司技术人员的认可,大大提高了技术团队的协作效率。