更多内容关注微信公众号:fullstack888

在有关微服务、DevOps、Cloud-native的迭代过程中,不可避免的需要“上线”,上线就需要部署,需要部署就意味着有修改,修改则意味着有风险。

目前有很多部署模式,本文的目的是对部署方案的总结。包括:蓝绿部署、A/B 测试、灰度发布、滚动发布、红黑部署等概念经常被提到的区别。

一、蓝绿部署(Blue/Green Deployment)

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

第一步:初始化状态,流量全部打到版本1中。

第二步:发布版本2(发布的代码包含新功能和Bug修复等)

第三步:将流量从版本1切换到版本2。

第四步:等到版本2测试正常,则删除版本1正在使用的资源(例如实例,数据库),从此正式用版本2。

4、蓝绿发布的注意事项

  • 当切换到蓝色环境时,需要妥当处理未完成的业务和新的业务。如果你的数据库后端无法处理,会是一个比较麻烦的问题;

  • 蓝绿部署在蓝绿阶段,需要平时服务器的数量的两倍,所有,如果基础设施层有更好的支持就更好了。

  • 如果应用之间有MQ,需要在业务架构层面做好兼容。

  • 蓝绿发布对于增量升级有比较好的支持,但是对于涉及数据表结构变更等等不可逆转的升级,并不完全合适用蓝绿发布来实现,需要结合一些业务的逻辑以及数据迁移与回滚的策略才可以完全满足需求。

过去的 10 年里,很多公司都在使用蓝绿部署(发布)来实现热部署,这种部署方式具有安全、可靠的特点。蓝绿部署虽然算不上“ Sliver Bullet”,但确实很实用。

不过蓝绿发布在大型的微服务系统已经很难在用了,主要是考虑到服务器成本,以及如果本次改动涉及到的中间件过多,数据迁移和回滚都很麻烦。如果丹丹做应用层面的蓝绿,写代码就需要考虑各种向前和向后的兼容。

BlueGreenDeployment中给出的一张图特别形象:

二、A/B 测试(A/B Testing)

A/B测试跟蓝绿部署完全是两码事。A/B测试是用来测试应用功能表现的方法,例如可用性、受欢迎程度、可见性等等。A/B测试通常用在应用的前端上,不过当然需要后端来支持。

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

A/B测试和蓝绿部署可以同时使用。

三、灰度发布/金丝雀发布

定义:灰度发布是一种增量发布的类型,在原有版本可用的i情况下,采用一种平滑过渡的方式发布。例如:现在有一个应用有100台服务器,我们用一台将某一台的服务器更新到最新版本作为“金丝雀”,然后通过服务路由的方式,将流量切到“金丝雀”的服务中,最后让测试人员测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。

如果测试没有问题,就一只只发布“金丝雀”,直到这100台的服务器都更新成最新版本。

金丝雀发布的来历:

注释:矿井中的金丝雀

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

灰度发布/金丝雀发布由以下几个步骤组成:
1、准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
2、从负载均衡列表中移除掉“金丝雀”服务器。
3、升级“金丝雀”应用(排掉原有流量并进行部署)。
4、对应用进行自动化测试。
5、将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
6、如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)
灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

灰度发布/金丝雀部署适用的场景:
1、不停止老版本,额外搞一套新版本,不同版本应用共存。
2、灰度发布中,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。
3、经常与A/B测试一起使用,用于测试选择多种方案。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

四、滚动发布(rolling update)
滚动发布,一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。这种部署方式相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署,例如每次只取出集群的20%进行升级。

这种方式也有很多缺点,例如:
(1) 没有一个确定OK的环境。使用蓝绿部署,我们能够清晰地知道老版本是OK的,而使用滚动发布,我们无法确定。
(2) 修改了现有的环境。
(3) 如果需要回滚,很困难。举个例子,在某一次发布中,我们需要更新100个实例,每次更新10个实例,每次部署需要5分钟。当滚动发布到第80个实例时,发现了问题,需要回滚。此时,脾气不好的程序猿很可能想掀桌子,因为回滚是一个痛苦,并且漫长的过程。
(4) 有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
并不是说滚动发布不好,滚动发布也有它非常合适的场景。

红黑部署(Red-Black Deployment)

这是Netflix采用的部署手段,Netflix的主要基础设施是在AWS上,所以它利用AWS的特性,在部署新的版本时,通过AutoScaling Group用包含新版本应用的AMI的LaunchConfiguration创建新的服务器。测试不通过,找到问题原因后,直接干掉新生成的服务器以及Autoscaling Group就可以,测试通过,则将ELB指向新的服务器集群,然后销毁掉旧的服务器集群以及AutoScaling Group。
红黑部署的好处是服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线。

红黑部署参考:
https://sweetibharti.wordpress.com/2016/11/11/red-black-deployment-on-aws/

- END -

往期回顾

◆微服务下分布式事务模式的详细对比

◆非常详细的HTTPS分享

◆Apache Log4j2高危漏洞解决方案(新)

◆作为技术负责人,如何从0搭建公司后端技术栈

◆vivo AI 计算平台 kubernetes 集群弹性伸缩实践

◆MySQL 主键的重要度

◆如何画出一张优秀的架构图(老鸟必备)

◆阿里Oceanbase GitHub点赞送礼事件

技术交流,请加微信: jiagou6688 ,备注:Java,拉你进架构群

微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别...相关推荐

  1. 14.每日一读-到底什么是蓝绿、红黑、灰度发布

    1.科学部署的意义 尽可能减少服务停机时间 控制新版本带来的质量风险 2.全量发布与增量发布 3.蓝绿发布 1.我有两个应用集群,应用集群A与应用集群B,这两个集群的版本都是v1.0,现在使用蓝绿部署 ...

  2. 微服务下必须了解的4种部署策略!

    大家好,我是不才陈某~ 在项目迭代的过程中,不可避免需要上线.上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险.目前有很多部署发布的技术, 这儿将常见的做一个总结. 上面所说难免有些抽象 ...

  3. 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别

    在有关微服务.DevOps.Cloud-native.系统部署等的讨论中,蓝绿部署.A/B 测试.灰度发布.滚动发布.红黑部署等概念经常被提到,它们有什么区别呢?通过搜索相关资料,做一个简单的辨析,如 ...

  4. 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别...

    蓝绿部署.红黑部署.AB测试.灰度发布.金丝雀发布.滚动发布的概念与区别 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangyinghong_2 ...

  5. 基于微服务下的持续交付环境

    背景 随着互联网行业的兴起,敏捷开发.Devops被越来越多的公司提及或实施,力求有效地降低交付过程所耗费的成本并提高交付的效率. 持续交付通过建立自动化的构建.测试.部署机制,实现业务快速上线的过程 ...

  6. 【项目实战】正确辨析蓝绿部署、金丝雀发布(灰度发布)、滚动发布、A/B测试

    一.背景 蓝绿部署.A/B测试.金丝雀发布,以及灰度发布.流量切分等,经常被混为一谈,影响沟通效率. 根本原因是这些名词经常出现,人们耳熟能详能够熟练地谈起,对这些术语的理解却没有达成一致. 下面是从 ...

  7. 微服务下的APM全链路监控

    https://opentalk.upyun.com/333.html 2017 年 10 月 29 日,又拍云 Open Talk 联合 Spring Cloud 中国社区成功举办了"进击 ...

  8. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发...

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  9. 微服务下数据表之间的耦合关系

    微服务下数据表之间的耦合关系 1.问题产生 今天同事给我发了一个链接,问我这种做可视化建表的过程觉得怎么样?(如下图) 同事的意思主要是,在微服务架构下,新建单一数据表,然后表内数据需要引用其他数据表 ...

最新文章

  1. JVM---堆(逃逸分析与代码优化)
  2. 网络营销专员浅析网络营销优化对企业来说意味着什么?
  3. java全双工_TCP双向还是全双工?
  4. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...
  5. Spring4 MVC json问题(406 Not Acceptable)
  6. OS X下使用OpenGL做离屏渲染
  7. Flask Jinja2 模板中的变量和过滤器
  8. docker-compose 学习:通过 image 指令指定镜像搭建一个简单LNMP
  9. MagicDraw-参数图
  10. java判断生肖_Java写出生肖年判断
  11. requests爬取IT橘子
  12. “企业上云”计划出炉,三年内河北万家企业要上云!|中机智库
  13. 面向对象程序设计c++版董正言张聪课本课后习题答案第五章
  14. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
  15. opencv1.0用笔记本打开摄像头画面为黑色
  16. 【量化交易】风险预算与资本管理
  17. 树冠体积计算之体元累加法
  18. codeforce 590d
  19. vmware认证考试有几级,分别是什么?
  20. 一淘公布假报告让电商行业再临诚信考验

热门文章

  1. Total Commander 文件管理
  2. 【PC工具】更新微信语音转mp3保存备份方法及工具,微信语音备份方法,silk转mp3工具...
  3. 高分毕业论文答辩自述稿(附注意事项及模板)
  4. 80后冲入“剩女”阵营
  5. 基于java的俄罗斯方块游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
  6. UITextView 内边距设置
  7. IoT通讯技术选型及模型设计的思考
  8. Unity 草的制作
  9. python数据收集整理教案_数据收集整理教学设计
  10. 机器学习15-k-均值算法表述