Deploy Strategy
Table of content:
About
因为工作的一部分是提供 CI, CD,PaaS 平台,所以这篇文章主要是做一些部署策略的归类和分析总结,同时对业其他公司的方案进行调研。
部署模式
大爆炸
「大爆炸」部署一次性更新整个应用或者其中的大部分, 要求企业在发布之前进行广泛的开发和测试,通常和大型有序发布的「瀑布模型」有关。
大爆炸部署的特点包括:
所有的主要部件都打包在一个部署中;
- 用新的软件版本整个替换现有的版本,或者替换大部分;
- 部署通常会导致长时间的开发和测试周期;
- 假定失败的可能性很小,因为回滚是不可能和不现实的;
- 完成时间通常需要很久,需要多个团队的共同努力;
- 需要客户采取措施来更新客户端安装。
持续集成,持续交付,持续部署
使用更敏捷的方式进行变更,比如持续集成,持续部署。更小而快的方式进行迭代, 提前发现问题。
- 持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,确定新代码和原有代码能否正确地集成在一起。
- 持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
- 持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。
Ref:
- https://www.zhihu.com/question/23444990
- 图片来自 https://www.mindtheproduct.com/2016/02/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/
常见的部署策略
部署策略 | 描述 | 优势 | 劣势 | 适用场景 |
---|---|---|---|---|
Rolling upgrade | 滚动部署, 每次发布时,先将老版本 V1 流量从 Load Balance 上摘除,然后清除老版本,发新版本 V2,再将 Load Balance 流量接入新版本。 | 用户体验影响小,体验较平滑, 相对蓝绿发布节省机器或者容器资源 | 发布和回退时间比较缓慢 | 适用于资源比较紧张,对速度没有太大要求,但是服务又不能中断的部署场景 |
Blue/Green Deployment | 不能中断的业务场景 | 升级切换和回退速度非常快 | 需要两倍的资源 | 机器资源有富余或者可以按需分配 |
Canary Deployment | 金丝雀发布, 先发布小流量作为验证 | 出现问题影响的比例较小 | 这样的发布会耗费一定的时间 | 正式发布之前的验证 |
Reckless Deployment | 先将老版本 V1 全部下掉,再将新版本发到机器上去。这种方式会引入服务中断 | 简单成本低 | 服务中断用户受影响,出了问题回滚也慢 | 测试环境或者一些不重要的服务 |
Rolling Upgrade
滚动部署,逐渐用新版本替换旧版本, 最大限度的降低相关风险,包括面向用户的停机时间。
在此期间,新旧版本会共存,而不会影响功能和用户体验。这个过程可以更轻易的回滚和旧组件不兼容的任何新组件。
每次发布时,先将老版本 V1 流量从 LB 上摘除,然后清除老版本,发新版本 V2,再将 LB 流量接入新版本。
Blue/Green Deployment
蓝绿部署,也就是会同时存在两个版本,如果绿色版本激活后发现了问题,则将流量路由回到蓝色版本中。
蓝绿部署依赖流量路由。这可以通过更新主机的 DNS CNAMES 来完成, 也可以通过 HAProxy。
老版本通常会保留一定时间用作快速回滚。
Canary Deployment
金丝雀部署的主要挑战是设计一种路由部分用户到新应用的方法。
探索一些技术,来考虑路由新用户的方法:
- 在允许外部用户访问之前,将内部用户暴露给金丝雀部署;
- 基于源 IP 范围、特定地理区域发布应用,或者直接按照一定比例随机
在实践过程中发现,要做好金丝雀有以下的经验总结:
- 用不同的金丝雀的规模来达到不同的效果,比如小金丝雀用来验证是否有 typo,key error 以及其他错误,大金丝雀用来验证性能以及一些不明显的问题
- 提供清晰的金丝雀报表,让金丝雀等待的时间更有价值,同时让金丝雀期间发现的问题重复被发现
- 增加核心的指标,让金丝雀期间的表现更全面分析,同时提供自动回滚的机制,减少人工参与。
Reckless Deployment
简单粗暴,先杀后起,不管杀掉之后后果是什么。会带来服务的中断,通常用在测试环境或者是不是很重要的应用上。
其他发布方式
功能开关
利用代码中的功能开关(Feature Flag/Toggle/Switch)来控制发布逻辑,一般不需要复杂的发布工具和智能 Load Balance 配合,是一种相对比较低成本和简单的发布方式。
优势是切换比较灵活可控,切换成本也比较低。但是对代码有侵入,需要定期清理老的逻辑,代码维护成本大。适用于一些需要灰度新功能,或者针对部分用户开发的功能。
A/B 测试
和功能开关很相似,但是通常会是两组或多组方案上线,对比。通常需要一个专门的 A/B 测试的管理平台。
流量复制
对于一些涉及核心业务的遗留系统的升级改造,为了确保万无一失,有一种称为影子测试的大招,采用比较复杂的流量复制、回放和比对技术实现
影子测试因为旁路在独立测试环境中进行,可以对生产流量完全无影响, 实施的成本也比较高。适用于一些核心的组件升级。
比如一些开源的方案:
业内的方案 (持续更新)
Netflix 金丝雀
Netflix 开源了一个自动的金丝雀分析工具, 叫 kayenta,
kayent 会根据一些关键的指标来判断金丝雀的版本是否通过,如果不能就将金丝雀自动回滚。如上图,接受生产流量的会有三个集群:
- production cluster,当前的生产环境的版本,instance 数量比较多且由用户配置
- canary cluster, 金丝雀的版本,通常是新的代码或者配置改动,通常也只有三个 instances
- baseline cluster, 和生产环境是一个版本,只有三个 instances。(用来作 canary cluster 的对照组)
部署系统 Spinnaker 会来决定当前金丝雀是否满足标准以及是否要回滚,基于 httpcode, load avg, 错误,响应等指标, 同时提供一些金丝雀质量的分析。
相关文章:
- https://www.infoq.com/news/2018/04/kayenta
- https://medium.com/netflix-techblog/automated-canary-analysis-at-netflix-with-kayenta-3260bc7acc69
- 一篇中文的分析和介绍 http://ju.outofmemory.cn/entry/350839
Reference
- 这篇文章讲了各种常见的部署策略 http://blog.itaysk.com/2017/11/20/deployment-strategies-defined
- 详细分析了各种部署策略和最佳实践 https://rollbar.com/blog/deployment-strategies/
- 比较全面的优势劣势对比 http://www.10tiao.com/html/773/201803/2247487627/1.html
- Linkedln 应用实时线上流量进行自动化容量测量与性能瓶颈分析 slide https://myslide.cn/slides/8824
关于头图
拍摄自水魔方