多活容灾MSHA(Multi-Site High Availability)是一个云原生的多活容灾架构解决⽅案,提供包括HTTP和RPC在内的业务流量隔离功能。本文通过一个电商业务案例来介绍MSHA的业务流量隔离功能。

背景介绍

适用场景

业务流量隔离功能包含以下四个适用场景:

  • 灰度发布

    传统的金丝雀发布、滚动发布和分批发布采用的思路均是先部署少量机器进行观察,再逐步部署剩余机器,以此来控制变更发布上线的风险。这种方式通常不具备精确引流和中间件隔离的能力。而灰度发布是通过搭建业务流量隔离的灰度环境,按需将流量引流进灰度环境机器,便于进行精准小流量的验证和观测。由于灰度发布只是发布流量中的一个短暂验证阶段,又因为每次灰度发布所需的业务流量可能不一致,因此建议开发人员按需执行灰度发布,发布完毕后释放业务流量。

  • 安全生产环境

    区别于一般的灰度发布,安全生产环境是搭建一套与生产环境中间件隔离的环境,包含独立配套的监控告警系统,便于灰度发布、故障演练、链路压测、算法调优等,能有效优化研发流程和线上产品服务稳定性。由于中间件隔离,上游应用需接入安全生产环境后,下游应用才会接收到流量,因此安全生产环境搭建好之后,需要常态化的保留和运行。

  • 线上专属环境
    • 预案、故障演练

      通过在流量隔离的环境进行风险预案演练以及故障演练,可保证安全地进行不宜在线上进行的高风险操作和演练验证,常态化地进行反脆弱建设验证,保证系统容灾容错的能力。

    • VIP业务流量重保

      可以通过搭建流量隔离环境,将VIP业务流量引流到专属的隔离环境,来做重保护航,避免系统上不同业务的资源抢占和故障影响,例如在大促期间对重点商家、VIP客户流量做重保护航。

  • 日常多项目开发、测试

    当一个系统或应用存在多个项目并行进行迭代开发时,如果共用一个开发、测试环境,往往会由于不同分支改动互相干扰、代码合并部署协同成本高、交付时间周期不同等因素,导致日常开发、联调、测试效率低的问题。通过搭建多版本流量隔离环境,在各自独立的环境开发、联调和测试,可以解决多项目并行开发导致的互相冲突干扰的问题,大大提高开发效率。

建设难点

上述业务流量隔离场景所涉及的建设难点主要包括:
  • 灵活流量控制难
    • 若期望业务流量隔离环境与生产环境共用一套中间件,则需在中间件层面植入流量隔离、引流、路由逻辑。
    • 若期望业务流量隔离环境与生产环境不共用一套中间件,为避免在业务隔离环境完整部署全链路应用(否则会因为下游应用无可用机器而造成调用失败的问题),需要在中间件层面植入兜底调用回生产环境的逻辑。
  • 统一管控难
    • 要实现HTTP、RPC、MQ、任务调度等流量的隔离,需对接支持众多云产品和开源框架。
  • 无业务代码侵入难
    • 要实现HTTP、RPC、MQ、任务调度等流量管控能力,通常需要业务应用配合改造,对业务代码侵入大。
  • 和容灾流量规则共存时,兼容不冲突难
    • 多套流量规则(业务流量隔离规则、同城多活比例规则、可用区内流量封闭规则、异地多活路由规则)共存的情况下,需考虑规则的优先级、互斥性和兼容性。

场景实现方案分类

根据上述业务流量隔离适用场景和建设难点,现有两种实现方案:
  • 方案1:隔离环境和线上普通环境共用一套中间件

    该方案需要具备入口流量与中间件(RPC、MQ、调度任务等)的流量隔离能力。灰度发布、线上专属环境和日常多项目开发、测试场景通常采用该方案来实现。

  • 方案2:隔离环境和线上普通环境使用独立中间件

    该方案需要具备无下游应用时兜底调用(RPC、MQ、调度任务等)到线上普通环境的能力,否则需要上下游应用全量部署,且需要运维保障第二套线上环境的稳定性。而要实现兜底调用,则需要具备中间件数据同步和流量隔离的能力。安全生产环境场景通常采用该方案来实现。

案例实践

本文采用一个电商业务案例来介绍业务流量隔离功能的最佳实践。

业务背景信息

该电商业务案例包含以下应用:
  • frontend:入口Web应用,负责和用户交互。
  • cartservice:购物车应用。记录用户的购物车数据,使用自建的Redis。
  • productservice:商品应用。提供商品、库存服务,使用RDS MySQL。
  • checkoutservice:下单应用。将购物车中的商品生成购买订单,使用RDS MySQL。
电商业务案例架构
所涉及技术栈:
  • SpringBoot
  • RPC框架:SpringCloud(注册中心使用自建的Eureka)
案例体验地址:
  • 多活容灾MSHA控制台
    1. 登录AHAS控制台
    2. 在控制台左侧导航栏,选择多活容灾

      在控制台进行操作时,命名空间需选择官方示例命名空间

  • 电商业务网页:Demo1Demo2

案例实践一:精准流量灰度

业务需求

从历史故障来看,超过一半的故障是由发布变更导致的。如果发布流程增加灰度流程以及灰度时长,那么这些故障是有机会提前被发现和避免的。因此为了降低代码或配置变更后一次性全量发布上线可能造成的影响,业务期望建设灰度发布的能力,能做到随时灰度、灵活灰度(精准引流)。其具体需求内容包括:
  • 针对变更涉及的一个或多个应用,在灰度发布阶段能够在生产环境扩容一批机器,并划分成为灰度环境。灰度环境默认不会有任何流量进入(包括HTTP、RPC、MQ、定时任务调度流量)。
  • 支持自定义灰度环境引流规则,仅满足引流条件的流量才可进入灰度环境机器。
  • RPC调用下游应用时,进入灰度环境的流量需要在该环境内封闭。但如果下游应用在灰度环境无可用机器,则兜底调用到线上环境。
  • 发布流程结束后,释放灰度环境机器,实现按需使用、按需付费。

基于MSHA实现精准流量灰度的方案

步骤一:搭建灰度环境
  1. 将需要灰度的应用扩容出1~2个实例,作为灰度环境。
  2. 基于MSHA单元格模型,创建一个新的单元格作为灰度环境逻辑区域。
  3. 将上述应用实例划分归属到灰度环境单元格。
  4. 单元格配置为开启流量隔离,以保证默认情况下不会有任何流量进入。
说明
  • 单元格:是一个逻辑区域的概念。MSHA基于单元格的粒度进行流量控制,支持按可用区或指定JVM启动参数的方式将应用实例划分归属到对应的单元格。
  • 开启流量隔离:配置为开启流量隔离的单元格,流量比例固定为0%。在不配置引流规则的情况下不会有任何HTTP、RPC、MQ、定时任务调度流量进入。
步骤二:配置灰度引流规则
  1. 创建新的SLB实例,用于对灰度环境的入口应用实例进行负载均衡。
  2. 基于MSHA的域名统一接入能力以及HTTP流量按单元格分流的能力,在MSHA控制台将灰度环境单元格对应的回源地址配置为上述创建的SLB VIP。
  3. 基于MSHA的HTTP和RPC引流能力,按需配置引流规则,从而让精准流量进入灰度环境。
步骤三:发布完成,释放资源
  1. 在灰度发布结束后,一键关闭所有灰度环境引流规则。
  2. 删除灰度环境单元格。
  3. 释放灰度环境应用实例。

接入MSHA实践

场景一:HTTP流量灰度引流

为了满足业务需求,电商系统增添了一个新功能。此次变更涉及入口Web应用、下单应用和商品应用。完成变更后,需将这3个应用发布到灰度环境进行灰度观察和验证。

接入MSHA的操作流程如下:
  1. 扩容机器并创建一个新的单元格,作为灰度环境(如下图中单元格H)。
  2. 将变更涉及的2个应用扩容出机器并划分归属到单元格H。
  3. 创建VPC类型的SLB实例,配置监听HTTP 80端口,后端服务器组选择单元格H内的入口Web应用。
  4. 配置域名、URI,并配置每个单元格对应的回源IP、Port信息。其中单元格H的回源IP、Port需要配置为上述创建的SLB VIP,Port为80。
  5. 配置HTTP引流规则并开启流量染色,以便RPC调用下游应用时,流量能够根据染色标在灰度环境内封闭。
HTTP流量灰度引流
完成操作后可从以下四个方面验证灰度能力:
  1. HTTP引流验证:配置HTTP引流规则,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H。
  2. 流量全链路染色和路由能力验证:配置HTTP引流规则和链路染色,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H中的下单应用实例。
  3. 下游无可用机器时兜底能力验证:关闭单元格H内的所有下单应用实例,多次刷新电商页面并观察监控和日志。
    1. 查看是否所有用户ID为10的流量都正常返回。
    2. 查看是否流量都进入了单元格B或单元格I内的下单应用实例。
    3. 查看是否流量都回到了单元格H内的商品应用实例。灰度能力验证
  4. 流量封闭验证:关闭所有引流规则,多次刷新电商页面,观察监控是否有流量进入单元格H。

场景二:RPC流量灰度引流

为了满足业务需求,电商系统进行了一次功能优化。此次变更涉及商品应用,完成变更后,此应用需先在灰度环境进行灰度观察和验证。

接入MSHA的操作流程如下:
  1. 扩容机器并创建一个新的单元格,作为灰度环境(如下图中单元格H)。
  2. 将变更涉及的1个应用扩容出机器并划分归属到灰度环境的单元格H。
  3. 配置SpringCloud引流规则。
RPC流量灰度引流
完成操作后可从以下三个方面验证灰度能力:
  1. RPC引流验证:配置SpringCloud引流规则,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为20的流量都进入了单元格H。
  2. 流量封闭验证:关闭所有引流规则,多次刷新电商页面,观察监控是否有流量进入单元格H。
  3. 下游无可用机器时兜底能力验证:关闭单元格H内的所有下单应用实例,多次刷新电商页面并观察监控和日志。
    1. 查看是否所有用户ID为10的流量都正常返回。
    2. 查看是否流量都进入了单元格B或单元格I内的下单应用实例,并且遵循了同城切0的逻辑。
    3. 查看是否流量都回到了单元格H内的商品应用实例。

案例实践二:安全生产环境

业务需求

从历史故障分析,大部分故障是因为没有经过灰度直接全量发布到生产环境所造成的。因此当前的需求是建设安全生产环境,通过安全生产环境的小流量灰度验证和观测,提前暴露问题和风险。具体需求内容包括:
  • 采用跟生产环境不同的中间件(微服务注册中心、MQ实例等),搭建一套常态化运行的安全生产环境,并建立统一的灰度发布流程,经过安全生产环境的灰度发布和观测验证后,才允许发布到生产环境。
  • 固定从生产环境引流1%的HTTP流量进入安全生产环境。
  • RPC调用下游应用时,进入安全生产环境的流量需要在该环境内封闭。但如果下游应用在安全生产环境无可用机器时,则兜底调用到线上环境。
  • 发布流程结束后,安全生产机器仍然保留,以便下游应用随时利用安全生产环境进行灰度验证。

基于MSHA搭建安全生产环境的方案

MSHA控制台提供一站式的流量管控能力。通过以下步骤的操作,能够让业务具备安全生产环境的灰度能力。

步骤一:搭建环境
  1. 创建新的容器服务ACK集群,将需要灰度的应用创建出1~2个实例,作为安全生产环境。
  2. 安全生产环境的应用使用独立的中间件,包括微服务注册中心、MQ实例等。
  3. 基于MSHA单元格模型,创建一个新的单元格作为安全生产环境的逻辑区域。
  4. 将上述应用实例划分归属到安全生产环境单元格。
  5. 单元格配置为开启流量隔离,以保证默认情况下不会有任何流量进入。
    说明
    • 单元格:是一个逻辑区域的概念。MSHA基于单元格的粒度进行流量控制,支持按可用区或指定JVM启动参数的方式将应用实例划分归属到对应的单元格。
    • 开启流量隔离:配置为开启流量隔离的单元格,流量比例固定为0%,在不配置引流规则的情况下不会有任何HTTP、RPC、MQ、定时任务调度流量进入。
步骤二:配置灰度引流规则
  1. 创建新的SLB实例,用于对安全生产环境的入口应用实例进行负载均衡。
  2. 基于MSHA的域名统一接入能力以及HTTP流量按单元格分流的能力,在MSHA控制台将安全生产环境单元格对应的回源地址配置为上述创建的SLB VIP。
  3. 基于MSHA的HTTP引流能力,配置HTTP引流规则,固定引流1%到安全生产环境。

步骤三:配置服务同步

利用MSHA服务同步的能力,将生产环境的RPC服务同步到安全生产环境的Eureka注册中心,以便安全生产环境的流量在RPC调用下游发现无可用机器时,能够兜底调用回生产环境。

接入MSHA实践

为了满足业务需求,电商系统新增了一个功能,此次变更涉及入口Web应用和商品应用。为了满足安全生产“无灰度,不发布“的要求,需将这2个应用先发布到安全生产环境进行一段时间的灰度观察和验证。

接入MSHA的操作流程如下:
  1. 创建一个新的单元格,作为安全生产环境(如下图中单元格H)。
  2. 创建新的容器服务ACK集群,将变更涉及的2个应用创建出1~2个实例,并划分归属到单元格H。
  3. 创建VPC类型的SLB实例,配置监听HTTP 80端口,后端服务器组选择单元格H内的入口Web应用。
  4. 配置域名、URI,并配置每个单元格对应的回源IP和Port信息。其中单元格H的回源IP和Port需要配置为上述创建的SLB VIP,Port为80。
  5. 配置HTTP引流规则并开启流量染色,以便RPC调用下游应用时,流量能够根据染色标在安全生产环境内封闭。
  6. 配置注册中心服务同步,将生产环境的RPC服务同步到安全生产环境的Eureka注册中心。
安全生产环境
完成操作后可从以下四个方面验证灰度能力:
  1. HTTP引流验证:配置HTTP引流规则,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H。
  2. 流量全链路染色和路由能力验证:配置HTTP引流规则和链路染色,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H中的商品应用实例。
  3. 下游无可用机器时兜底能力验证:关闭单元格H内的所有商品应用实例,多次刷新电商页面并观察监控和日志。
    1. 查看是否所有用户ID为10的流量都正常返回。
    2. 查看是否流量都进入了单元格B或单元格I内的商品应用实例。
    验证灰度能力
  4. 流量封闭验证:关闭所有引流规则,多次刷新电商页面,观察监控是否有流量进入单元格H。