如何基于服务网格构建高可用架构

简介: 分享如何利用服务网格构建更强更全面的高可用架构

【阅读原文】戳:如何基于服务网格构建高可用架构

 

引言

 

 

在业务迭代演进的过程中,伴随着业务承载的价值逐步增长,稳定性成为了企业建设数字化系统最重要的基石。在建设业务架构时,如何高可用成为了首当其冲的课题,或许没有之一。对于云产品来说,天生构建在多地域、多可用区的基础设施之上,因此利用云产品为客户搭建可靠的高可用架构,解决稳定性顾虑,是云产品的重要能力。

 

一个完整的高可用技术架构,应当考虑两个方面的问题。其一:从部署的基础设施上,为避免单点故障,应当以多地理位置隔离部署,这就要求在多个地理位置有可用资源,另一方面,要求资源调度系统能够在多个地理位置的资源上正确调度。其二:需要有完善地服务保护能力,在可能对服务造成关键影响的场景中(突发流量,恶意流量),保护关键服务不被击垮。在云原生的大背景下,使用K8s+服务网格是云原生社区给出的标准解决路径,Kubernetes解决资源调度和管理;服务网格则负责管理更进阶的安全、流量和可观测。本文则将展开探讨,如何利用服务网格构建高可用的业务系统。

 

 

 

 

构建可用区级高可用

 

 

- 使用多可用区部署 -

 

 

单一K8s集群的场景下,可以利用云上多可用区的特性进行高可用部署。阿里云ACK所有托管组件均严格采用多副本、多AZ均衡打散部署策略,确保在单个可用区或节点发生故障时,集群仍然能够正常提供服务。同时,集群内的WorkerNode、弹性容器实例也同样被打散在不同可用区。在发生可用区级别故障时(例如因不可控因素导致的机房断电、断网),健康的可用区仍然能够正常提供服务。

 

 

 

 

- 使用ASM熔断与限流提升全局可用性 -

 

 

除了将应用和基础设施打散部署,以物理隔离提供高可用保障。软件层面的保护仍然必不可少。熔断限流是广受认可的应用保护手段,应用熔断限流可以使得应用的整体可用性显著提高,控制局部问题的爆炸半径,并有效防止出现级联故障。

 

限流是保护服务端应用的手段,启用限流可以避免服务端被过多的流量击垮,让系统在不堪重负时自动降级,ASM支持本地、全局限流,以及更高阶的自定义限流规则(例如单一用户QPS限流等)

 

 

熔断是一种应用在客户端的,用于在上游(服务端)出现故障或超负荷的情况下,尽快将异常端点暂时熔断,从而尽可能不影响系统的全局表现。在传统的微服务应用中,一些开发框架提供了熔断功能。然而,与传统方式相比,服务网格提供的熔断不需要在每个服务的应用程序代码中进行集成,无感地保护目标服务免受过量请求的影响。

 

 

ASM的熔断限流支持比社区版本Istio更强的能力,支持更丰富的熔断限流条件(详情参考ASM产品文档中熔断限流的相关内容),从而保证应用尽可能获得更好的全局表现。

 

 

 

 

- 可用区流量保持 -

 

 

在多可用区部署场景下,使用由于工作负载被打散至多个可用区,基于K8s Service的负载均衡将均匀地分配流量到不同可用区的Pod。

 

 

跨可用区调用无疑增加了业务延迟,因此,在未发生故障时,调用始终保持在同一可用区是较为理想的状态。使用服务网格的地理位置优先能力,可以使得单次调用尽可能维持在同一可用区内,除非链路上某个应用发生了故障,才会failover到其他可用区:

 

 

 

- ASM高可用 -

 

ASM托管的控制面默认以多可用区进行打散,确保在单可用区发生故障时,仍然能够正常为数据面提供服务。同时,ASM数据面具备缓存能力,即使段时间内全部可用区都发生故障,数据面仍然能以缓存的配置进行工作。

 

 

 

总结

 

 

以单集群多可用区的方式容灾的优势在于其架构简单,用户的运维管理成本相对较低。但是,单集群意味着无法容忍地域级故障(例如单一地域因不可控因素、自然灾害等失效)。因此,要达成更高的可用性要求,不可避免地需要进行地域隔离的部署,我们将在剩余的篇幅中展开讨论。

 

 

 

 

构建地域级高可用

 

 

 

- 多地域多集群容灾 -

 

 

多地域部署则必须多集群进行部署。在多集群部署场景下,入口被切分成为两个,在正常(无故障)状态下,可以通过DNS将流量根据地理位置等策略分配至两个集群的入口。在这种场景中,使用阿里云智能DNS或阿里云全局流量管理(GTM)实现从DNS切流的能力,使用GTM结合健康检查条件,可以自动摘除不健康的入口。与此同时,仍应当使用ASM网关使集群入口获得更高级的熔断、限流能力,以保护集群内的业务。

 

 

在当前方案中,主要通过入口切换来将流量分配至健康寄去。这样的方式虽然简明有效,但是仍然有一些场景较为棘手:

 

1、全局切换不止切换

 

全局切换意味着全部流量的转移,这意味着一个集群要瞬间开始承接远大于日常负载的流量,这对于扩容速度、缓存重建等都是极大的挑战,如果这些工作未能做好,可能将原本无故障的机房也打垮,以上因素使得机房切换往往是需要人工参与操作并决断的。

 

 

2、无法应对复杂故障场景

 

对于复杂故障场景无法解决,例如,在cn-hangzhou集群某应用A故障,B集群应用B故障时,切换到哪个集群都无法彻底避免故障。

 

 

那么,在多集群场景下,是否存在除了全局切流以外的其他手段?答案是,使用服务网格实现非全局故障转移。ASM提供了多种多集群方案,其中,多实例互相服务发现方案为对可用性有最高要求的客户量身定制,通过将多集群的服务发现信息共享,可以实现将多个集群完全打通,从而实现在小故障(服务级、节点级、可用区级)发生时秒级无感切换,更可以在双侧都存在故障时,只要单一应用在任意一侧集群是正常的,即可保证应用全局可用。

 

 

 

- 基于ASM构建更完善的多集群容灾 -

 

 

ASM提供了管理多个集群的能力,在该场景下,在每个集群所在的地域(对于非阿里云集群则尽可能选择更接近的地理位置)创建ASM实例,并将另外一个地域的集群以仅服务发现模式加入到ASM中,此时,两侧的ASM都可以发现另外一个地域的所有服务。因此,在多集群场景中也可以实现与单集群场景下一样的自动故障回退能力和复杂场景的容错能力。

 

要实现多多集群场景的互相调用,则需要依赖路由打通,即从A集群的Pod可以直接连通B集群Pod,对于阿里云多地域场景,用户可以选择使用阿里云云企业网CEN打通物理网络。而对于阿里云集群+非阿里云集,非阿里云集群+非阿里云集群,云上集群+云下集群等复杂网络场景,往往存在无法将物理网络打通的限制,在这种场景下,ASM提供了通过公网打通的方式,通过使用ASM跨集群网关,可以利用公网在集群间通过公网建立一条mTLS的安全信道,用于必要的跨集群通信。

 

 

 

总结

 

 

要实现能够容忍地域级故障的高可用,势必需要进行多集群部署,多集群引入了多入口,仅支持从入口进行切换在一些场景下是不够的,使用服务网格打通多集群可以显著地提升多地域多集群场景下的容灾能力。阿里云服务网格支持管理任意K8s集群,使得任何K8s集群都可以借助服务网格获得更强的容灾能力。



我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关文章
|
19天前
|
监控 网络协议 Nacos
Nacos:构建微服务架构的基石
Nacos:构建微服务架构的基石
63 2
|
20天前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
24 3
|
22天前
|
运维 负载均衡 Shell
控制员工上网软件:高可用架构的构建方法
本文介绍了构建控制员工上网软件的高可用架构的方法,包括负载均衡、数据备份与恢复、故障检测与自动切换等关键机制,以确保企业网络管理系统的稳定运行。通过具体代码示例,展示了如何实现这些机制。
114 63
|
12天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
11天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
44 5
|
8天前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
26 2
|
9天前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
13天前
|
消息中间件 监控 安全
构建高效微服务架构:最佳实践与挑战
在现代软件开发中,微服务架构因其高度的可扩展性、灵活性和敏捷性而受到青睐。本文深入探讨了构建高效微服务架构的关键策略,包括服务的划分、通信机制、数据管理、部署与监控等方面的最佳实践。同时,文章也分析了在实施过程中可能遇到的挑战,如服务间的依赖管理、数据一致性问题、安全考量及性能优化等,并提出了相应的解决方案。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们在构建微服务系统时能够有效规避风险,提升系统的健壮性和用户体验。
|
19天前
|
监控 Java 微服务
从零构建微服务架构:一次深度技术探索之旅####
本文作为一篇深度技术分享,引领读者踏上自底向上搭建微服务架构的征途,旨在通过实战经验剖析,揭示微服务转型背后的技术挑战与解决方案。不同于常规摘要仅概述内容,本文摘要将直接以故事化手法,简述作者从单体应用困境出发,逐步迈向微服务化的心路历程,涵盖关键决策点、技术选型考量及实践收获,激发读者对微服务架构设计与实现的浓厚兴趣。 ####
|
17天前
|
监控 持续交付 数据库
构建高效的后端服务:微服务架构的深度解析
在现代软件开发中,微服务架构已成为提升系统可扩展性、灵活性和维护性的关键。本文深入探讨了微服务架构的核心概念、设计原则和最佳实践,通过案例分析展示了如何在实际项目中有效地实施微服务策略,以及面临的挑战和解决方案。文章旨在为开发者提供一套完整的指导框架,帮助他们构建出更加高效、稳定的后端服务。