在过去的几年里,基于单元的架构(Cell-Based Architecture)已经成为一种新兴的范式,Slack(将最关键的面向用户的服务从单体架构迁移到了基于单元的架构)、Flickr(采用联邦方法将用户数据存储在许多服务的分片或集群上)、Salesforce(设计了一个基于 Pod 的解决方案,功能自足,由 50 个节点组成)以及 Facebook(提出了包含称为单元的服务构建块,每个单元由一个集群、元数据存储和 Zookeeper 中的控制器组成)等公司都采用了这种架构。他们使用这种架构来应对弹性和容错性方面的挑战。其流行的原因包括故障隔离、更好的可扩展性、简化的维护、增强的容错性、灵活性以及成本效益。
在实现弹性和容错性的过程中,基于单元的(Cell-based)架构的支持者一直依赖于可观测性,这在补充实现方面发挥了至关重要的作用。Interact 就是这种情况,它是最早证明可观测性对于保证健康的基于单元(Cell-based)的架构是至关重要的公司之一。Interact 的工程团队使用可观测性来深入了解系统行为,使它们能够主动检测问题,并促进更快地从故障中恢复。具体来说,它们使用了最大数量的的托管客户端和每个单元最大数量的的每日请求来在现有架构的基础上创建了新的基础设施。
本文深入探讨了采用基于单元(Cell-Based)的架构的弹性和容错优势,重点关注可观测性方面。第一部分解决了一个常见的问题:如果微服务已经具有弹性和容错性了,为什么还要使用基于单元的架构?在解释了这一问题之后,第二部分将重点介绍可观测性以及分析基于单元(Cell-based)的架构的输入和输出的注意事项。最后,本文介绍了最佳实践和要点,以实现早期发现问题、快速诊断问题并做出明智决策所需的可见性,从而增强弹性和容错性。
1 如果微服务已具有弹性和容错性,为什么还要使用 Cell-Based 架构?
事实上,微服务降低了单个错误可能导致整个系统崩溃的风险,因为它们使用了更小且可独立部署的单元。这种范式允许微服务中的故障不会影响到整个应用程序。然而,处理服务间通信带来的复杂性也会降低弹性和容错水平,这也是一个现实。虽然微服务非常适合处理专注于模块化和可管理性的大型企业应用程序,但基于单元的架构在需要极端模块化、可扩展性和资源效率的场景中具有优势。这就是为什么 Tumblr(它在几个月内从初创公司发展成为一家非常成功的公司)更愿意从单体(Monolith)架构迁移到基于单元(Cell-Based)的架构,而不是微服务(Microservice)的原因。可扩展性是他们的首要任务,因为他们必须在处理流量逐月大幅增长的同时发展基础设施。
Cell-Based 的策略:满足快速增长需求的高可用性
选择基于微服务的架构需要仔细分析其优缺点之间的平衡。虽然它提供了更好的可扩展性、容错性和更简单的操作,但它也带来了实施和管理的复杂性。然而,基于单元的架构非常适合优先考虑高可用性的系统,这些系统需要经历快速增长,或者需要优先考虑扩展单个组件和隔离故障的能力。
Cell-based 架构不是一种通用的解决方案,而是一种符合特定业务和技术需求的战略选择。图 1 说明了基于微服务的架构如何将较大的系统划分为封装有界上下文业务域的组件。图 2 显示了基于单元的架构如何简化与这些服务之间的通信相关的复杂性,其中每个单元都是相同的,并且代表可独立扩展的整个堆栈。
图 1:基于微服务的构
图 2:基于单元的架构
关于图 2,实现基于单元的架构有两种视角:一种是单元是共同提供服务的不可变组件,另一种是每个单元都是相同的,并且代表整个服务。在第一种视角下,单元可以相互通信。在第二种视角下,由于单元之间没有通信,因此单元作为一个完整的单元独立构建、部署和管理。
基于单元的架构可以提供更好的弹性和容错性,但运维人员如何确定系统是否提供了这些好处?答案是可观测性。
2 观测 Cell-based 架构的注意事项
基于单元(Cell-based)的架构为构建弹性系统提供了一种稳健的方法。他们通过隔离、自治和复制的核心原则来实现这一目标。每个单元独立运行,管理其资源并自主做出决策。数据和关键服务在单元内复制,以增强可用性。
这种架构将单元分布到多个区域或数据中心,以确保弹性和容错性,防止区域中断。持续的健康检查和监控可以及早发现故障,而熔断器可以防止级联故障。负载平衡确保了高效的流量分配,而优雅的降级可在部分故障期间优先考虑基本功能。混沌工程通过模拟故障来定期测试弹性。
可观测性是理解当前实现的状态和内部工作原理的最先进的工具。尽管系统可以在没有可观测性的情况下工作,但收集、处理、聚合和展示实时定量指标可以提高弹性和容错性。这正是将其作为站点可靠性工程原则的原因之一。
可观测性是伟大架构的支柱
除了作为理解系统行为的策略外,可观测性对于实现良好架构的目标至关重要,特别是在卓越运维、可靠性和性能效率方面。图 3 展示了架构良好的框架的共同支柱,并展示了它们与可观测性的关系。在卓越运维方面,可观测性提供了理解系统性能、识别潜在问题以及做出优化决策所需的洞察力。为了实现性能效率,可观测性使组织能够识别其系统中的瓶颈和低效率,以便他们采取行动来提高性能并降低成本。最后,可靠性,通过监控系统行为并尽早检测异常,可观测性有助于防止故障并最大限度地减少停机时间。
图 3 架构良好的框架 + 可观测性
在观测基于单元的架构的过程中,第一步是定义目标并确定指标,如平均故障间隔时间(MTBF)、平均修复时间(MTTR)、可用性和恢复时间目标(RTO),这些指标非常适合评估弹性和容错水平。一旦指标明确,下一步就是提供结合日志记录、指标收集、跟踪和事件跟踪的检测机制来收集相关数据。然后建立一个强大的基础设施来有效地收集和聚合这些数据。此时,观测者通常将收集到的数据存储在适当的存储库(如时间序列数据库)中,并通过过滤、转换和增强对其进行处理。分析工具和可视化可以获得见解,识别模式并检测异常。这些见解被整合到开发和运维工作流程中,建立了反馈回路,推动系统的设计和性能改进。最后,根据反馈和不断变化的需求,对检测、数据收集和分析进行持续调整,不断迭代完善该过程。完整的过程如图 4 所示。
为 Cell-based 架构量身定制的可观测性
基于单元的架构的可观测性需要一种量身定制的方法来应对这种分布式系统设计带来的独特挑战和机遇。考虑到可观测性是关于监视、跟踪和日志记录的,单元感知工具包括在单元级别的收集指标,也就是说,一般来说,捕获资源利用率(CPU、内存、网络)、请求延迟、错误率以及与每个单元功能相关的自定义业务指标。分布式跟踪是关于实现跨单元边界跟踪请求的跟踪,提供对交互流程的洞察,并精确定位瓶颈。最后,日志聚合应该从单个单元聚集到一个集中式的系统中,从而允许在整个架构中进行关联和分析。
第二个需要考虑因素是针对每个单元的特定功能和 KPI 创建量身定制的单元级仪表板,以便进行适当的监控和故障排除。通过此配置,基于特定单元阈值和异常的特定单元预警可确保及时通知影响单个单元的问题。
与可观测性最佳实践相关的第三个考虑因素是,需要一个独特的项目,将来自各种单元级的可观测性工具的数据整合到一个集中式的平台中,以进行整体监测和分析。这使得利用集中式平台跨单元关联事件和指标变得更加容易,从而揭示依赖关系和潜在的级联故障。
图 4 Cell-Based 架构的可观测性拟议框架。
最后一个考虑因素是单元隔离,它测试单个单元以识别其功能特有的性能瓶颈和故障模式。考虑到这一点,预计需要设计和开发混沌实验,以允许在单元级别进行受控的中断(例如网络延迟、资源限制),从而评估弹性并识别薄弱点。
通过实施这些实践,组织可以深入了解基于单元的架构的行为,从而实现主动监控、更快的故障排除,并提高整体系统的可靠性和性能。请始终记住,单元本身的组成可能因业务而异,这可能是一个优势,因为多样性正是基于单元的架构的好处之一。
3 路由层如何提供弹性、容错性和可观测性
除了单元和控制平面之外,单元路由对于在基于单元的架构中提供弹性和容错性至关重要。它的任务是根据分区键将请求分发到正确的单元,向客户端提供单个端点。根据 DoorDash 的说法,该组件提供了几个好处,包括保持流量平衡,即使服务在可用区域之间分布不均。这使得在 Pod 之间动态设置流量权重成为可能,消除了手动操作,并减小了单个或多个可用区(AZ)中断的爆炸半径,这对于容错和减少流量延迟至关重要,因为调用者服务连接到更近的被调用者上。
为了在网络中实现容错,路由层使用了几种机制,这些机制已被记录为提供弹性的创新解决方案。其中之一是路径冗余,即路由协议发现并维护到目的地的多条路径;这样,如果主路径发生故障,流量将自动通过备用路径重新路由。另一种策略是快速重新路由,旨在快速检测故障并收敛到新的路由解决方案,最大限度地减少停机时间和服务中断;经典的负载平衡,在多条路径上分配流量,防止拥塞并优化网络资源利用率。最后,故障检测和恢复,一旦检测到故障,路由协议会触发恢复过程以找到替代路径。
路由层在架构可观测性中的作用
由于基于单元的系统的分布式特性,路由层也会显著影响其可观测性。由于它是一个集中式单元操作的组件,因此它是提供对整个系统健康和性能见解的最佳候选者。通过此组件观测架构,可以了解网络中不同点的流量模式、延迟和错误。这使运维人员能够查明瓶颈,识别故障组件,并优化路由决策以获得更好的性能。
此外,可以对路由层进行检测以收集详细的指标和日志,为故障排除和根本原因分析提供有价值的数据。例如,跟踪跨多个单元的请求路径可以揭示延迟发生或错误起源的位置。这种细粒度的可见性对于保持复杂的基于单元(Cell-based)的应用程序的可靠性和效率至关重要。
综上所述,基于单元(Cell-based)的架构中的路由层不仅负责引导流量,而且是可观测性的关键组件。监控和分析流量模式可以提供对系统行为的宝贵见解,从而实现主动故障排除和优化。这可确保基于单元的系统保持弹性和可扩展性,并在不同的工作负载下达到最佳性能。
4 为 Cell-based 架构提供弹性、容错性和可观测性的最佳实践
基于单元(Cell-based)的架构中的可观测性对于维护系统健康和性能至关重要。一个基本的最佳实践是集中式日志记录,将所有单元格的日志聚合到一个统一的存储库中。这种整合简化了故障排除和分析,使运维人员能够快速识别和解决整个系统中的问题。结构化的日志格式通过实现日志数据的高效查询和过滤,进一步增强了这一过程。
度量和监控
度量和监控同样是可观测性的重要组成部分。收集有关单元性能、资源利用率和错误率的详细指标,可以为系统行为提供有价值的见解。基于这些指标设置仪表板和预警,可以主动识别异常和潜在瓶颈。Grafana 等可视化工具可以有效地展示这些指标,从而更容易发现可能表明潜在问题的趋势和模式。
分布式跟踪
分布式跟踪是理解通过基于单元(Cell-based)的架构的请求流的另一项重要实践。通过跟踪请求在多个计算单元之间的移动,运维人员可以查明性能瓶颈、延迟问题和微服务交互中的故障。Jaeger、Zipkin 或 AWS X-Ray 等分布式跟踪工具可以帮助可视化这些复杂的交互,使诊断和解决单元间通信产生的问题变得更加简单。
预警和事件管理
预警和事件管理是全面可观测性策略不可或缺的一部分。根据日志和指标中的预定义阈值或异常配置预警,可以及时通知潜在问题。这些预警可以通过电子邮件和短信等各种渠道发送,也可以集成到 PagerDuty 等事件管理平台中。具有明确的事件管理流程可确保对预警做出快速且有组织的响应,最大限度地减少停机时间和对整个系统的影响。
可观测性的整体方法
除了这些核心实践之外,采用整体的可观测性方法也是有益的。这包括定期审查和改进日志记录、监控和跟踪配置,以适应不断变化的系统需求。此外,结合事件事后分析的反馈可以帮助确定可观测性策略中需要改进的领域。通过不断提高可观测性,组织可以确保其基于单元(Cell-Based)的架构保持弹性、高性能且易于管理。
作者介绍
Yury Niño Roa 谷歌云基础设施工程师,拥有 8 年以上使用敏捷方法(如 scrum 和看板等)设计、实施和管理软件应用程序开发的经验。拥有 3 年以上的 DevOps 和 SRE 经验,支持、自动化和优化关键任务部署,利用配置管理、CI/CD 和 DevOps 流程。软件工程教授兼研究员。对解决性能、弹性和可靠性问题,使用混沌工程和研究人为错误,系统安全以及缺乏监控和可观测性等感兴趣。
查看原文链接:
https://www.infoq.com/articles/cell-based-architecture-resilient-fault-tolerant-systems/
评论