热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

如何提升系统可用性?

相传魏文王和名医扁鹊之间曾经发生过这样一段对话:魏文王:“你们兄弟三人,谁是医术是最好的呢?”扁鹊:“大哥最好ÿ

相传魏文王和名医扁鹊之间曾经发生过这样一段对话:

魏文王:“你们兄弟三人,谁是医术是最好的呢? ”

扁鹊:“大哥最好,二哥差些,我是三人中最差的一个。”

魏文王:“那为什么你的名气最大?”

扁鹊:“大哥治病,是治病于病情发作之前,病人尚未发病即已根除病因,使得他的医术没有得到认可,没什么名气;二哥治病,是治病于病情初起时,二哥药到病除,大家认为二哥善治小病,名气只在本乡里;而我是治病于病情严重之时,大家看到我或在经脉上穿刺放血,或在患处敷以毒药以毒攻毒,或动大手术直指病灶,使重病人病情得到缓解或治愈,所以以为我的医术高明,名气因此响遍全国。”

在上面这个小故事中,根据医生治病发生在病情发展的不同时期可以分为三个阶段:


  • 病发前,施以小术,代价非常小,却很容易根除病因。
  • 病发初期,患者小恙,对症下药,也能很快治愈。
  • 病情严重,患者身体损伤极大,要施以非常手段才有可能救治病患,代价很大,也很容易留下后遗症。

技术人员治理系统犹如医生治病救人,为了保证系统能够稳定地对外提供服务,有比较高的可用性,需要关注系统发展的整个生命周期,见微知著,一方面能够识别软件开发中潜在的问题,尽早解决;另一方面当系统出现小问题,不要忽视,及时处理;最后当系统发生较大问题时,也能够使用雷霆手段快速恢复,保证系统可用。

为了提高系统的可用性,这三个阶段我们都需要关注,本文会通过分析影响系统可用性的因素,尝试找出在这三个阶段我们需要采取的必要措施。


什么是系统可用性?

首先我们来看看维基百科上对可用性的一些定义:

可用性就是一个系统处在可工作状态的时间的比例

系统可用性是衡量一个系统正确地对外提供服务(可工作)的能力。我们通常采用SLA(Service Level Agreement)来衡量系统可用性,也就是我们经常听到的的几个9,其对应的系统不可用时间可以参照下表:

如何提升系统可用性?

 

3个9(99.9%)表示一个月最多不超过43.8分的不可用时间,对于每月例行停机维护的系统基本很难达到;5个9(99.999%)要求一年内系统不可用的时长不超过5分钟,听起来就觉得不可思议。


哪些因素会影响系统的可用性

除了人为原因导致的故障,基础设施的定期维护,硬件设备损坏,自然灾害等等都会导致系统不可用,因此100%的系统可用性是基本不可能达到的;要提高系统可用性,我们得先分析影响可用性的问题发生的原因和影响,下面根据我的经验列举一些会对系统可用性产生较大影响的因素:


人员误操作

经典如rm -rf . /的操作在日常的开发过程中并不少见,比如:


  • 在生产环境执行了IDE导出的数据恢复脚本,不慎选中了DROP TABLE,结果删除了整表的数据
  • 在生产环境中清理冗余的Docker镜像文件时,不慎删除了所有镜像
  • 本该在测试环境执行的脚本,错误的跑在了生产环境的数据库上
  • ……

数据、文件存储等无疑是大多数企业的核心资产,涉及到数据的故障往往都是非常大的故障,不仅影响范围非常大,如果前期没有足够的灾备准备,是很难在短时间内恢复的,甚至可能无法恢复,造成巨大损失。


雪崩效应

在分布式系统架构下,服务之间需要配合来完成复杂的业务流程,某个服务提供者的不稳定在请求量变大的情况下,会逐步演化成整个系统的雪崩效应。

雪崩效应通常会经历如下过程:


  1. 服务提供者不可用(宕机或性能较差)
  2. 服务调用者请求量增加(业务量增加、失败重试、缓存穿透等)
  3. 服务调用者系统资源耗尽,服务调用者不可用

雪崩会造成整个系统的瘫痪,以我们的系统曾经经历了一次雪崩为例,一个核心服务在没有代码变化的情况下,增加了用户量(可以理解为对用户分批开放),在数据基数增大和请求量增大时,服务的接口性能无法满足需求,陡增的请求量对数据库了造成非常大的压力(CPU占满),接口全部超时,导致长时间占用API Gateway的连接资源,API Gateway无法处理其他请求,进而导致了整个系统的瘫痪,如下图:

如何提升系统可用性?

 

本质上来讲雪崩的发生是因为服务提供者无法满足当前业务的高并发需求,同时也没有很好的应对措施保证系统其他服务的正常运转。


未经完整测试的版本发布

以上两类故障的发生通常会引发非常严重的问题,但频率相对较低,而定期的版本发布常常因为没有经过完整的测试导致线上故障发生,严重的情况下也会对可用性产生很大的影响。

随着系统服务年限的增长,业务的增长让系统变的越来越复杂,依赖人工的黑盒测试基本上很难覆盖所有业务场景(我们曾经有一个开发了3年多的系统,在没有自动化回归测试的情况下,每次发布后需要4个测试同学花费2个小时进行只读的关键场景回归测试,成本非常高昂),这导致定期的版本发布经常会带来一些意外的故障,每次发布后都需要有人值班来解决这些故障。

系统间集成测试成本更高,一方面集成测试需要跨多部门进行沟通协调,另一方面集成的一方通常无法知道另一方的实现细节,测试用例很难保证全面。对于关键系统的集成,如果修改后没有充足的回归测试,上线后很可能导致影响主流程的故障,影响用户的使用。


基础设施故障及定期升级维护

不管是自建基础设施,还是使用第三方云服务,基础设施的故障和定期升级维护是不可避免的,也是影响系统可用性的关键因素。

影响可用性的基础设施相关因素包括:


  • 硬件故障
  • 网络故障(包括网络带宽不足导致的通信问题等)
  • 系统升级(操作系统、数据库、网络设备、中间件等)
  • 日常维护(备份、迁移等)

如何提高系统可用性

影响系统可用性的因素很多,以上列举了一些非常典型的场景,这足以让我们对影响可用性的因素有一个非常直观的理解。为了从可实施的角度讨论如何提高系统可用性,这里不考虑基础设施硬件故障等不可控因素。

从上面的因素中我们不难发现,有些问题我们可以通过提高工程化能力和优化工作流程解决,但如何将这些工程化能力和流程落地也是一个非常复杂的问题,因此我下面会通过技术和团队两个视角来看如何才能提高系统的可用性。


从技术视角,要不断强化工程能力

如何提升系统可用性?

 

根据可用性的定义,要提高系统的可用性,就是要缩短系统不可用的时长,保持系统的健康状态;那么回顾下文章开头的小故事,我们可以从三个阶段来针对性的采取一些措施:


  • 病发前:
    • 完善的代码质量管理体系和自动化测试体系,能够保证产品质量,通过代码检查、安全扫描和测试自动化,避免未经测试的代码部署到生产环境
    • 完善的权限管理体系,能够保证生产环境权限不滥用,避免过多的人为操作对生产环境产生影响
    • 其他自动化的开发、运维工具体系,在提高工作效率的同时,注重安全性,通过自动化的脚本检查、运维流程自动化等方式避免不必要的错误对生产环境造成的危害
  • 病发初期
    • 完善的监控体系,能够尽早识别系统的潜在问题,系统运营人员可以快速甄别即将发生的故障,不要等到用户反馈才知道系统出了问题
    • 完善的持续集成/持续部署体系,能够保证尽量快的反馈,尽量短的发布时长,在功能开发和故障修复后快速地部署代码到生产环境
  • 病情严重
    • 完善的发布验证、回滚、限流、熔断、降级策略,能够尽量缩小故障的影响范围,保证即便有部分服务不稳定,也不至于导致整个系统不可用
    • 完善的灾备恢复体系和演练,能够保证系统在发生重大紧急事故时可以快速恢复,尽量缩短不可用时长

从团队视角,要有一支重视技术的团队

在软件系统的开发运维过程中,我们有很多手段可以发现问题,如线上故障、监控报警、回顾会议等等,但从根本上解决问题往往非常困难,大多数情况下是头痛医头,脚痛医脚,到最后结果就是技术债台高耸,线上故障频发;即便找到了解决问题的办法,在实施的过程中还会遇到很多问题。

探究其原因,可能比较复杂 ,但从团队视角来看,通常存在团队对待技术并没有那么严谨,对待生产环境没有那么敬畏,对待自己的代码没有那么严苛。

要提升系统的可用性,必须要有一支重视技术的团队,这个团队应该具备以下特征:


  • 自上而下崇尚技术,尊重技术
  • 有专家级成员,有能力实施上面提到的各种工程能力
  • 不急功近利,不会为了短期的业务目标而在技术上妥协
  • 团队成员遵守团队纪律,不做违反纪律,破坏规则的事情

结语

追求系统的高可用就像一个人追求身体健康一样,整个软件开发团队自始至终都要秉持爱护软件系统的心态,在软件开发的全流程中,时刻保持警惕,通过提高团队在三个阶段中的工程化能力来及时发现和解决系统中存在的问题。

这不单纯是个技术问题,善治系统的团队首先要在团队内建立尊重技术、工程的文化氛围,建立团队行为规范,严明纪律,有所为有所不为;在此基础上,不断在团队开发过程中针对问题寻找解决问题的最佳实践,做且做好正确的事,相信高可用是必然的结果。


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
author-avatar
香福武燕_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有