介绍几种常见的运维发布策略

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

随着Devops的发展为了提高运维发布的成功率探索出了多种发布策略。本文简单介绍几种常见发布策略, 以及它们适用的场景和优缺点。

第一种停机发布

这是最早的一种发布策略停机发布会在发布以前关闭服务停止用户访问然后一次性的升级所有服务。这种发布策略的发布频率往往比较低且需要在发布之前做好充足的测试。

停机发布的特点有

  1. 所有需要升级的组件被整合到一次发布中
  2. 一个项目中的大部分应用都会被更新
  3. 发布之前的研发流程和测试流程往往需要花很长的时间
  4. 发布时如果出现问题, 修复和回滚的成本很高
  5. 完成一次停机发布, 需要花费很久的时间, 且需要很多团队在一起才能完成
  6. 往往需要客户端和服务器端同步升级

停机发布并不适合互联网公司因为两次发布的间隔很久从功能特性提出到进入市场的时间太长对市场反应不敏感会在充分竞争的市场里处于下风。每次发布因为要停机也会带来经济损失。

优势

  1. 简单, 不太需要考虑新旧版本共存时的兼容性问题

劣势

  1. 发布过程中服务不可用
  2. 只能在业务低峰期 (往往是夜间)发布并且需要很多团队在一起工作
  3. 出现故障后很难回滚

适合场景

  1. 开发测试环境
  2. 非关键应用用户影响面小
  3. 兼容性比较难管控的场景

第二种金丝雀发布

金丝雀发布这个术语源自 20 世纪初期当时英国的煤矿工人在下井采矿之前会把笼养的金丝雀携带到矿井中如果矿井中一氧化碳等有毒气体的浓度过高在影响矿工之前金丝雀相比人类表现的更加敏感快速金丝雀中毒之后煤矿工人就知道该立刻撤离。金丝雀发布是在将整个软件的新版本发布给所有用户之前先发布给部分用户用真实的客户流量来测试以保证软件不会出现严重问题降低发布风险。

在实践中金丝雀发布一般会先发布到一个小比例的机器比如 2% 的服务器做流量验证然后从中快速获得反馈根据反馈决定是扩大发布还是回滚。金丝雀发布通常会结合监控系统通过监控指标观察金丝雀机器的健康状况。如果金丝雀测试通过则把剩余的机器全部升级成新版本否者回滚代码。

优势

  1. 对用户体验影响较小在金丝雀发布过程中只有少量用户会受影响
  2. 发布安全能够得到保障

劣势

  1. 金丝雀的机器数量比较少, 有一些问题并不能够暴露出来

适用场景

  1. 监控比较完备且与发布系统集成

第三种灰度发布

灰度发布也叫滚动发布在我们公司用的比较多。它是金丝雀发布的延伸是将发布分成不同的阶段/批次每个阶段/批次的用户数量逐级增加。如果新版本在当前阶段没有发现问题就再增加用户数量进入下一个阶段直至扩展到全部用户。

灰度发布可以减小发布风险, 是一种零宕机时间的发布策略。它通过切换线上并存版本之间的路由权重逐步从一个版本切换为另一个版本。整个发布过程会持续比较长的时间, 在这段时间内, 新旧代码共存, 所以在开发过程中, 需要考虑版本之间的兼容性, 新旧代码共存不能影响功能可用性和用户体验。当新版本代码出现问题时, 灰度发布能够比较快的回滚到老版本的代码上。

结合特性开关等技术灰度发布可以实现更复杂灵活的发布策略。

优势

  1. 用户体验影响比较小, 不需要停机发布
  2. 能够控制发布风险

劣势

  1. 发布时间会比较长
  2. 需要复杂的发布系统和负载均衡器
  3. 需要考虑新旧版本共存时的兼容性

适用场景

适合可用性较高的生产环境发布

第四种蓝绿发布

蓝绿部署是指有两个完全相同的、互相独立的生产环境一个叫做“蓝环境”一个叫做“绿环境”。其中绿环境是用户正在使用的生产环境。当要部署一个新版本的时候先把这个新版本部署到蓝环境中然后在蓝环境中运行冒烟测试以检查新版本是否正常工作。如果测试通过发布系统更新路由配置将用户流量从绿环境导向蓝环境蓝环境就变成了生产环境。这种切换通常在一秒钟之内就能搞定。如果出了问题把路由切回到绿环境上再在蓝环境中调试找到问题的原因。因此蓝绿部署可以做到仅仅一次切换立刻就向所有用户推出新版本新功能对所有用户立刻生效可见。

优势

  1. 升级切换和回退速度非常快
  2. 零停机时间

不足

  1. 一次性的全量切换, 如果发布出现问题, 会对用户产生比较大的影响
  2. 需要两倍的机器资源
  3. 需要中间件和应用自身支持热备集群的流量切换

适用场景

机器资源比较富余或者按需分配 (背靠云厂商)

第五种A/B 测试

A/B 测试和灰度发布非常像可以从发布的目的上进行区分。AB 测试侧重的是根据 A 版本和 B 版本的差异进行决策最终选择一个版本进行部署。和灰度发布相比AB 测试更倾向于去决策和金丝雀发布相比AB 测试在权重和流量的切换上更灵活。

举个例子某功能有两个实现版本 A 和 B通过细粒度的流量控制把 50% 的用户总是引导到 A 实现上把剩下的 50% 用户总是引导到 B 实现上通过比较 A 实现和 B 实现的转化率最终选择转化率较高的 A 实现作为功能的最终版本。

优势

  1. 快速实验能力
  2. 用户体验影响小
  3. 可以使用生产环境流量做测试
  4. 可以针对某些特定用户做测试

不足

  1. 需要较为复杂的业务流量识别和控制能力
  2. 需要考虑较为复杂的新旧版本兼容性问题

适用场景

  1. 用来做业务探索和创新测试
  2. 需要对多个方案进行决策

第六种流量隔离环境发布

在上述的发布策略中, 发布的单位都是应用, 但是一个功能模块往往是由多个应用组合在一起提供的服务,即使当前发布的应用出现了异常, 这个异常也未必体现在当前应用中, 在复杂的情况下, 异常会延迟到它的下游应用才体现出来, 如何发现此类问题并且不影响用户体验是非常重要的。此外, 我们有时候还希望新版本的代码上线以后, 只影响到一小部分用户。而传统的灰度发布, 因为无法识别业务流量, 所以即使某个应用只有一台机器出现了问题, 也可能会影响到所有的用户。

如下图左侧的灰度发布App1 的所有机器都有一定概率会路由到出现问题的红色 App2 机器上。 而右侧的隔离环境发布中新版本的代码会先发布在全链路隔离环境中即使发布中出现问题也只会影响少量用户。

优势

  1. 能够发现一些复杂的, 涉及到多应用的问题
  2. 出现故障时, 只会影响很小一部分用户

不足

  1. 需要对流量隔离环境进行独立监控
  2. 系统设计复杂, 需要中间件和链路上的所有应用能够识别业务流量

适用场景

较为核心的生产业务场景

不同环境使用不同的发布策略

前面介绍的几种发布策略都有各自的优缺点要根据自己的场景特点和需求选择合适的发布策略。

一般来说测试环境是用来做初步功能测试所以会频繁的更新代码和发布如果采用灰度发布的方式且发布的批次设置的比较大则开发效率会大打折扣。这个时候单机或多机的单批次停机发布其实是一个不做的选择。

对于预发环境不仅要考虑自己测试的需要还要考虑上下游其他开发者的测试需求所以单批次停机发布就不再合适可以设置两批发布。

对于线上环境可以先发布隔离流量环境再多批次发布线上环境。

发布中关注监控报警

仅靠发布策略是无法避免故障的发生的在发布中和发布后仔细的观察应用的监控数据非常重要。应用的核心指标监控数据比如 QPS、RT、成功率和报错数能够帮助用户尽可能早的发现故障。此外在生产环境中如果批次数量设置的比较小每批发布机器数量比较少那么即使某些监控指标出现了问题因为数据量比较小可能会被淹没在整体的监控数据中所以配置已发布机器的独立监控也是非常重要的。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6