蓝绿部署

蓝绿部署是一种通过冗余部署实现服务版本升级的策略,其基于现有的生产环境(蓝色环境)复制出一套实时同步的测试环境(绿色环境),以用于测试与灰度验证。通过调整虚拟IP与真实节点之间的映射关系,实现生产环境与测试环境的快速切换,应用侧无需改造,最大限度地减少服务中断时间,并提供快速回滚的能力。

重要

蓝绿部署当前仅对白名单用户开放,如需使用,请提交申请表单提交工单

功能简介

什么是蓝绿部署

蓝绿部署会创建两套完全相同的部署环境(蓝色环境和绿色环境),分别对应旧版本(蓝色环境)和新版本(绿色环境)。蓝色环境对外提供服务,绿色环境用于升级前的测试,通过DTS双向数据同步链路,绿色环境与蓝色环境保持同步。在蓝绿部署中,绿色实例的规格与蓝色实例保持一致。

  • 蓝色环境:生产环境,当前正在对外提供服务的环境,可读写。

  • 绿色环境:测试环境,只读。

蓝绿部署通过将流量从当前生产环境(蓝色环境)转发至测试环境(绿色环境),使您能够在真实环境中验证最新版本的功能和性能。借助蓝绿部署,您可以快速发现潜在缺陷,优化数据库性能,并在短暂且可控的停机时间内引入更新的数据库功能。

此外,蓝绿部署具备回滚能力,确保在出现问题时能够迅速恢复到变更前版本,从而为系统升级提供更高的可靠性与灵活性。这显著降低了数据库版本升级的风险,最大限度地减少了对业务的影响。

适用场景

蓝绿部署的典型适用场景是数据库大版本和小版本升级,升级流程如下:

  1. 新版本部署:

    • 创建绿色环境,数据库版本选择新版本。此时绿色环境作为测试环境,不对外提供服务。

    • 可以在绿色环境中进行充分的功能测试和性能验证,确保新版本的稳定性。

  2. 切换蓝色环境和绿色环境:

    • 当新版本验证无误后,切换蓝色环境和绿色环境。

    • 通过调整虚拟IP与真实节点之间的映射关系实现切换,在切换前后,蓝色环境中的实例IDIP地址将保持不变,操作简单且迅速。

  3. 监控与回滚:

    • 如果新版本上线后出现严重问题,可立即切换回旧版本,恢复旧版本的服务。

    • 回滚过程非常迅速,能够显著缩短故障恢复时间。

  4. 问题修复与重新部署:

    • 在修复新版本的问题后,可以将其重新部署到绿色环境中,并再次进行验证。

    • 待验证通过后,再次切换蓝色环境和绿色环境。

优势

  • 零停机发布:通过流量切换的方式实现版本升级,生产环境中的实例IDIP地址将保持不变,应用侧无需进行改造即可实现连接保持。

  • 快速回滚:如果新版本出现问题,只需切回旧版本即可,无需重新部署或修复。

  • 资源隔离:新版本和旧版本运行在独立的环境中,彼此隔离,避免相互干扰。

  • 高可用性:冗余部署确保了即使在流量切换过程中,也有足够的资源处理请求。

前提条件

创建蓝绿部署时,蓝色实例(生产环境实例)需满足以下条件:

计费说明

  • 蓝色实例费用:创建蓝绿部署时,会指定一个存量实例作为蓝色实例(生产环境实例),该实例正常计费(与蓝绿部署前保持一致)。

  • 绿色实例费用:创建蓝绿部署时,会新建一个绿色实例,该实例按量计费计费规则与标准按量付费实例一致。

  • DTS链路费用:创建蓝绿部署时,会自动创建一条DTS链路,该链路按量计费计费规则与标准DTS按量计费链路一致。

重要

202581日起,蓝绿部署享受如下优惠,优惠活动截止时间待定(另行通知)。

  • 绿色实例自创建之时起,15天内免费,超过15天后按量计费。

    绿色实例支持将计费方式转换为包年或包月,但只有处于按量计费模式时,才可以享受自创建之时起15天内免费的优惠活动。计费方式转换为包年包月后,自转换时刻起,将开始按照包年包月的实例进行收费。

  • 蓝绿部署中的DTS链路自创建之时起,15天内免费,超过15天后按量计费。

注意事项

  • 创建蓝绿部署后,蓝绿实例均不支持以下操作:

  • 创建蓝绿部署后,如果DTS链路被删除,将导致无法切换蓝绿部署。在此情况下,需要首先删除蓝绿部署,然后再进行重新创建。

  • 通过蓝绿部署升级数据库大版本时,当前仅支持从RDS MySQL 5.7升级到RDS MySQL 8.0。

创建蓝绿部署

在创建蓝绿部署时,您需要指定一个源数据库实例作为生产环境中的数据库实例,构成蓝色环境的核心部分。

  1. 访问RDS实例列表,选择地域并单击目标实例ID,该实例将成为蓝绿部署中的蓝色实例。

  2. 在左侧导航栏,选择蓝绿部署并单击左上角创建蓝绿部署

  3. 选择绿色实例(测试环境)的大版本

  4. 单击前往授权确定,完成SLR授权。

  5. 选择绿色实例的小版本后,单击创建

  6. 蓝绿部署配置确认弹窗中,单击确定

切换蓝绿部署

重要

切换蓝绿部署的过程中,高性能本地盘实例会有一次闪断,高性能云盘实例会有两次闪断,建议您在低峰期操作并确保应用具有重连机制。

  1. 确认切换条件:切换蓝绿部署前,蓝绿实例均需满足以下要求:

    • 实例状态为运行中。

    • 不存在只读实例。

    • 未开通数据库代理。

    • 数据库数量一致且对应。

    • 账号数量一致且对应。

    • DTS同步延迟小于5秒。

  2. 切换蓝绿部署:

    1. 访问RDS实例列表,选择地域并单击蓝色实例ID。

    2. 在左侧导航栏,选择蓝绿部署并单击蓝绿部署同步信息区域的切换

    3. 确认信息,设置切换时间并单击确定,系统将对蓝绿色实例的状态及配置进行检查。

      • 如未满足切换条件,请根据检查结果进行相应处理后再执行切换操作。

      • 如满足切换条件,实例状态会切换为蓝绿部署切换中,等待切换完成后实例状态变更为运行中。

删除蓝绿部署

删除蓝绿部署时分为以下两种情况:

  • 仅删除蓝绿部署关系

  • 删除蓝绿部署关系,同时删除绿色实例

    • 绿色实例会被释放。

    • 蓝色实例不受影响可正常使用,蓝绿部署的限制条件将会解除。

  1. 访问RDS实例列表,选择地域并单击蓝色实例ID。

  2. 在左侧导航栏,选择蓝绿部署并单击蓝绿部署同步信息区域的删除

附录一:蓝绿部署访问链路切换原理

访问链路切换是蓝绿部署的核心步骤之一,目的是将用户流量从生产环境(蓝色环境)平滑切换到测试环境(绿色环境)。其关键操作是切换虚拟IP地址(Virtual IP Address,VIP)与真实节点(Real Server,RS)的映射,如下图所示:

image

  • VIP:用户访问服务的入口。

  • RS:提供服务的具体实例。

通过修改VIPRS之间的映射关系,可以将流量导向新的环境。例如,当切换发生时,VIP从指向蓝色实例改为指向绿色实例。

附录二:切换前检查项及报错信息

检查项

报错信息

说明

状态检查(Status-Check)

Current DB instance status should be active.

数据库实例的状态应为运行中。

表数量(Table-Count)

The table count is different between blue and green instance.

蓝绿实例的表数量存在差异。

DTS状态(DTS-Status)

DTS status is not synchronizing.

DTS链路状态不是同步中。

DTS延迟(DTS-Delay)

DTS delay is greater than 5 seconds.

DTS同步延迟超过5秒。

只读(ReadOnly)

  • Both blue and green instances have read-only instances.

  • The blue instance has read-only instances.

  • The green instance has read-only instances.

  • 蓝绿实例均存在只读实例。

  • 蓝色实例存在只读实例。

  • 绿色实例存在只读实例。

数据库代理(MaxScale)

  • Both blue and green instances have maxscale.

  • The blue instance has maxscale.

  • The green instance has maxscale.

  • 蓝绿实例均存在数据库代理。

  • 蓝色实例存在数据库代理。

  • 绿色实例存在数据库代理。

连接地址(ConnectionString)

  • Private network connection string is inconsistent between blue and green instances.

  • Public network connection string is inconsistent between blue and green instances.

  • 蓝绿实例的私网连接地址不一致。

  • 蓝绿实例的公网连接地址不一致。

数据库(databases)

  • The following databases exist only in the Blue instance: {{DB...}}.

  • The following databases do not exist in the Blue instance: {{DB...}}.

  • 以下数据库仅存在于蓝色实例中:<对应数据库名>。

  • 以下数据库在蓝色实例中不存在:<对应数据库名>。

数据库账号(accounts)

  • The following accounts exist only in the Blue instance: {{account...}}.

  • The following accounts do not exist in the Blue instance: {{account...}}.

  • 以下数据库账号仅存在于蓝色实例中:<对应账号名>。

  • 以下数据库账号在蓝色实例中不存在:<对应账号名>。