微服务高可用容灾架构设计

news2025/1/23 12:52:26

导语

相对于过去单体或 SOA 架构,建设微服务架构所依赖的组件发生了改变,因此分析与设计高可用容灾架构方案的思路也随之改变,本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。

作者介绍

刘冠军  腾讯云中间件中心架构组负责人、专家工程师
15年 IT 从业经验,第一份工作服务于 IBM 中国实验室,曾任职 IBM 大型机中间件研发总监。现任腾讯云专家工程师,中间件中心架构组负责人,负责中间件产品中心架构师团队及 PaaS 平台产品售前工作。共获得16项专利授权,在事务处理、web 服务、微服务、消息队列和银行架构等方面有着丰富经验,支持过国内外多家大中型客户。

概述

相对于 SOA 架构,微服务架构使用去中心化的方式组织业务应用,服务之间的通信不需要经过总线,服务路由的逻辑下发到各个微服务中自行完成。另一方面,微服务架构也离不开中心化的组件实现服务治理、应用部署、监控等功能,微服务场景下主备、多活等高可用容灾方案的设计需要通盘考虑。

image-20220720165129501.png

在分析复杂的容灾架构前,我们首先应当明确问题的定义,拆解问题,分解子问题,从不同维度分开讨论才能获得一个清晰的结论。当我们讨论主备、双活等高可用模式时,不同的高可用模式对于应用、数据库、注册中心等组件的含义不是一样的,但各组件又相互关联。在笔者看来,一个完整的微服务架构组件包含三个维度:

  • 微服务管控层:由于分布式架构带来了复杂性,需要引入相关的分布式支撑组件
  1. 应用生命周期管理组件:负责应用发布、回滚、弹性伸缩、故障转移,微服务架构对部署运维能力有更高的要求,要求业务能够实现交付设施自动化。该部分组件对业务运行时影响比较小。
  2. 服务治理组件:负责服务注册发现、服务配置、服务路由等分布式治理能力,其中最为人熟知的组件是服务注册中心,注册中心负责对服务进行健康检查,及时摘除异常实例,因此在容灾模式下对网络要求比较高,如果网络不稳定容易导致健康检查不准确,频繁进行大规模服务实例变更通知,影响系统稳定性。
  3. 监控组件:负责采集可观测性三大件 trace, log, metrics,底层往往使用ES或者时序数据库,由于这部分组件请求数据量比较大,在规划部署时,网络流量的成本应当被纳入考量。
  • 应用层:应用尽量无状态化,降低部署的难度。

  • 数据层:目前大多数应用使用关系型数据库,当前关系型数据库的技术水平还不能很好的支持多实例多写,所以对于数据库只能讨论主备模式,关键点在于主备切换的自动化以及数据复制的延迟,分别降低故障恢复的 RTO 与 RPO。

同城主备

同城主备(Active-Standby)往往是双 AZ 部署,AZ 间距离需要满足监管要求。双AZ同时只有一个主 AZ 对外提供服务,另一个备 AZ 用做备份,往往只需要部署少量资源。

image-20220720171323105.png

部署方案:

  • 微服务管控层:TSF 一主一备,服务注册发现,应用发布、监控等都在 AZ 内闭环。
  • 应用层:应用一主一备,备中心包含主中心逻辑上的全量应用,应用副本数可缩减。
  • 数据库层:一主多从,强同步复制,使用 TDSQL 的 RPO 和 RTO 可达到0,并且应用能够无感知切换。

应用层异常分析

对应用层几种异常场景进行分析:

1. 单个微服务实例故障:微服务需要做多实例部署,单 AZ 内可容错。

2. 某个微服务的所有实例故障,可能原因有两种。

  • 应用本身代码有问题:回滚应用或进行修复。
  • 某个微服务的所有物理实例故障:利用 IaaS 层节点反亲和,尽量机架间分散部署实例。

3. 整个AZ所有实例故障:这种情况整体启用备AZ,切换用户流量。

微服务管控层异常分析

TSF 微服务管控层可以分为两个层次:

  • 发布时组件:主要影响应用的发布功能,组件故障影响应用的发布、回滚,不影响应用运行。TSF 组件本身均为无状态,可多实例部署,不影响应用运行。底层依赖 MySQL 数据库主从部署,可单独跨 AZ 部署,避免单点故障。
  • 运行时组件:分为两个层次
  1. 监控、日志组件:全部故障影响监控数据采集,但不影响应用运行。组件自身无状态,可多实例部署,底层 ES/Redis 为非关系型数据库,可使用主备/分片模式部署,可单独跨 AZ 部署,避免单点故障。
  2. 服务注册中心:故障影响新服务注册、配置下发,TSF 在应用本地设计了缓存机制,在注册中心不可用时,应用仍可发起服务间调用。组件使用 consul 集群部署,一主多从模式。

关于 TSF 管控端的高可用深入分析可参考后续系列专题文章。

数据库层异常分析

由于数据库是单点,单 AZ 内有可能出现单点宕机,故障时可切换至同 AZ 备节点或同城备节点,类似于 TDSQL 的一主多从模式,TDSQL 也可实现 IP 自动故障切换,应用无感知。

同城双活

用户所有的业务系统同时在两个数据中心运行,同时为用户提供服务,当某个 AZ 的应用系统出现问题时,有另一个 AZ 的应用来持续的提供服务

image-20220720173003578.png

部署方案:

  • 微服务管控层:TSF 双活部署,有全局统一的注册中心,对网络延时有要求。
  • 数据库层:一主多从,由于主节点只在一个 AZ,所以应用访问数据库可能会跨 AZ,因此要求 AZ 间网络延时低,降低数据倾斜带来的性能消耗。
  • 应用层:无状态服务同时对外提供服务,双活的前提是微服务管控层双活以及数据库跨 AZ 时延低。

数据库层高可用部署模式仍为一主多从,后面不再对数据库层进行异常分析。

应用异常分析

对应用层几种异常场景进行分析:

1. 整个 AZ 宕机:利用 GSLB 或者跨 AZ 的 LB 等技术切换至另一个 IP,同时这层能力可以实现负载均衡。
2. 微服务间调用容灾:TSF 支持 AZ 内就近路由,AZ 内实例不可用时跨AZ调用。

微服务管控层异常分析

目前 TSF 基于跨 AZ 的 VIP(客户提供或者 TCS/TCE 提供)实现注册中心等组件自动切换至另一个 AZ,在单 AZ 故障时应用无感知自动切换另一个 AZ 的管控端。

两地三中心

两地三中心建立在同城双活+异地灾备的基础上,兼具高可用性和灾难备份的能力,其中异地灾备中心 是指在异地的城市建立一个备份的灾备中心,用于双中心的数据备份,当双中心出现自然灾害等原因而发生故障时,异地灾备中心可以用备份数据进行业务的恢复。

整体架构是同城双活+主备的组合方案。

image-20220720175840842.png

部署方案:

  • 微服务管控层:同城双活部署,异地灾备,各自的数据不需要做同步,只负责各自的服务管控。
  • 数据库层:一主多从,TDSQL 同城强同步,异地异步复制。
  • 应用层:无状态服务同时对外提供服务,主中心故障后,切换入口路由至异地备中心。

异地多活

异地多活的前提是架构能够实现两地三中心,并且在数据库层面做了水平分片,业务应用与数据库分片成组绑定。异地多活能够将故障范围缩小在单个分片内,并且减少数据库复杂度。一般对于数据量非常大的国家级银行/保险会采用这种架构。

方案又分为两种:异地互备与单元化,以下分开介绍

异地互备

数据库层面水平拆成两个实例分片,例如可以按地域拆成北方、南方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

部署方案:

  • 微服务管控层:服务同城双活,异地不互通。
  • 应用层:不同数据分片的应用异地多活,相同数据分片的应用同城双活,异地灾备。
  • 数据库层:数据分片一主多从,不同分片异地互备。

容灾切换策略:如南方城市整体故障,入口处做 DNS 切换南方用户访问IP至北方。

单元化

一般如果数据量过大,单纯使用数据库 sharding 模式无法解决问题,可以考虑使用单元化架构。首先明确单元的定义,单元是一组计算资源和一组数据资源在逻辑上的绑定,设计的关键点包括:

1. 分片划分:考虑体量与业务,选择分区策略,尽量避免跨单元调用。
2. 部署单元设计:考虑容灾设计,单元与数据库分片绑定,同城单元双活,异地部署灾备单元。
3. 路由:TSF 提供能力在网关入口或服务入口计算单元化规则,对请求进行染色,后续请求按条件同单元路由,跨单元时通过网关调用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

部署方案:

  • 微服务管控层:由于网关可能出现单元化要求有一个全局的服务注册中心。
  • 应用层:每个地域包含全量单元分片,不同数据分片的应用异地多活,相同数据分片的应用同城双活,异地灾备。
  • 数据库层:数据分片一主多从,不同分片异地互备。

单元异常分析:

  • 整个地域故障转移:整体流量切换至另一个地域。
  • 地域单个单元故障转移:除去应用代码本身问题,单元在物理上同城多中心分散部署,基本不可能出现一个城市某一个单元全部宕机。

基于单元化的异地多活

异地多活的概念澄清:

  • 问题起源:单元化架构中另外一个核心考虑点是方便实现异地多活。在传统的同城双活、异地灾备架构中有一个广为诟病的问题,就是异地灾备的资源绝大部分时间没有实际服务于业务,购置部署之后,长期闲置,像一个久未上阵的战士,浪费了国家的军饷。 为了更好的提升资源的利用率,很多客户尤其是金融类客户进一步追求异地多活的架构,让异地的资源也能分担一部分流量,正常的处理业务。
  • 这里要注意正确理解异地多活的概念。异地多活,并不是指全业务(包括全量应用和全量数据)可以活在 region A 又可以同时活在 region B(两地相距数百公里以上,符合灾备监管要求);而是指部分业务在 region A 处理,部分在 region B 处理,没有哪个 region 是完全闲置的存在。 因为前者的做法不论是技术上还是经济成本上都代价太高。
  • 单元化支持异地多活:单元化架构下,由于数据做了分片分单元处理,把不同的单元放在不同的 region 上处理。天然的实现了上面所提的异地多活充分利用机器资源的目标。各 region 在分单元处理业务的同时,也作为灾备中心为异地的其他单元提供应用和数据的异地灾备能力。

目前 TSF 产品已经实现单元化能力,同时为了实现单元化异地多活的诉求,TSF 在最新版中实现了跨地域多集群互相发现互相访问的能力,如下图所示。

  • 实现原理不是基于一个跨地域的全局注册中心,因为目前TSF的注册中心还是Consul,Consul集群是CP模式,CP模式对于信息同步的延时性要求很高,Consul集群只能同城多节点高可用部署,不能异地部署。 所以目前TSF的异地访问,采用了单元网关寻址模式,由单元网关gateway寻找异地服务所在的另一个单元网关gateway,再基于Consul Access(无状态的前置层)到该集群的Consul注册中心拉取服务节点,实现跨地域服务访问。通过网关转发的模式,优点是单元封闭性好,访问链路清晰,出了问题容易追溯;缺点自然是增加了服务跳转次数,响应时间会有所增加。
  • 未来TSF的注册中心还会融合进北极星注册中心,这是一种基于数据库主从方式存储信息的AP模式注册中心,能够更好的作为一个跨地域的全局注册中心。

image_tsf_multiactive.png

总结

以上基于微服务架构,从各个分层对高可用方案分别展开剖析,各个分层对高可用架构的设计是相辅相成的,每个高可用方案下任何一层能力的缺失可能都无法达成期望的目标。上述所介绍的各种高可用架构,TSF 过去在各行业客户都有过落地,也积累了比较丰富的经验。总的来说,架构设计是在做取舍,没有完美的方案,一方面应遵循简单原则,架构设计越简单,越容易落地,运维复杂度越低,成本也越低,另一方面根据实际需求,如监管要求、部署现状、业务数据量等,结合客观条件限制选择合适的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows本地验证码识别工具

windows本地验证码识别小工具 - 可以用在windows系统中,并可以集成在Java或python程序中 演示视频如下:可用于识别4-7位的字母数字组合的验证码(识别准确率在70% - 80%)。 验证码识别演示 本项目未开源,如需使用请联…

IntelliJ IDEA 远程调试 Tomcat

准备工作 明确远程服务器的 IP 地址,比如我是:192.168.92.128 关掉服务器防火墙:service iptables stop 本地 Remote Server 配置 添加 Remote Server,如下图 复制 Remote Server 自动生成的 JVM 参数,等下有用&…

透过优衣库秋冬新品巡展,看见服装消费新风尚

这是一个被高温笼罩的夏天,人们想法设法适应季节变换,在这种适应中,尽可能地保持着装之美。 一向走在穿衣风格一线的优衣库,并没有缺席市场更替中涌现的需求,其春夏系列从凉感防晒的功能性服装,到“辣妹T”…

腾讯云2023年云服务器优惠活动价格表

腾讯云经常推出各种云产品优惠活动,为了帮助大家更好地了解腾讯云服务器的价格和优惠政策,下面给大家分享腾讯云最新云服务器优惠活动价格表,助力大家轻松上云! 一、轻量应用服务器优惠活动价格表 1、轻量应用服务器:…

稳定的 Glance 来了,安卓小部件有救了!

稳定的 Glance 来了,安卓小部件有救了! 稳定版本的 Glance 终于发布了,来一起看看吧,看看这一路的旅程,看看好用么,再看看如何使用! 前世今生 故事发生在两年的一天吧,其实夸张了…

数据结构算法刷题(29)动态规划

思路一&#xff1a;回溯&#xff1a;按照选和不选的判断方式&#xff0c;使用回溯来解决这个问题。 class Solution: def rob(self, nums: List[int]) -> int: n len(nums) #数组的长度 def dfs(i): if i<0: #到达边界条件后 return 0 #返回最大金额是0 res max(dfs(i…

医疗环境升级改造,从此温湿度监控不用慌!

在现代医疗环境中&#xff0c;为了确保患者的舒适和康复&#xff0c;温度和湿度的监控和管理变得至关重要。特别是在疗养院这样的医疗机构中&#xff0c;患者的健康与室内环境条件密切相关。温度和湿度的不适当波动可能导致不仅是不适&#xff0c;还可能加剧病情&#xff0c;影…

9月8日上课内容 第一章 rsync远程同步

主从复制总结 redis主从复制 是为了数据冗余和读写分离 在这两种模式中&#xff0c;有两种角色主节点 (master) 和从节点 (slave) &#xff0c;主节点负责处理写的操作&#xff0c;并将数据更改复制到一个或多个从节点。这样我们的主节点负载减轻&#xff0c;从节点可以提供数据…

UI设计新手指南之什么是UI设计?

最直观的&#xff0c;只要用手机&#xff0c;打开界面就会接触到 UI 设计。 UI 设计是什么&#xff1f;它是指对软件人机交互、操作逻辑、界面美观的整体设计。UI设计的目的是创造出简单、直观、易于使用的界面&#xff0c;为用户提供良好的体验。随着移动互联网的兴起&#x…

分享一下奶茶店怎么在小程序上做商城功能

随着移动互联网的普及&#xff0c;越来越多的消费者倾向于在手机上完成购物需求。对于奶茶店来说&#xff0c;在小程序上开设商城功能不仅可以扩大销售渠道&#xff0c;还能提高品牌知名度和用户体验。本文将探讨如何在小程序上为奶茶店实现商城功能。 对于奶茶店的商城功能&am…

Spring-MVC使用JSR303及拦截器,增强网络隐私安全

目录 一、JSR303 ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 常用注解 ( 4 ) 入门使用 二、拦截器 2.1 是什么 2.2 拦截器与过滤器的区别 2.3 应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 一、JSR303 ( 1 ) 是什么 JSR 303是Java规范请求&#xff…

旅游复苏弹高OTA业绩,未来走势却有“U型曲线”与“抛物线”之变

文 | 螳螂观察 作者 | 易不二 经历了3年蛰伏&#xff0c;旅游业确实熬出头了&#xff0c;OTA也迎来了强势反弹。 自年初起就逐步恢复的旅游行业&#xff0c;经历了暑期小高潮后&#xff0c;正在逐步以强劲的复苏能力&#xff0c;为OTA们的期中财报增彩。 今年二季度&#x…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件&#xff1a;koa-static 中间件可以决定是否向下执行&#xff0c;如果自己可以处理&#xff0c;那么直接处理完毕结束&#xff0c;如果自己处理不了&#xff0c;next 方法会继续向下执行 新建 public 文件夹&#xff0c;里面添加 index.html、style.css 文件 …

机器学习_个人笔记_周志华(更新中......)

第1章 绪论 1.1 引言 形成优秀的心理表征&#xff0c;自然能成为领域内的专家。 系统1 & 系统2。 机器学习&#xff1a;致力于研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。主要研究计算机从数据中产生model的算法&#xff0c;即“learning algori…

myCobot Pro600六轴机械臂与3D深度视觉:物体精确识别抓取堆叠

Introduction 随着时代的进步&#xff0c;各种精密的机械臂&#xff0c;人形机器人不断的问世。我们即将迎来到处都是机器人的高科技时代。为了跟上时代的脚步&#xff0c;我最近入手了一台myCobot pro 600机械臂&#xff0c;我主要是想要用它来学习机械臂相关得控制以及机器视…

【跟小嘉学 Apache Flink】二、Flink 快速上手

系列文章目录 【跟小嘉学 Apache Flink】一、Apache Flink 介绍 【跟小嘉学 Apache Flink】二、Flink 快速上手 文章目录 系列文章目录[TOC](文章目录) 一、创建工程1.1、创建 Maven 工程1.2、log4j 配置 二、批处理单词统计&#xff08;DataSet API&#xff09;2.1、创建 Bat…

今日话题:解决Linux中可以识别但无法连接Airpods问题(亲测且实用)

今日话题&#xff1a;解决Linux中可以识别但无法连接Airpods问题 起因经过结果方式一方式二 起因经过 在根据“Linux启动黑屏卡住Logo登录界面无法进入系统的终极解决方式”博客解决掉gdm3以及lightdm图形界面之间冲突的问题后&#xff0c;准备设置打开蓝牙连接Airpods&#x…

Java | 多线程

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;前言&#x1f334;一、什么是多线程&#xff1f;1.进程2.线程3.多线程作用 &#x1f334;二、多线程中的两个概念1. 并发2. 并行3.举例…

python-面向运行时性能优化-threading

python-面向运行时性能优化-threading 一:线程基础1> 线程状态2> 线程同步1. 锁的状态3> 线程通信-条件变量4> 线程阻塞-之间转换1. 阻塞分类二:threading类1> threading介绍2> Thread类1. Thread的生命周期2. 实例化Thread类3. 继承Thread类4. Thread构造…

9.11作业

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 sum0 arr(11 22 33 44 55) Sum() {for i in ${arr[*]}do$((sumi))donereturn $sum } Sum ${arr[*]} var$? echo $var写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 Sum() {aid -…