Published on

10 分钟搞定系统稳定性

系统稳定性是支持业务运营的基石,本文探讨了构建稳定可靠系统的基本原理、挑战和可操作策略。原文:Building System Stability: A Comprehensive Guide to Reducing Production Incidents

系统稳定性是支持各项业务运营的基石,没有稳定性作为基础,无论是最创新的功能还是敏捷的开发流程,在面对系统故障时也都毫无意义。这份全面指南探讨了构建稳健、可靠系统的基本原理、挑战和可操作策略,从而最大程度减少生产事故并最大化业务连续性。

理解系统稳定性

系统稳定性远不止“保持系统运行”那么简单,而是代表系统在各种条件和压力下维持一致的服务质量的根本能力。

学术定义

系统稳定性是指系统在指定边界条件下维持其服务质量(QoS)的能力,包括在面对预期负载、异常输入或部分组件故障时,仍能提供满足服务水平协议(SLA)要求的服务。

虽然学术定义提供了理论基础,但实际工程需要更具体、可衡量的标准。

工程实践定义

从工程角度来看,系统稳定性体现在四个关键维度:

  • 服务连续性:在硬件故障、网络波动和流量高峰期间保持服务可用性。这超越了简单的正常运行时间,涵盖了优雅处理意外情况。
  • 性能一致性:确保 P99 时延保持稳定,无剧烈波动。例如,保持 P99 响应时间在 500ms 以下,波动幅度小于 15%。
  • 可预测性:系统行为应符合“墨菲定律”预期 —— 任何可能出错的事情都会出错,但系统具有预定的响应策略。
  • 优雅降级:实现优雅降级功能,例如允许购物车功能独立于推荐系统运行。

显示关键系统指标的监控面板,包括服务器请求、CPU 和内存使用率、页面加载时间、登录次数以及随时间波动的网络流量显示关键系统指标的监控面板,包括服务器请求、CPU 和内存使用率、页面加载时间、登录次数以及随时间波动的网络流量

量化指标

  • 服务等级协议(SLA,Service Level Agreement):通常用可用性中的 9 来表示。4 个 9(99.99%)意味着系统每年的停机时间仅为 4.3 小时。
  • 故障平均间隔时间(MTBF,Mean Time Between Failures):总运行时间除以故障次数计算得出。该指标反映系统可靠性 —— 数值越高表示故障率越低,稳定性越强。
  • 平均修复时间(MTTR,Mean Time To Recovery):从故障发生到完全恢复所需的平均时间,包括问题诊断、解决、测试和生产验证。数值越低表明恢复能力越强。

这些定义表明系统稳定性取决于两个基本因素:系统风险概率和风险应对能力,这种关系可简化为基础公式:

稳定性 = 系统风险(概率)× 风险应对能力

构建系统稳定性的重要性

系统稳定性是所有其他业务努力之前的那个“1”,具有重要意义,没有稳定性作为基础,后续的创新和发展将完全失去价值。

直接经济影响

系统稳定性差会导致直接且可量化的经济损失。订单处理失败、支付系统错误和数据损坏事件会直接造成收入损失。

专业信誉

稳定性问题会影响到多个层面的信誉 —— 个人开发者、工程团队以及整个组织。重大事故可能升级为公共关系危机,对企业品牌形象和市场声誉造成长期负面影响。

开发效率

强大的系统稳定性能显著提高整体迭代效率。当系统可靠运行时,工程团队可以大大减少花在处理紧急情况上的时间,从而可以将更多资源投入到功能开发和业务推进中。

工作在更稳定系统上的团队的生产效率更高、压力水平更低、工作满意度更好,从而形成积极的反馈循环,进一步提升系统质量。

技术债务对代码质量的影响,以及如何影响产品交付、团队状态和业务成果技术债务对代码质量的影响,以及如何影响产品交付、团队状态和业务成果

稳定性建设中的挑战

尽管系统稳定性的重要性已得到普遍认可,但实施起来却异常困难。"Bug 驱动开发"可以说明这一挑战 —— 团队往往只专注于业务功能交付,直到问题出现,然后才被动解决质量和流程问题。

资源投资平衡

在业务迭代与稳定性建设之间找到最佳平衡点始终是一项持续挑战,会出现两种极端情况:

  • 稳定性投资不足:当稳定性获得最少资源时,无法长期维持系统质量,快速的业务支持会累积潜在风险和隐藏问题,最终以 Bug 或事故的形式显现。
  • 过度关注稳定性:大量稳定性投入在短期内难以量化收益,业务相关方可能只会感受到迭代速度变慢,质疑为何不能更快进行开发和部署。

这造成了优先级和调度上的困难,业务团队在压力下自然会优先考虑功能交付,并将压力传递给工程团队。

稳定性建设的复杂性与风险

稳定性建设涉及识别、管理和预防风险 —— 每个组件都呈现出显著的复杂性。

风险识别难度:主动识别风险需要全面审查整个系统范围内的代码和业务流程,随着系统规模和交互复杂性的增加,工作量和复杂性会急剧上升。

风险管理挑战:即使完成风险识别,实际整改仍面临多重障碍:

  • 为可能持续数月的整改工作分配资源
  • 在整改过程中引入新问题的风险
  • 处理包含累积技术债务的遗留系统时的执行复杂性

渐进式风险预防:新风险主要源于系统变更 —— 业务迭代和技术优化。需要确保开发、测试和产品团队之间的一致理解、可控的变更流程以及可靠的人员执行。

雷达图展示软件技术债务和代码质量指标在多个维度上的表现,质量等级从 A 到 G雷达图展示软件技术债务和代码质量指标在多个维度上的表现,质量等级从 A 到 G

全面稳定性建设策略

有效的稳定性建设需要系统化方法,涵盖技术和管理两个维度。策略基于稳定性公式,聚焦于三个核心方向:降低风险、提升响应能力和组织协同。

建立资源投入共识

在稳定性建设中,主要挑战涉及资源分配。技术团队必须首先就稳定性建设资源投入达成内部共识,通常以团队总能力的百分比形式表示。

这个百分比会根据业务重要性、发展阶段和当前风险评估而变化。团队需要全面评估这些因素,以确定适当的稳定性建设优先级,并逐步调整投资比例。

许多业务发展团队缺乏基础共识 —— 在不相应的资源投入下期待稳定的系统,这会形成不切实际的期望。常见情况包括在保持严苛的发布截止日期和质量要求的同时,为技术设计评审和代码评审分配的时间不足。

资源投入共识必须超越技术团队,扩展至业务利益相关者,在迭代速度和稳定性建设投入之间建立相互认可的平衡点。

明确稳定性目标

稳定性建设目标在不同开发阶段有所不同,需要动态选择指标。例如,3 级技术事故年度指标、生产问题月度指标,或直接是 4 个 9 的可用性目标。

明确的目标能够分解为可实现的里程碑目标和实施方案。成功的稳定性建设最终取决于"人"和"流程" —— 人执行计划,而流程提供安全保障和质量保证。

展示高、中、低严重性事件分类和处理步骤的事件响应计划流程图展示高、中、低严重性事件分类和处理步骤的事件响应计划流程图

培养稳定性意识

系统稳定性建设依赖于人的执行,人员意识对于实施难度和最终结果至关重要。这涵盖三个关键领域:

  • 认识:团队成员必须充分理解系统稳定性的重要性。实际建议包括定期提醒、强调典型问题以及严肃的事故回顾,以逐步增强稳定性意识。
  • 意愿:团队成员必须投入时间和精力去评估和解决稳定性风险(在资源得到充分分配的前提下)。风险评估需要对系统代码和业务流程进行详细分析,这需要耐心和注重细节。
  • 能力:团队成员必须识别风险并制定解决方案。当认知和意愿一致时,通过知识共享、协作学习和专家咨询成为个人能力发展的途径。

实施全面开发标准

系统变更(业务迭代或技术优化)通常包括需求评审、技术设计评审、编码和自测、测试用例评审、测试、代码评审、验收、部署和生产验证。

严格的流程执行需要额外的时间投入。项目可能在不完全遵循流程的情况下成功,导致一些人低估流程标准并质疑效率效益。然而,开发流程标准为系统稳定性提供了基本保障。

事件响应与支持工作流程图,展示了角色、决策点和从客户问题报告到开发补丁发布的升级过程事件响应与支持工作流程图,展示了角色、决策点和从客户问题报告到开发补丁发布的升级过程

技术设计评审

技术设计评审在两个维度上运作:确保评审发生和维护评审质量。

  • 强制技术设计评审:超过定义复杂度阈值(通常为 3 人天)的项目应包括技术设计和评审阶段。小型项目需要根据复杂度和变更影响范围进行评估。
  • 聚焦评审优先级:技术评审应强调架构合理性、可扩展性,以及高性能、高可用性设计,而不仅仅是业务需求实现细节。
  • 合格参与者:评审应包括熟悉受影响模块和相关系统的相关人员,以更好的评估变更风险和影响范围。
  • 标准化审查清单:技术审查需要建立明确的关注点清单,以帮助参与者识别常见问题,包括接口限流、熔断、降级、超时、重试、版本兼容性以及各种隔离策略。

卓越的代码审查

代码审查在开发过程中是关键性的稳定性保障。质量保证建议包括:

  • 无评审,不部署:未评审的代码绝不进入生产环境。这一原则源于无数生产事故,要求严格遵循,不容例外。
  • 统一编码规范:团队需要一致的编码风格标准,以显著提高代码审查效率和可维护性。
  • 工具辅助审查:自动化工具擅长识别代码的基本问题,如潜在的空指针异常。与部署平台集成可以在代码质量问题解决之前防止沙盒部署。
  • 关注高层级问题:代码审查应强调整体风格、模式、性能和安全性,而不是陷入实现细节。
  • 时间管理:个人评审会议不应超过 2 小时,以保持专注度和评审质量。
  • 专业态度:评审旨在识别代码风险和减少系统漏洞,而不是展示优越性或制造对抗。

生产部署标准化

部署是生产问题的高风险时期,因为涉及系统部署、数据更新、配置变更和中间状态复杂化。成功的部署需要三种能力:监控、渐进式发布和回滚。

  • 全面监控:部署监控包括业务和技术指标 —— 订单量波动、接口可用率、CPU 利用率、磁盘使用率、网络性能和异常日志。
  • 渐进式发布:渐进式部署限制了变更的影响范围,将问题控制在可控边界内。发布可以按照技术维度(服务器、数据中心、区域)或业务维度(用户、商家、类别)进行。
  • 快速回滚:通过功能开关或先前版本部署实现即时回滚能力,从而快速解决问题,以及针对被破坏的中间状态进行数据回滚。

在软件部署期间,可以采用金丝雀策略,将 90% 流量导向旧版本,10% 导向新版本在软件部署期间,可以采用金丝雀策略,将 90% 流量导向旧版本,10% 导向新版本

有效的监控和告警

业务报告问题是最慢的问题发现方法,在技术团队意识到问题之前就已经对用户造成了影响。监控和告警系统能提供及时的风险检测并最小化问题的影响范围。

  • 全面且精确的告警:核心业务关键点需要完整的监控覆盖,无任何遗漏,包括技术和业务指标。然而,过多的告警会产生噪音,干扰真正重要的通知。
  • 多工具集成:实践中存在许多关键监控空白,导致系统处于未监控状态,拖延了问题发现。团队应利用多种监控工具,并针对特定业务需求开发定制监控解决方案。
  • 精准业务监控:当平台工具无法满足特定需求时,团队必须开发定制化监控工具,用于业务特定数据的验证和告警。

有效的监控结合了平台级别的系统监控(日志、网络、数据库、线程池、接口响应率)与针对特定业务指标的定制化业务监控,并采用多种告警方式,包括邮件、企业消息和短信。

显示关键系统指标的监控面板,包括服务器请求、CPU 和内存使用率、页面加载时间、登录次数以及随时间波动的网络流量显示关键系统指标的监控面板,包括服务器请求、CPU 和内存使用率、页面加载时间、登录次数以及随时间波动的网络流量

应急响应机制

生产问题通常源于三种来源:主动发现、业务反馈和监控告警。无论那种方法,团队都需要建立响应机制以最小化影响和损失。

  • 及时响应:立即关注并解决问题,同时适当重视生产问题。
  • 保留问题上下文:保留问题现场证据以供后续调查和根因分析。
  • 信息同步:向包括领导层、业务团队和相关方在内的利益相关者传达相关问题信息和进展更新。
  • 影响范围评估并缓解业务问题:与业务团队合作评估影响,并在实际损失发生时优先恢复服务。常见恢复方法包括回滚、重启、扩容、节点隔离和功能降级。
  • 二次验证:服务恢复后继续监控技术和业务指标,以确认正常运行。

根因分析需要充分的知识基础、有效的诊断工具(日志平台、分布式追踪、监控系统、JVM 性能工具),以及基于特定场景的适当方法。

事件规划和响应工作流程,展示了从初始情况评估到计划执行和修订的五阶段模型事件规划和响应工作流程,展示了从初始情况评估到计划执行和修订的五阶段模型

定期检查与回顾分析

除了预防和应急响应,定期检查系统能保持对稳定性的长期关注。诸如慢 SQL 查询、偶尔的接口超时和未响应消息等问题需要仔细关注、持续监控和定期整改。

重大问题和严重事件需要进行彻底的回顾分析,以吸取教训并防止类似事件再次发生。在无事件期间进行定期回顾分析有助于团队回顾目标、评估结果、分析原因并总结经验,用于知识库建设和团队学习。

实施成功因素

系统稳定性建设是长期、持续的过程,需要持续投入和系统性方法。成功取决于几个关键因素:

  • 基础资源投资:有意义的稳定性提升需要技术和业务团队在资源分配上达成共识。
  • 平衡方法:避免引入新风险的激进变更。实施稳步、安全的螺旋式改进,强调学习和优化。
  • 文化发展:通过培训、共享经验和积极强化以质量为导向的行为,培养团队范围内的稳定性意识。
  • 流程演进:根据经验教训和行业最佳实践,持续优化开发、部署和事件响应流程。
  • 测量与反馈:建立明确的指标、定期评估周期和反馈机制,以跟踪进展并指导改进。
  • 跨职能协作:通过共享目标和沟通协议,确保开发、运营、测试和业务团队之间的协调一致。

可持续稳定性文化

长期系统稳定性需要将稳定性原则融入组织文化和日常实践中。这种文化转型涉及:

  • 共同责任:每位团队成员都理解自己在维护系统稳定性中的角色,从初始设计到生产支持。
  • 持续学习:定期举行知识分享会、事件回顾和行业最佳实践讨论,以保持团队的专业知识和意识。
  • 主动心态:团队预见潜在问题,而非仅仅对问题做出反应,投资于预防而非救火。
  • 质量整合:稳定性考虑应无缝融入开发工作流程,而不是被视为独立的可选活动。
  • 业务合作:技术和业务团队作为合作伙伴,共同平衡功能开发速度与系统可靠性,共同承担结果的责任。

构建系统稳定性需要耐心、坚持和系统性的执行。虽然初始进展可能看起来缓慢,但持续应用这些原则和实践最终会在系统可靠性、团队生产力和业务成果方面带来可衡量的改进。在全面构建稳定性方面的投资将通过事故频率的降低、恢复时间的加快和增强对系统支持业务增长能力的信心而获得回报。