应用部署的六种策略

最后更新:2021-01-15

基本复制自https://mp.weixin.qq.com/s/1r4feSe5XQcx-6UqhZau7Q

目前有各种各样的技术来将新应用部署到生产环境,所以权衡对系统和终端用户的影响降至最少,选择正确的方式是非常重要的。

本文将着重讨论如下部署策略:

  • 重建部署:版本A下线后版本B上线
  • 滚动部署(滚动更新或者增量发布):版本B缓慢更新并替代版本A
  • 蓝绿部署:版本B并行与版本A发布,然后流量切换到版本B
  • 金丝雀部署:版本B向一部分用户发布,然后完全放开
  • A/B部署:版本B只向特定条件的用户发布
  • 影子部署:版本B接受真实的流量请求,但是不产生响应

1. 重建策略

重建策略是一个冗余的方式,它包含下线版本A,然后部署版本B。这个方式意味着服务的宕机时间依赖于应用下线和启动耗时。

优点:

  • 便于设置
  • 应用状态完整更新
  • 简单成本低

缺点:

  • 对用户影响很大,预期的宕机时间取决于下线时间和应用启动耗时

2. 滚动部署

滚动部署策略是指通过逐个替换应用的所有实例,来缓慢发布应用的一个新版本。通常过程如下:在负载调度后有个版本A的应用实例池,一个版本B的实例部署成功,可以响应请求时,该实例被加入到池中。然后版本A的一个实例从池中删除并下线。

考虑到滚动部署依赖于系统,可以调整如下参数来增加部署时间:

  • 并行数,最大批量执行数:同时发布实例的数目
  • 最大峰值:考虑到当前实例数,实例可以加入的数目
  • 最大不可用数:在滚动更新过程中不可用的实例数

优点:

  • 便于设置
  • 版本在实例间缓慢发布
  • 对于能够处理数据重平衡的有状态应用非常方便

缺点:

  • 发布/回滚耗时
  • 支持多个API很困难
  • 无法控制流量

3. 蓝绿部署

蓝绿部署策略与滚动部署不同,版本B(绿)同等数量的被并排部署在版本A(蓝)旁边。当新版本满足上线条件的测试后,流量在负载均衡层从版本A切换到版本B。

优点:

  • 实时发布、回滚
  • 避免版本冲突问题,整个应用状态统一一次切换

缺点:

  • 比较昂贵因为需要双倍的资源
  • 在释放版本到生产环境之前,整个平台的主流程测试必须执行
  • 处理有状态的应用很棘手

4. 金丝雀部署

也叫灰度发布

金丝雀部署是指逐渐将生产环境流量从版本A切换到版本B。通常流量是按比例分配的。例如90%的请求流向版本A,10%的流向版本B。

这个技术大多数用于缺少足够测试,或者缺少可靠测试,或者对新版本的稳定性缺乏信心的情况下。

优点:

  • 版本面向一部分用户发布
  • 方便错误评估和性能监控
  • 快速回滚

缺点:

  • 发布缓慢

5. A/B测试

A/B测试是指在特定条件下将一部分用户路由到新功能上。它通常用于根据统计来制定商业决策,而不是部署策略。然而,他们是相关的,可以在金丝雀部署方式上添加额外功能来实现,所以我们这里简要介绍一下。

这个技术广泛用于测试特定功能的切换,并发布使用占大部分的版本。

下面是可以用于在版本间分散流量的条件:

  • 浏览器cookie
  • 查询参数
  • 地理位置
  • 技术支持:浏览器版本、屏幕尺寸、操作系统等
  • 语言

优点:

  • 多个版本并行运行
  • 完全控制流量分布

缺点:

  • 需要智能负载均衡
  • 对于给定的会话,很难定位问题,分布式跟踪是必须的

6. 影子部署

影子部署是指在版本A旁边发布版本B,将版本A进来的请求同时分发到版本B,同时对生产环境流量无影响。这是测试新特征在产品负载上表现的很好用的方式。当满足上线要求后,则触发发布新应用。

这个技术配置非常复杂,而且需要特殊条件,尤其是分出请求。例如一个购物车平台,如果你想影子测试支付服务,你可能最终会是用户为他们的订单支付两次。这种情况下,可以通过创建一个仿真的服务来重复响应用户的请求。

优点:

  • 可以使用生产环境流量进行性能测试
  • 对用户无影响
  • 直到应用的稳定性和性能满足要求后才发布

缺点:

  • 双倍资源,成本昂贵
  • 不是真实用户测试,可能出现误导
  • 配置复杂
  • 某种情况下需要模拟服务

7. 总结

部署应用有很多种方法,实际采用哪种方式取决于需求和预算。当发布到开发或者模拟环境时,重建或者滚动部署是一个好选择。当发布到生产环境时,滚动部署或者蓝绿部署通常是一个好选择,但是新平台的主流程测试是必须的。

蓝绿部署和影子部署对预算有更高的要求,因为需要双倍资源。如果应用缺乏测试或者对软件的功能和稳定性影响缺乏信心,那么可以使用金丝雀部署或者AB测试或者影子发布。如果业务需要根据地理位置、语言、操作系统或者浏览器特征等这样参数来给一些特定的用户测试,那么可以采用AB测试技术。

最后但并不是最不重要的,影子发布很复杂,且需要额外工作来模拟响应分支流量请求,当可变操作(邮件、银行等)调用外部依赖时这是必须的,这个技术在升级新数据库是非常有用,使用影子流量来监控负载下的系统性能。

8. 参考资料

https://mp.weixin.qq.com/s/1r4feSe5XQcx-6UqhZau7Q

Edgar

Edgar
一个略懂Java的小菜比