站点可靠性工程(SRE)实战
上QQ阅读APP看书,第一时间看更新

如前所述,软件工程领域正在经历许多干扰和转变,以应对硬件工程领域中的转变。当前,在软件工程领域有敏捷、代理、组合、面向服务、多语言和自适应编程风格。在撰写本书时,软件工程领域正在加速利用有能力的开发框架来构建响应性和认知应用程序。在基础架构方面,我们拥有强大的云环境作为托管和运行业务工作负载的一站式IT解决方案。尽管如此,通过减少管理员的人工干预、解释和参与,以实现人们所希望的云操作时仍然存在许多重大挑战。已经有几项挑战通过突破性的算法和工具实现了自动化。但仍有一些空白需要利用强大的技术解决方案来填补。这些众所周知且广泛使用的挑战包括动态和自动化的容量规划与管理、云基础设施调配和资源分配、软件部署和配置、修补、基础设施和软件监控、测量和管理等。此外,如今的软件包经常被更新、修补并发布到生产环境中,以满足客户、消费者新兴和不断变化的需求。同时,应用程序组件(微服务)的数量也在快速增长。简而言之,必须通过大量的自动化工具来确保IT敏捷性。在SRE的全面支持下,运营团队必须预想并保护高度优化和有组织的IT基础设施,以成功、明智地托管并运行下一代软件应用程序。准确地说,当前的挑战是云操作的自动化和编排。云必须通过自助服务、自我配置、自我修复、自我诊断、自我防御和自我管理才能成为自主云。

新兴的SRE领域被认定为可行的前进方向。对系统软件工程有特殊爱好的新一代软件工程师被认为最适合归类为SRE领域。这些技术娴熟的工程师将培训软件开发人员和系统管理员,使他们能够敏锐地实现高性能、高可靠性的软件解决方案、脚本和自动化工具,从而快速设置和维护高可靠性、动态、响应性和可编程的IT基础设施。SRE团队真正关心的是任何使复杂软件系统以无风险和连续的方式在生产中工作的事情。简而言之,站点可靠性工程师是软件工程师和系统工程师的结合。由于云中心无处不在,可满足全球的IT需求,因此“站点”一词代表了云环境。

SRE通常关心基础设施编排、自动化软件部署、适当的监控和警报、可扩展性和容量评估、发布过程、灾难准备、故障转移和故障恢复功能、性能工程和增强(PE2)、垃圾回收器调整、发布自动化、容量提升等。SRE通常也会对良好的测试覆盖率感兴趣。站点可靠性工程师是专门研究可靠性的软件工程师。SRE有望将成熟、有前景的计算机科学、工程原理应用于企业级、模块化、Web规模和软件应用程序的设计与开发。

SRE负责确保云IT平台和服务的系统可用性、性能监控和事件响应,他们必须确保进入生产环境的所有软件应用程序完全符合一系列重要要求,例如图表、网络拓扑图、服务依赖性详细信息、监视和日志记录计划、备份等。一个软件应用程序可能完全符合所有功能要求,但还有其他来源可能造成系统的中断。可能存在硬件降级、网络问题、资源使用率高或应用程序响应缓慢等问题,这些可能随时发生。站点可靠性工程师需要极其敏感。SRE的有效性可以作为平均恢复时间(MTTR)和平均失效时间(MTTF)的函数来测量。换句话说,SRE必须保证在故障发生时系统功能的可用性。同样,当系统负载急剧变化时,系统必须具有扩缩容的固有潜力。

软件开发人员通常开发应用程序的业务功能,并对从头开始创建的功能或由不同的、分布式的和分散的服务组成的功能进行必要的单元测试。但他们并不总是专注于创建和合并代码以实现可伸缩性、可用性、可靠性等。另一方面,系统管理员负责设计、构建和维护组织的IT基础设施(计算、存储、网络和安全性)。系统管理员确实尝试通过调整基础设施的规模和提供其他基础设施模块(裸机[BM])服务器、虚拟机[VM]服务器和容器)来实现这些QoS属性,从而权威地解决任何突然涌入的用户和更大的负载。如前所述,DevOps的核心目标是在运营和开发团队之间建立健康和有效的关系。开发人员和运营人员之间的任何间隙与摩擦应该最早由站点可靠性工程师识别和消除,以便在任何机器或集群上运行任何应用程序,而无须进行任何调整。最关键的挑战是如何确保NFR/QoS属性。

SRE解决了管理员和DevOps专业人员不能解决的一个非常基本但重要的问题。必须确保基础设施的易伸缩性和可恢复性,以保证应用程序的可扩展性和可靠性。必须通过对业务应用程序和IT服务的实时监控以及为客户提供舒适的使用,来保证业务连续性和生产效率。仅通过基础设施优化来满足已确定的NFR概念既不可行也不可持续。NFR必须通过熟练地使用应用程序源代码本身中的所有相关代码片段来实现。简而言之,任何应用程序的源代码都必须知道并且能够轻松地吸收底层基础设施的容量和能力。也就是说,我们注定要进入基础设施感知的应用程序的时代,而另一方面,我们正朝着应用程序感知的基础设施迈进。

这就是站点可靠性工程师该做的工作,他们将协助开发人员和系统管理员通过软件定义的云环境开发、部署和交付高度可靠的软件系统。站点可靠性工程师将一半的时间花在开发人员身上,而另一半时间则花费在运营团队上,以确保急需的可靠性。站点可靠性工程师设置了清晰且以数学建模为基础的服务等级协议(SLA),为软件应用程序的稳定性和可靠性设置了阈值。

站点可靠性工程师具有很多技能。

  • 对复杂的软件系统有深入的了解。
  • 是数据结构方面的专家。
  • 非常擅长设计和分析计算机算法。
  • 对新兴技术、工具和技术有广泛的了解。
  • 在编码、调试和解决问题方面充满热情。
  • 具有很强的分析能力和直觉。
  • 能从错误中快速学习,并在随后的过程中消除它们。
  • 他们是团队成员,愿意相互之间分享获得和收集的知识。
  • 喜欢快节奏的工作环境。
  • 擅长阅读技术图书、博客和出版物。
  • 撰写并发布技术论文、专利和最佳做法。

此外,站点可靠性工程师还具备下述能力并将自己定位为单一联系点(SPOC)。

  • 对代码设计、分析、调试和优化有很好的理解。
  • 对各种IT系统有广泛的了解,从应用程序到设备(服务器、存储),再到网络组件(交换机、路由器、防火墙、负载平衡器、入侵检测和防御系统等)。
  • 能胜任下面这些新兴技术。
    • 软件定义的云,用于高度优化和组织的IT基础设施。
    • 为变更提供可操作的数据分析。
    • 物联网以人为中心的应用程序的设计和交付。
    • 容器化支持的DevOps。
    • 简化IT运营的FaaS。
    • 企业移动化。
    • 用于物联网数据和设备安全的区块链。
    • 用于预测性和规定性见解的AI(机器和深度学习算法)。
    • 用于实现更智能应用程序的认知计算。
    • 用于性能递增、故障检测、产品生产效率和弹性基础设施的数字孪生。
    • 熟悉各种自动化工具。
    • 熟悉可靠性工程概念。
    • 精通关键术语和流行语,如可伸缩性、可用性、可操作性、可扩展性和可靠性。
    • 在IT系统运营、应用程序性能管理、网络安全攻击方向颇有专长。
    • 洞察力驱动的IT运营、管理、维护和增强。

对于站点可靠性工程师来说,确保软件应用程序的稳定性和最长的正常运行时间是首要任务。但是,他们应该有能力承担责任并以自己的方式编写代码,从危险、障碍中解脱出来。这些事情无法添加到开发团队的待办事项列表中。站点可靠性工程师通常是对系统、网络、存储和安全管理充满热情的软件工程师。他们必须拥有独特的开发和运营实力,并且非常熟悉各种脚本语言、自动化工具和其他软件解决方案,以便快速自动化IT运营、监控和管理的各个方面,尤其是应用程序性能管理、IT基础设施编排、自动化和优化。虽然自动化是站点可靠性工程师的关键能力,但他们应该能自学并获得经验,以获得以下技术和工具的专业知识。

  • 面向对象语言、函数语言和脚本语言。
  • 数字技术(云、移动性、物联网、数据分析和安全性)。
  • 服务器、存储、网络和安全技术。
  • 系统、数据库、中间件和平台管理。
  • 分区(虚拟化和容器化)范式、DevOps工具。
  • MSA模式。
  • 设计、集成、性能、可伸缩性和弹性模式。
  • 集群、网格、实用程序和云计算模型。
  • 软件和硬件系统故障排除。
  • 动态容量规划、任务和资源调度、工作负载优化、VM和容器放置、分布式计算和无服务器计算。
  • 支持人工智能的操作、性能、安全和日志分析平台。
  • 云编排、治理和代理工具。
  • 自动化软件测试和部署模型。
  • OpenStack和其他云基础设施管理平台。
  • 数据中心的优化和转型。