项目部署方式

蓝绿发布(Blue/Green Deployment)

  1. 定义

蓝绿部署是不停老版本,部署新版本而后进行测试。确认OK后将流量切到新版本,而后老版本同时也升级到新版本。前端

  1. 特色

蓝绿部署无需停机,而且风险较小。web

  1. 部署过程
  • 部署版本 1 的应用(初始的状态)

全部外部请求的流量都打到这个版本上。数据库

  • 部署版本 2 的应用

版本 2 的代码与版本 1 不一样(新功能、Bug修复等)。后端

  • 将流量从版本 1 切换到版本 2。
  • 如版本 2 测试正常,就删除版本 1 正在使用的资源(例如实例),今后正式用版本 2
  1. 小结

从过程不难发现,在部署的过程当中,咱们的应用始终在线。而且新版本上线的过程当中,并无修改老版本的任何内容,在部署期间,老版本的状态不受影响,这样风险很小。而且只要老版本的资源不被删除,理论上,咱们能够在任什么时候间回滚到老版本。安全

  1. 蓝绿发布的注意事项

当你切换到蓝色环境时,须要稳当处理未完成的业务和新的业务。若是你的数据库后端没法处理,会是一个比较麻烦的问题。服务器

  • 可能会出现须要同时处理微服务架构应用和传统架构应用的状况,若是在蓝绿部署中协调很差这二者,仍是有可能会致使服务中止。
  • 须要提早考虑数据库与应用部署同步迁移/回滚的问题。
  • 蓝绿部署须要有基础设施支持。
  • 在非隔离基础架构( VM 、 Docker 等)上执行蓝绿部署,蓝色环境和绿色环境有被摧毁的风险。
  1. 优点和不足
  • 优点

升级切换和回退速度很是快。架构

  • 不足

切换是全量的,若是 V2 版本有问题,则对用户体验有直接影响。 须要两倍机器资源。负载均衡

  1. 适用场合
  • 对用户体验有必定容忍度的场景。
  • 机器资源有富余或者能够按需分配(AWS 云,或自建容器云)。

灰度发布

  1. 定义

灰度发布是指在黑与白之间,可以平滑过渡的一种发布方式。AB Test 就是一种灰度发布方式,让一部分用户继续用 A,一部分用户开始用 B,若是用户对 B 没有什么反对意见,那么逐步扩大范围,把全部用户都迁移到 B 上面来。灰度发布能够保证总体系统的稳定,在初始灰度的时候就能够发现、调整问题,以保证其影响度。svg

  1. A/B Testing(灰度发布的一种)

A/B 测试是用来测试应用功能表现的方法,例如可用性、受欢迎程度、可见性等等。 A/B 测试一般用在应用的前端上,不过固然须要后端来支持。微服务

A/B 测试与蓝绿部署的区别在于, A/B 测试目的在于经过科学的实验设计、采样样本表明性、流量分割与小流量测试等方式来得到具备表明性的实验结论,并确信该结论在推广到所有流量可信;蓝绿部署的目的是安全稳定地发布新版本应用,并在必要时回滚。

  1. 金丝雀发布

咱们日常所说的金丝雀部署也是灰度发布的一种方式,在原有版本可用的状况下,同时部署一个新版本应用做为「金丝雀」服务器来测试新版本的性能和表现,以保障总体系统稳定的状况下,尽早发现、调整问题。

矿井中的金丝雀:17 世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会中止歌唱;当瓦斯含量超过必定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀做为瓦斯检测指标,以便在危险情况下紧急撤离。

灰度发布/金丝雀发布由如下几个步骤组成:

  • 准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
  • 从负载均衡列表中移除掉「金丝雀」服务器。
  • 升级「金丝雀」应用(排掉原有流量并进行部署)。
  • 对应用进行自动化测试。
  • 将「金丝雀」服务器从新添加到负载均衡列表中(连通性和健康检查)。
  • 若是「金丝雀」在线使用测试成功,升级剩余的其余服务器(不然就回滚)。

除此以外灰度发布还能够设置路由权重,动态调整不一样的权重来进行新老版本的验证。

  1. 优点和不足
  • 优点

用户体验影响小,灰度发布过程出现问题只影响少许用户。

  • 不足

发布自动化程度不够,发布期间可引起服务中断。

滚动发布(Rolling Update Deployment)

在金丝雀发布基础上的进一步优化改进,是一种自动化程度较高的发布方式,用户体验比较平滑,是目前成熟型技术组织所采用的主流发布方式。

  1. 定义

滚动发布:通常是取出一个或者多个服务器中止服务,执行更新,并从新将其投入使用。周而复始,直到集群中全部的实例都更新成新版本。

  1. 特色

这种部署方式相对于蓝绿部署,更加节约资源——它不须要运行两个集群、两倍的实例数。咱们能够部分部署,例如每次只取出集群的 20% 进行升级。

  1. 部署过程
  • 滚动式发布通常先发 1 台,或者一个小比例,如 2% 服务器,主要作流量验证用,相似金丝雀 (Canary) 测试。
  • 滚动式发布须要比较复杂的发布工具和智能 LB,支持平滑的版本替换和流量拉入拉出。
  • 每次发布时,先将老版本 V1 流量从 LB 上摘除,而后清除老版本,发新版本 V2,再将 LB 流量接入新版本。这样能够尽可能保证用户体验不受影响。
  • 一次滚动式发布通常由若干个发布批次组成,每批的数量通常是能够配置的(能够经过发布模板定义)。例如第一批 1 台(金丝雀),第二批 10%,第三批 50%,第四批 100%。每一个批次之间留观察间隔,经过手工验证或监控反馈确保没有问题再发下一批次,因此整体上滚动式发布过程是比较缓慢的 (其中金丝雀的时间通常会比后续批次更长,好比金丝雀 10 分钟,后续间隔 2 分钟)。
  • 回退是发布的逆过程,将新版本流量从 LB 上摘除,清除新版本,发老版本,再将 LB 流量接入老版本。和发布过程同样,回退过程通常也比较慢的。
  1. 优点和不足
  • 优点

用户体验影响小,体验较平滑。

  • 不足

发布和回退时间比较缓慢。 发布工具比较复杂,LB 须要平滑的流量摘除和拉入能力。