
# 停服切换方案
#### 停服时长评估
基于华为云的迁移经验，切换期间大部分应用停服时长在0.5小时\~3.5小时，下面停服时长可供参考：
表1停服时长分析 
|                                                                                                                                               **上云迁移停服时长评估**                                                                                                                                               |||||||||
|:----------------------------:|---|---|---|---|---|---|---|---|
|                                                                                                                                       **总停服时长（** **36\~211** **分钟）**                                                                                                                                       |||||||||
|                                                                 **源端停机（** **12\~75** **分钟）**                                                                 ||| **增量数据同步及校验（** **6\~40** **分钟）**             ||| **目的端拉起（** **18\~96** **分钟）**                                                                  |||
| **源端停机（** **18\~96** **分钟）** | **时长（分钟）** | **缩短时长的方法**                                                                                                        | **增量数据复制** | **时长（分钟）** | **缩短时长的方法**          | **目的算业务拉起** | **时长（分钟）** | **缩短时长的方法**                                                           |
|      接入层流量入口关闭（网关/ELB）       | 1\~5       | 1、通过API接口调用或脚本批量操作，减少操作时间                                                                                          | 最后一次增量同步   | 1\~10      | 1、在业务低峰进行切换，减少增量数据   | 数据库开启写      | 1          | 1、脚本开启                                                                |
|         应用层停服（关停应用）          | 1\~30      | 1、提前关停非核心业务，减少操作量 2、统一运维批量关停，减少操作时间 3、统一日志平台，减少应用日志检查时间 | 数据校验       | 5\~30      | 1、开启工具的动态校验功能，减少校验时间 | 应用启动        | 1\~30      | 1、统一运维平台，批量关停，减少操作时间 2、统一日志平台，减少应用日志检查时间 |
|        中间件层停服（消息消费完）         | 5\~30      | 1、提前关停非核心业务，减少消息量 2、统一监控平台，减少检查时间                                                      | -          | -          | -                    | 应用测试        | 15\~60     | 1、测试用例自动化 2、只测试核心测试用例                   |
|         数据层停服（停写检查）          | 5\~10      | 1、统一监控平台，减少检查时间                                                                                                    | -          | -          | -                    | 流量切换        | 1\~5       | 1、通过API接口调用或脚本批量操作，减少操作时间                                             |
   
#### 停服时长例外情况
1. **停服时长小于30分钟：**若停服时长要求小于30分钟，可以通过分批迁移，划分较小的批次或者采用分层切换（比如先切应用层再切数据层）的方式，且所有操作都脚本化/工具化，停服时长也有可能小于30分钟。
2. **停服时长大于3.5小时：**迁移规模和数据量大、业务关联关系复杂无法分批、切换Runbook操作复杂且自动化程度不高，停服时长可能大于3.5小时，有的甚至8\~10小时。比如某大型企业600+微服务，100+个中间件，80+数据库，1000+个批处理任务，4000+个测试用例，停服时长约8个小时。
 
#### 减少停服时长的方法（分钟级）
停服时长与多个因素有关，企业可以通过分批+自动化+多次演练+业务适配改造，来减少停服时长。下图是四种减少停服时长的方法：
图1减少停服时长的方法   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002177562337.png "点击放大")
#### 四种停服切换方式
表2四种停服切换方式 
| **切换方式**                                                                        | **适用场景**                                                  | **停服时长** | **停服次数** | **影响范围** |
|:---|:---|:---|:---|:---|
| 一把切（应用层和数据层整体停机后切换）                                                             | 适用于停机窗口较长、无法清晰梳理应用之间和应用与数据层之间关联关系的业务                      | 长        | 1        | 全部业务     |
| 分3\~4次切换，应用层先灰度切流（1%，30%，...100%），然后停机，数据层整体切换，再将内外部域名切换到目的端                    | 适用于停机窗口较小，业务可接受短时间的跨云访问，跨云带宽和时延评估可以满足业务需求。                | 中        | 1        | 全部业务     |
| 分5\~10次切换，应用灰度切流（1%，30%，...100%），然后数据层分批次切换（比如：第一批缓存+数据库，第二批缓存+数据库，第三批中间件消息队列等） | 适用于停机窗口较小， 业务可接收短时间的跨云访问，跨云带宽和时延评估可以满足业务需求，且切换多次对内外部影响可控。 | 短        | 多次       | 部分业务     |
| 按照业务域分批切                                                                        | 适用于业务域相对独立，关联关系简单，可独立拆分上云。                                | 短        | 多次       | 部分业务     |
   
#### 一把切（应用层和数据层整体停机后切换）
**准备工作：**
1. 源端应用和数据已迁移到华为云；
2. 华为云应用层和数据层已完成业务功能和性能验证，可正常使用；
**业务切换：**
1. 停止源端应用层和批处理任务，使源端不再产生新增数据，检查中间件消息无新增，检查数据层无新增；
2. 源端数据层和华为云数据层增量同步完成，并完成数据一致性对比，断开同步链路；
3. 华为云上的应用层和数据层内部域名等配置修改，重启华为云上的应用服务；
4. 外部DNS域名解析，将解析地址从源端接入层切换到华为云接入层，使外部流量进入华为云；
图2一把切方案   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002177520729.png "点击放大")
#### 应用层灰度切流，数据层整体切换
应用层灰度切流前做好如下准备工作：
1. 源端应用层已迁移或部署到华为云；
2. 华为云应用层跨云访问源端数据库，已完成业务功能和性能验证，可正常使用。
准备工作完成过后，从源端接入层引流，按照1%\~30%，...100%逐步加大流量的方式，流量逐步灰度切换到华为云接入层。
图3应用层灰度切流   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002142203250.png "点击放大")
接下来进行数据层整体切换，步骤如下：
1. 源端和目标端的应用层和批处理任务停止服务，防止新数据写入，此时业务无法使用；
2. 等中间件消息队列中的消息消费完成，数据层增量同步到华为云，对比源端和目标端数据层数据一致性；
3. 修改配置，将华为云应用层指向华为云数据层，启动应用服务；
4. 外部DNS域名解析，解析地址从源端切换到华为云，流量进入华为云。
图4数据层整体切换   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002142361298.png "点击放大")
#### 应用层灰度切流，数据层分批切换
应用层灰度切流前做好如下准备工作：
1. 源端应用层已迁移或部署到华为云；
2. 华为云应用层跨云访问源端数据库，已完成业务功能和性能验证，可正常使用。
准备工作完成过后，从源端接入层引流，按照1%\~30%，...100%逐步加大流量的方式，流量逐步灰度切换到华为云接入层。
图5应用层灰度切流   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002177562341.png "点击放大")
接下来进行数据层分批切换，某批次数据层切换步骤如下：
1. 停止本批次数据层相关的应用和批处理任务。本批次的数据层静止（中间件消息队列中的消息消费完成，数据库无新增数据）；
2. 数据对比一致后，切换数据层；
3. 修改相关的配置，启动和本批次数据层相关的应用和批处理任务。进行功能验证及保障，确保业务正常；
4. 某批次应用（如APP1）的外部DNS域名解析，解析地址从源端切换到华为云，流量进入华为云。
图6数据层分批切换   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002177520733.png "点击放大")
该方案的优点如下：
1. 应用切换阶段操作简单，引流阶段只调整网关流量权重和负载均衡流量权重即可；
2. 网关、负载均衡灰度引流，一旦有问题，随时可以把流量切换回原环境；
3. 应用切换阶段，应用不需要停止，可正常访问；数据层切换阶段，仅需要部分应用停止写入，但可以读；
4. 数据层单次只切换部分节点，操作较少。只需要部分业务停机，其他业务可以正常使用。 该方案的缺点如下：
   
5. 需要应用层和数据层梳理，需要花费大量人力和时间；
6. 跨云后，数据层回退难度较大；
7. 跨云阶段依赖专线、如果有大量数据需要跨云访问，可能会造成业务延迟。
 
#### 按照业务域分批切换
**准备工作：**
1. 本批次要切换的业务域如X业务已完成部署及迁移；
2. 本批次要切换的业务域已内部通过功能和性能验证，可正常使用。
**本批次业务域切换步骤：**
1. 停止源端业务域1对应的应用层和批处理任务等，使其不再产生新增数据；停止和本业务域共用中间件和数据库的应用和批处理任务等，使其不再产生新增数据；
2. 检查本批次要切换的中间件和数据层无新增数据，数据对比一致后断开同步链路；
3. 修改目的端的相关配置；启动目标端业务域1对应的应用服务和批处理任务；启动源端和其共用中间件和数据库的应用服务和批处理任务；
4. 域名切换到华为云，进行功能和性能验证，确保业务正常。
图7按业务域分批切   
![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002142203254.png "点击放大")
