Skip to content

High availability for intra city cross availability zone in private cloud

本文主要对专有云同城跨AZ高可用场景做简要的技术介绍。

高可用架构介绍

专有云产品的底座,是一个基于kubernetes和容器的产品,所以这里介绍的同城多AZ方案,首先是底座要有多AZ能力。kubernetes相关组件和自带的中间件,如RabbitMQ、ETCD、MySQL等,都需要支持跨AZ的多副本实例。一般的,业务容器无状态的多副本应用均匀分布在多AZ,中间件实例由于是有状态的而且存在选主,通常是 2:1 或者 3:2 的数量比例分布在两个AZ中。如果是3AZ的话,数量比例可以是 1:1:1 或者 2:2:1。如下表所示:

副本分布策略 有状态的 无状态
双AZ AZ1:AZ2:AZ3 = 2:1 或 3:2 选择副本最少的AZ
三AZ AZ1:AZ2:AZ3 = 1:1:1 或 2:2:1 选择副本最少的AZ

备注:为了保障跨AZ服务的可用性和稳定性,要求AZ间的网络延迟 <= 5ms (如果不满足此延迟条件,说明两个机房不在同城同地域,按照异地跨 Region 来看,跨 Region 的高可用方案不在文本中讨论)

同城双AZ高可用说明

主可用区承载了本地域绝大部分的计算存储路由等能力,主可用区服务异常将会影响到本地域内其他可用区的服务稳定性,影响较大。备可用区承载了本地域绝大部分的关键数据的副本,备可用区服务异常会导致主备数据同步异常、备份数据异常等情况,对本地域内其他可用区的服务稳定性有影响,影响较小,恢复速度快。

为保证备可用区故障时,集群的可用性不受影响,所以分布式集群的多数节点都部署到主可用区。当主可用区故障时,备可用区中少数节点无法提供服务,需要在备可用区重建集群,恢复服务。

底座的必要且重要的三个模块:容器平台模块、对象存储模块、负载均衡网关模块。所以本文讨论这三个模块的高可用。

2.1 双AZ高可用部署架构

双AZ高可用的部署架构如下图所示:

画板

第一层的网络设备。第二层是底座,底座包含上述的三个模块,其中:

  • 负载均衡模块有4个LB节点,其中每个AZ两个LB节点;
  • 对象存储(如ceph)模块放到4个节点,如上图所示,它和k8s master节点混布,每个AZ选择两个master节点部署对象存储;
  • 容器平台模块画的是多种有状态的容器部署情况。例如MySQL部署

2.2 容器平台管控模块

容器平台管控面,简单来讲是kubernetes的高可用部署。它的无状态组件如apiserver、controller等通过kubernetes API进行选主并进行自动切换。因为容器平台的高可用主要关注状态组件etcd的容器部署和故障处理能力。

etcd的双AZ部署数量为 3(主AZ)+2(备AZ),etcd采用的是raft协议,即“多数派”选主协议。当备AZ故障时,etcd集群仍然可用;

当主AZ故障时需要进行切换,在备AZ基于当前数据重新组件集群后提供服务,另外还会在备AZ的其他kubernetes node上再启动一个etcd实例,使得备AZ有一套3实例的etcd集群,可以容忍单点故障。如下图所示:

画板

2.3 对象存储模块

对象存储推荐采用ceph的容器化部署方案。可以使用Rook部署架构。当然本文中只是使用它的对象存储能力。部署的架构如下图,有状态是的osd和mon。mon 采用 2:1 架构部署,当备 AZ 故障时,调整最小副本数 CSP 集群整体仍然可用;当主 AZ 故障时需要进行组件切换并调整最小副本数。

画板

2.4 负载均衡网关模块

这块的高可用方案比较多,有空单独说。

高可用的衡量指标

高可用最重要的两个衡量指标,即RTO和RPO。

指标 全称 定义 关键问题 业务影响维度
RTO Recovery Time Objective 系统故障后,可容忍的最大恢复时间(从宕机到恢复服务的时间上限) “业务要停多久?” 时间敏感性
RPO Recovery Point Objective 系统故障后,可容忍的最大数据丢失量(恢复到故障前哪个时间点的数据状态) “数据要丢多少?” 数据完整性

按照时间轴顺序,如下图所示:

故障发生时刻:T0
         │
         ├─ 数据丢失窗口 (RPO范围) ──────▶
         │     [允许丢失T0前X分钟数据]
         │
         ▼
┌───────────────────────┐
│   系统不可用期 (RTO范围) │◀─ 允许的最大停机时间Y分钟
└───────────────────────┘
         │
         ▼
 业务恢复时刻:T0 + Y (RTO)

我们可以按照上述2.1-2.4的描述,以及高可用方案,可以评估对应的RPO和RTO填入下表。针对不同的客户。

组件名称 RTO RPO
主 AZ 故障 备 AZ 故障 主 AZ 故障
容器平台
对象存储
负载均衡
有状态服务1
有状态服务2
有状态服务3

典型系统参考值

系统类型 RPO RTO
金融支付系统 0 ≤ 30秒
航空订票系统 ≤ 1秒 ≤ 2分钟
医院HIS系统 ≤ 5分钟 ≤ 15分钟
企业CRM ≤ 1小时 ≤ 4小时
学校教务系统 ≤ 24小时 ≤ 1工作日

故障恢复管理系统

同城双AZ高可用,不仅需要各个组件的高可用的技术方案,并满足客户的RPO和RTO要求。我们还需要有一个故障恢复管理系统,期望实现可用区级别服务的故障恢复:能够满足服务状态可视化、故障探测自动化、切换流程编排白屏化、故障演练日常化,实现服务端到端一键切换,提升容灾演练和故障切换的效率及易用性,帮助客户提升容灾能力。

故障恢复管理系统的一般的步骤如下:

  • 可用区故障探测

通过对可用区中的节点定期探活,实现对可用区的探活并发送异常告警,辅助用户进行故障切换的决策。

  • 切换能力评估

系统在可用区切换前,通过对产品状态的检查结果,进而对可用区切换能力进行评估,辅助切换决策。

  • 故障一键切换

当AZ发生故障时,通过预置的切换流程,将产品在可用的AZ中恢复。为了提高切换效率,系统预置了切换流程,根据产品之间是否存在依赖关系,对切换顺序进行了编排,存在依赖关系的产品执行串行切换,无依赖关系的产品执行并行切换。

受限于部署架构(主 2 备 1),当主 AZ 故障后,系统自身的可用性不能自动恢复,需要执行恢复脚本恢复可用性。

  • 故障演练报告

通过汇总演练过程中记录的配置检查结果、产品切换的RTO及执行的结果,提升演练效率。