相对于过去单体或 SOA 架构,建设微服务架构所依赖的组件发生了改变,因此分析与设计高可用容灾架构方案的思路也随之改变,本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。
刘冠军 腾讯云中间件中心架构组负责人、专家工程师
15年 IT 从业经验,第一份工作服务于 IBM 中国实验室,曾任职 IBM 大型机中间件研发总监。现任腾讯云专家工程师,中间件中心架构组负责人,负责中间件产品中心架构师团队及 PaaS 平台产品售前工作。共获得16项专利授权,在事务处理、web 服务、微服务、消息队列和银行架构等方面有着丰富经验,支持过国内外多家大中型客户。
相对于 SOA 架构,微服务架构使用去中心化的方式组织业务应用,服务之间的通信不需要经过总线,服务路由的逻辑下发到各个微服务中自行完成。另一方面,微服务架构也离不开中心化的组件实现服务治理、应用部署、监控等功能,微服务场景下主备、多活等高可用容灾方案的设计需要通盘考虑。
在分析复杂的容灾架构前,我们首先应当明确问题的定义,拆解问题,分解子问题,从不同维度分开讨论才能获得一个清晰的结论。当我们讨论主备、双活等高可用模式时,不同的高可用模式对于应用、数据库、注册中心等组件的含义不是一样的,但各组件又相互关联。在笔者看来,一个完整的微服务架构组件包含三个维度:
应用层:应用尽量无状态化,降低部署的难度。
数据层:目前大多数应用使用关系型数据库,当前关系型数据库的技术水平还不能很好的支持多实例多写,所以对于数据库只能讨论主备模式,关键点在于主备切换的自动化以及数据复制的延迟,分别降低故障恢复的 RTO 与 RPO。
同城主备(Active-Standby)往往是双 AZ 部署,AZ 间距离需要满足监管要求。双AZ同时只有一个主 AZ 对外提供服务,另一个备 AZ 用做备份,往往只需要部署少量资源。
部署方案:
对应用层几种异常场景进行分析:
1. 单个微服务实例故障:微服务需要做多实例部署,单 AZ 内可容错。
2. 某个微服务的所有实例故障,可能原因有两种。
3. 整个AZ所有实例故障:这种情况整体启用备AZ,切换用户流量。
TSF 微服务管控层可以分为两个层次:
关于 TSF 管控端的高可用深入分析可参考后续系列专题文章。
由于数据库是单点,单 AZ 内有可能出现单点宕机,故障时可切换至同 AZ 备节点或同城备节点,类似于 TDSQL 的一主多从模式,TDSQL 也可实现 IP 自动故障切换,应用无感知。
用户所有的业务系统同时在两个数据中心运行,同时为用户提供服务,当某个 AZ 的应用系统出现问题时,有另一个 AZ 的应用来持续的提供服务
部署方案:
数据库层高可用部署模式仍为一主多从,后面不再对数据库层进行异常分析。
对应用层几种异常场景进行分析:
1. 整个 AZ 宕机:利用 GSLB 或者跨 AZ 的 LB 等技术切换至另一个 IP,同时这层能力可以实现负载均衡。
2. 微服务间调用容灾:TSF 支持 AZ 内就近路由,AZ 内实例不可用时跨AZ调用。
目前 TSF 基于跨 AZ 的 VIP(客户提供或者 TCS/TCE 提供)实现注册中心等组件自动切换至另一个 AZ,在单 AZ 故障时应用无感知自动切换另一个 AZ 的管控端。
两地三中心建立在同城双活+异地灾备的基础上,兼具高可用性和灾难备份的能力,其中异地灾备中心 是指在异地的城市建立一个备份的灾备中心,用于双中心的数据备份,当双中心出现自然灾害等原因而发生故障时,异地灾备中心可以用备份数据进行业务的恢复。
整体架构是同城双活+主备的组合方案。
部署方案:
异地多活的前提是架构能够实现两地三中心,并且在数据库层面做了水平分片,业务应用与数据库分片成组绑定。异地多活能够将故障范围缩小在单个分片内,并且减少数据库复杂度。一般对于数据量非常大的国家级银行/保险会采用这种架构。
方案又分为两种:异地互备与单元化,以下分开介绍
数据库层面水平拆成两个实例分片,例如可以按地域拆成北方、南方。
部署方案:
容灾切换策略:如南方城市整体故障,入口处做 DNS 切换南方用户访问IP至北方。
一般如果数据量过大,单纯使用数据库 sharding 模式无法解决问题,可以考虑使用单元化架构。首先明确单元的定义,单元是一组计算资源和一组数据资源在逻辑上的绑定,设计的关键点包括:
1. 分片划分:考虑体量与业务,选择分区策略,尽量避免跨单元调用。
2. 部署单元设计:考虑容灾设计,单元与数据库分片绑定,同城单元双活,异地部署灾备单元。
3. 路由:TSF 提供能力在网关入口或服务入口计算单元化规则,对请求进行染色,后续请求按条件同单元路由,跨单元时通过网关调用。
部署方案:
单元异常分析:
异地多活的概念澄清:
目前 TSF 产品已经实现单元化能力,同时为了实现单元化异地多活的诉求,TSF 在最新版中实现了跨地域多集群互相发现互相访问的能力,如下图所示。
以上基于微服务架构,从各个分层对高可用方案分别展开剖析,各个分层对高可用架构的设计是相辅相成的,每个高可用方案下任何一层能力的缺失可能都无法达成期望的目标。上述所介绍的各种高可用架构,TSF 过去在各行业客户都有过落地,也积累了比较丰富的经验。总的来说,架构设计是在做取舍,没有完美的方案,一方面应遵循简单原则,架构设计越简单,越容易落地,运维复杂度越低,成本也越低,另一方面根据实际需求,如监管要求、部署现状、业务数据量等,结合客观条件限制选择合适的方案。