多活容灾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)
- 登录AHAS控制台。
- 在控制台左侧导航栏,选择多活容灾。
在控制台进行操作时,命名空间需选择官方示例命名空间。
案例实践一:精准流量灰度
业务需求
- 针对变更涉及的一个或多个应用,在灰度发布阶段能够在生产环境扩容一批机器,并划分成为灰度环境。灰度环境默认不会有任何流量进入(包括HTTP、RPC、MQ、定时任务调度流量)。
- 支持自定义灰度环境引流规则,仅满足引流条件的流量才可进入灰度环境机器。
- RPC调用下游应用时,进入灰度环境的流量需要在该环境内封闭。但如果下游应用在灰度环境无可用机器,则兜底调用到线上环境。
- 发布流程结束后,释放灰度环境机器,实现按需使用、按需付费。
基于MSHA实现精准流量灰度的方案
- 将需要灰度的应用扩容出1~2个实例,作为灰度环境。
- 基于MSHA单元格模型,创建一个新的单元格作为灰度环境逻辑区域。
- 将上述应用实例划分归属到灰度环境单元格。
- 单元格配置为开启流量隔离,以保证默认情况下不会有任何流量进入。
- 单元格:是一个逻辑区域的概念。MSHA基于单元格的粒度进行流量控制,支持按可用区或指定JVM启动参数的方式将应用实例划分归属到对应的单元格。
- 开启流量隔离:配置为开启流量隔离的单元格,流量比例固定为0%。在不配置引流规则的情况下不会有任何HTTP、RPC、MQ、定时任务调度流量进入。
- 创建新的SLB实例,用于对灰度环境的入口应用实例进行负载均衡。
- 基于MSHA的域名统一接入能力以及HTTP流量按单元格分流的能力,在MSHA控制台将灰度环境单元格对应的回源地址配置为上述创建的SLB VIP。
- 基于MSHA的HTTP和RPC引流能力,按需配置引流规则,从而让精准流量进入灰度环境。
- 在灰度发布结束后,一键关闭所有灰度环境引流规则。
- 删除灰度环境单元格。
- 释放灰度环境应用实例。
接入MSHA实践
场景一:HTTP流量灰度引流
为了满足业务需求,电商系统增添了一个新功能。此次变更涉及入口Web应用、下单应用和商品应用。完成变更后,需将这3个应用发布到灰度环境进行灰度观察和验证。
- 扩容机器并创建一个新的单元格,作为灰度环境(如下图中单元格H)。
- 将变更涉及的2个应用扩容出机器并划分归属到单元格H。
- 创建VPC类型的SLB实例,配置监听HTTP 80端口,后端服务器组选择单元格H内的入口Web应用。
- 配置域名、URI,并配置每个单元格对应的回源IP、Port信息。其中单元格H的回源IP、Port需要配置为上述创建的SLB VIP,Port为80。
- 配置HTTP引流规则并开启流量染色,以便RPC调用下游应用时,流量能够根据染色标在灰度环境内封闭。
- HTTP引流验证:配置HTTP引流规则,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H。
- 流量全链路染色和路由能力验证:配置HTTP引流规则和链路染色,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H中的下单应用实例。
- 下游无可用机器时兜底能力验证:关闭单元格H内的所有下单应用实例,多次刷新电商页面并观察监控和日志。
- 查看是否所有用户ID为10的流量都正常返回。
- 查看是否流量都进入了单元格B或单元格I内的下单应用实例。
- 查看是否流量都回到了单元格H内的商品应用实例。
- 流量封闭验证:关闭所有引流规则,多次刷新电商页面,观察监控是否有流量进入单元格H。
场景二:RPC流量灰度引流
为了满足业务需求,电商系统进行了一次功能优化。此次变更涉及商品应用,完成变更后,此应用需先在灰度环境进行灰度观察和验证。
- 扩容机器并创建一个新的单元格,作为灰度环境(如下图中单元格H)。
- 将变更涉及的1个应用扩容出机器并划分归属到灰度环境的单元格H。
- 配置SpringCloud引流规则。
- RPC引流验证:配置SpringCloud引流规则,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为20的流量都进入了单元格H。
- 流量封闭验证:关闭所有引流规则,多次刷新电商页面,观察监控是否有流量进入单元格H。
- 下游无可用机器时兜底能力验证:关闭单元格H内的所有下单应用实例,多次刷新电商页面并观察监控和日志。
- 查看是否所有用户ID为10的流量都正常返回。
- 查看是否流量都进入了单元格B或单元格I内的下单应用实例,并且遵循了同城切0的逻辑。
- 查看是否流量都回到了单元格H内的商品应用实例。
案例实践二:安全生产环境
业务需求
- 采用跟生产环境不同的中间件(微服务注册中心、MQ实例等),搭建一套常态化运行的安全生产环境,并建立统一的灰度发布流程,经过安全生产环境的灰度发布和观测验证后,才允许发布到生产环境。
- 固定从生产环境引流1%的HTTP流量进入安全生产环境。
- RPC调用下游应用时,进入安全生产环境的流量需要在该环境内封闭。但如果下游应用在安全生产环境无可用机器时,则兜底调用到线上环境。
- 发布流程结束后,安全生产机器仍然保留,以便下游应用随时利用安全生产环境进行灰度验证。
基于MSHA搭建安全生产环境的方案
MSHA控制台提供一站式的流量管控能力。通过以下步骤的操作,能够让业务具备安全生产环境的灰度能力。
- 创建新的容器服务ACK集群,将需要灰度的应用创建出1~2个实例,作为安全生产环境。
- 安全生产环境的应用使用独立的中间件,包括微服务注册中心、MQ实例等。
- 基于MSHA单元格模型,创建一个新的单元格作为安全生产环境的逻辑区域。
- 将上述应用实例划分归属到安全生产环境单元格。
- 单元格配置为开启流量隔离,以保证默认情况下不会有任何流量进入。
说明
- 单元格:是一个逻辑区域的概念。MSHA基于单元格的粒度进行流量控制,支持按可用区或指定JVM启动参数的方式将应用实例划分归属到对应的单元格。
- 开启流量隔离:配置为开启流量隔离的单元格,流量比例固定为0%,在不配置引流规则的情况下不会有任何HTTP、RPC、MQ、定时任务调度流量进入。
- 创建新的SLB实例,用于对安全生产环境的入口应用实例进行负载均衡。
- 基于MSHA的域名统一接入能力以及HTTP流量按单元格分流的能力,在MSHA控制台将安全生产环境单元格对应的回源地址配置为上述创建的SLB VIP。
- 基于MSHA的HTTP引流能力,配置HTTP引流规则,固定引流1%到安全生产环境。
步骤三:配置服务同步
利用MSHA服务同步的能力,将生产环境的RPC服务同步到安全生产环境的Eureka注册中心,以便安全生产环境的流量在RPC调用下游发现无可用机器时,能够兜底调用回生产环境。
接入MSHA实践
为了满足业务需求,电商系统新增了一个功能,此次变更涉及入口Web应用和商品应用。为了满足安全生产“无灰度,不发布“的要求,需将这2个应用先发布到安全生产环境进行一段时间的灰度观察和验证。
- 创建一个新的单元格,作为安全生产环境(如下图中单元格H)。
- 创建新的容器服务ACK集群,将变更涉及的2个应用创建出1~2个实例,并划分归属到单元格H。
- 创建VPC类型的SLB实例,配置监听HTTP 80端口,后端服务器组选择单元格H内的入口Web应用。
- 配置域名、URI,并配置每个单元格对应的回源IP和Port信息。其中单元格H的回源IP和Port需要配置为上述创建的SLB VIP,Port为80。
- 配置HTTP引流规则并开启流量染色,以便RPC调用下游应用时,流量能够根据染色标在安全生产环境内封闭。
- 配置注册中心服务同步,将生产环境的RPC服务同步到安全生产环境的Eureka注册中心。
- HTTP引流验证:配置HTTP引流规则,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H。
- 流量全链路染色和路由能力验证:配置HTTP引流规则和链路染色,多次刷新电商页面并观察监控和日志,查看是否所有用户ID为10的流量都进入了单元格H中的商品应用实例。
- 下游无可用机器时兜底能力验证:关闭单元格H内的所有商品应用实例,多次刷新电商页面并观察监控和日志。
- 查看是否所有用户ID为10的流量都正常返回。
- 查看是否流量都进入了单元格B或单元格I内的商品应用实例。
- 流量封闭验证:关闭所有引流规则,多次刷新电商页面,观察监控是否有流量进入单元格H。