如今软件无处不在 - 从我们的手机到汽车和电器。这意味着软件系统的可靠性、健壮性和弹性非常重要。 弹性系统可以承受故障或错误而不会完全崩溃。容错能力是弹性的关键部分。即使出现问题,它也能让系统保持正常工作。
在本文中,我们将了解为什么弹性和容错能力对业务很重要。我们还将讨论构建容错系统的核心原则和策略。这包括冗余、故障转移、复制和隔离等内容。此外,我们将研究不同的测试方法如何识别潜在问题并提高弹性。最后,我们将讨论弹性系统设计的未来。云计算、容器和无服务器平台等新兴趋势正在改变弹性系统的构建方式。
韧性的重要性
系统故障可能会损害业务和技术运营。从业务角度来看,中断会导致收入损失、声誉受损、客户不满意以及竞争优势丧失。例如,2021 年,Reddit、Spotify 和 AWS 等主要在线服务宕机了几个小时。这次中断造成了数百万美元的损失,也让用户感到沮丧。同样,2021 年的一次维护错误导致 Facebook 及其服务在全球范围内中断约六个小时。数十亿用户和广告商受到影响。
在技术方面,系统故障可能会导致数据丢失或损坏、安全漏洞、性能问题和复杂性。例如,2020 年 Garmin 遭受勒索软件攻击,扰乱了其在线服务和健身追踪器。最近,即 2023 年,人为因素导致澳大利亚的 Microsoft Azure 服务器出现严重中断。
因此,构建弹性和容错系统至关重要。这样做可以防止或最大程度地减少系统故障对业务和技术运营的影响。
了解容错系统
即使出现问题,容错系统也能保持正常工作。故障是导致系统行为与预期不同的任何问题。故障可能是由硬件故障、软件错误、人为错误或断电等环境因素引起的。
在具有大量服务和子服务、数百台服务器并分布在不同数据中心的复杂系统中,小问题总是会发生。这些问题一定不能影响用户体验。
构建容错能力的三个主要原则:
- 冗余- 出现故障时可以接管的额外组件。
- 故障转移 - 当检测到故障时自动切换到备份组件。
- 复制 - 创建服务器或数据库等组件的多个相同实例。
消除单点故障至关重要。系统的设计必须确保没有任何单个组件对运行至关重要。如果该组件发生故障,系统可以通过冗余和故障转移继续工作。
这些原则使得容错系统能够检测故障、解决故障并在故障发生时进行恢复。这增加了整体弹性。通过避免过度依赖任何一个组件,可以提高整个系统的可靠性。
构建弹性系统的策略
在本节中,我们将讨论容错系统的三个原则中的每一个,并提供有效使用它们的系统示例。
冗余
冗余涉及拥有备用或替代组件,以便在出现故障时可以接管。它可以应用于硬件、软件、数据或网络。优点包括提高可用性、可靠性和性能。冗余消除了单点故障并实现了负载平衡和并行处理。
示例:负载平衡的 Web 应用程序
-
该 Web 应用程序在 3 个区域的 20 台服务器上运行
-
全局负载均衡器监控每台服务器的健康状况
-
如果美国东部的 2 个服务器发生故障,平衡器会将流量路由到美国西部和欧洲的其余服务器
-
避免单一区域故障可提供连续的正常运行时间
故障转移
故障转移机制检测故障并自动切换到备份。这可以保持连续性、一致性和数据完整性。故障转移允许在发生故障后顺利恢复操作。
示例:无服务器视频编码
-
媒体编码功能在 AWS Lambda 等无服务器平台上运行
-
平台跨多个可用区 (AZ) 自动扩展实例
-
可用区故障会禁用这些功能实例
-
其他实例在剩余可用区中启动以处理负载
-
故障转移提供弹性编码能力
复制
复制涉及在多个位置维护数据或软件等资源的相同副本。它提高了可用性、耐用性、性能、安全性和隐私性。
示例:高可用性数据库集群
-
2 个数据库节点配置为主动-被动集群
-
主动节点处理所有事务,而被动节点复制数据
-
集群管理器检测到主动故障并自动将被动提升为主动
-
虚拟IP地址迁移到新的主动节点以重定向客户端连接
-
故障转移提供数据库服务器崩溃的无缝恢复
测试在弹性系统中的作用
测试在构建弹性、容错系统方面发挥着关键作用。测试有助于在潜在的弱点造成真正的故障或中断之前识别并解决它们。有多种针对弹性的测试方法,包括混沌工程、压力测试和负载测试。
这些技术模拟现实的故障场景,例如硬件崩溃、流量峰值或数据库过载。目标是观察系统如何响应并找到提高容错能力的方法。测试验证冗余、故障转移、复制和其他策略是否按预期工作。
所有大型 IT 公司都会进行弹性测试。 Netflix 在这方面处于领先地位。他们使用模拟以及系统或区域的受控关闭部分来识别任何需要修复的漏洞。此类测试的受控性质允许在不影响用户体验的情况下识别系统可靠性方面的差距。与意外发生此类中断并影响用户体验的情况相比。
弹性系统架构的未来
弹性系统架构领域正在不断发展并适应新兴趋势和技术带来的新挑战和机遇。让我们来谈谈当今影响弹性系统设计和开发的一些趋势和技术。
-
云计算提供灵活的可扩展性来应对使用高峰和峰值负载。它通过自动化简化了增加容量或更换故障组件的过程。丰富的无服务器计算能力可实现冗余和动态故障转移。这些云属性有助于构建可弹性扩展的弹性系统。
-
微服务将整体应用程序分解为独立的模块化服务。每个服务都专注于特定功能并通过 API 进行通信。这可以实现故障隔离以及每个服务的独立扩展/更新。微服务可以轻松复制和负载平衡以实现高可用性。松散耦合和小型代码库也有助于恢复能力。
-
容器将代码与依赖项和配置打包在一起,以便跨环境进行可预测、可移植的执行。容器共享主机资源,但彼此隔离运行。这通过一致的部署、故障遏制和资源效率提高了弹性。容器简化了管理。
-
无服务器计算抽象了服务器和基础设施。开发人员只需编写可自动扩展的功能代码片段。无服务器平台处理配置、扩展、修补等。基于使用情况的定价可降低成本。通过消除服务器管理职责,无服务器计算简化了弹性系统的构建。
-
监控通过指标、日志记录和跟踪提供对系统运行状况和行为的实时可见性。该数据可以识别/诊断故障和性能问题。可观察性工具可帮助团队了解故障、调整系统并提高可靠性。强大的监控是有效运行弹性系统的关键。
结论
弹性是跨行业和应用程序的系统的关键品质。通过应用冗余、故障转移、复制和严格测试等核心原则,我们可以开发容错系统,在故障期间提供可靠性、可用性和持续服务。随着云计算、微服务和无服务器架构等技术趋势的广泛传播,弹性的新机遇和挑战也随之出现。然而,通过及时了解领先实践、跨领域协作并牢记反脆弱性的最终目标,工程师可以打造出具有弹性设计的系统。尽管形势将继续发展,但本文涵盖的策略和思维方式将作为坚实的基础。弹性是一个旅程,而不是目的地,但通过明智的架构和测试,我们可以构建为未来做好准备的系统。
作者:Maria Rogova
更多技术干货请关注公号【云原生数据库】
squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。
irds.cn,多数据库管理平台(私有云)。