首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布

笔者: 张首富
时间: 2019-01-24晚
QQ群: 895291458
博客地址: www.zhangshoufu.com

根据2018年的DevOps发展报告来看,目前的DevOps发展速度非常之快,已经逐渐成为企业运维的标准方案.DevOps的核心就是敏捷高效,敏捷Scrum开发技术曾被认为是最好的技术.
既然公司用到了CI/CD肯定就肯定避免不了持续部署,所以我们就需要考虑一套适合我们的发布方式,这个时候我们就需要了解一下这几个发布方式到底是什么意思,有很么好处,他们之间的差别在哪个地方.

蓝绿部署(Blue/Green Deployment)

定义:

蓝绿部署就是不停止使用老版本的情况下部署新版本进行测试,测试你ok后,将流量切换到新版本,然后老版本也升级到新版本

特点:

1,蓝绿部署无需停止,直接新旧版本都能使用,等待新版本测试正常之后才把流量迁移过来
2,需要两套相同的环境

部署过程:

这个地方拿web应用来做演示再也合适不过了,
1,把所有的请求都代理到老版本代码的Nginx服务器上,然后测试人员在新版本代码的Nginx上测试功能是否合格正常
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第1张图片
等待新版本代码所有功能验证通过之后我们在把流量切换到新版本代码所在的集群,等待观察使用一阶段之后再办原来老版本代码的服务器替换成更新的代码,
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第2张图片
就这样新旧代码上线测试发布,这个过程叫蓝绿发布.

蓝绿部署的好处:

新代码发布的时候不会影响旧代码,如果出现问题,我们只需要把流量全部迁移到老代码集群即可,风险比较小.

蓝绿部署的不足或风险:

  • 1,因为新旧代码同时在线,我们一定要考虑好后端数据库的处理问题,如果数据库处理不得当,那么蓝绿部署会给你带来不一样的感觉
  • 2,可能会出需要同时处理“微服务架构应用”和“传统架构应用”的情况,如果在蓝绿部署中协调不好这两者,还是有可能导致服务停止的;
  • 3,虽然代码回滚很简单,但是你因该考虑好数据库回滚的事情
  • 4,蓝绿部署需要你有足够多的服务器资源

流量走势图:

首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第3张图片

滚动发布(Rolling update)

定义:

一般是取出一个或多个服务器先停止服务,更换新的代码,然后投入生产使用,等待稳定在更换一批服务器的代码,周而复始,直到老版本完全被替换掉

特点:

这种部署的方式很像蓝绿部署,但是有和蓝绿部署不一样,他比蓝绿部署更加的节省资源(相同的集群不需要部署两套)

部署过程:

1,现在其中的一台或者多台机器上部署新代码,然后提供服务
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第4张图片
2,等过一段时间发现没有什么大问题,开始接着替换代码
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第5张图片
3,周而复始直到所有的代码被替换完成
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第6张图片

滚动发布的好处:

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

滚动发布的不足或风险:

  • 1,没有一个确定OK的环境。使用蓝绿部署,我们能够清晰地知道老版本是OK的,而使用滚动发布,我们无法确定。
  • 2,有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
  • 3,因为是逐步更新,那么我们在上线代码的时候,就会短暂出现新老版本不一致的情况,如果对上线要求较高的场景,那么就需要考虑如何做好兼容的问题。

滚动发布需要注意的事项:

  • 1,滚动式发布一般先发 1 台,或者一个小比例,如 2% 服务器,主要做流量验证用,类似金丝雀 (Canary) 测试
  • 2,滚动式发布需要比较复杂的发布工具和智能 LB,支持平滑的版本替换和流量拉入拉出。
  • 3,每次发布时,先将老版本 V1 流量从 LB 上摘除,然后清除老版本,发新版本 V2,再将 LB 流量接入新版本。这样可以尽量保证用户体验不受影响。
  • 4,回退是发布的逆过程,将新版本流量从 LB 上摘除,清除新版本,发老版本,再将 LB 流量接入老版本。和发布过程一样,回退过程一般也比较慢的。

流量走势图:

首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第7张图片

灰度发布/金丝雀发布

定义:

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

小插曲(为什么叫金丝雀发布)

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

特点:

部署过程:

1,准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第8张图片
2, 在原有的Nginx 后端中提出金丝雀服务器,升级金丝雀服务器上的应用代码,对齐进行测试
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第9张图片
3,带基础测试通过之后再把它加回到服务器急群众,来检测连通性和健康检查
首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第10张图片
4,带测试结束之后,升级其他服务器代码至新代码

灰度发布的好处:

用户体验影响小;
如果出问题只是一台服务器,不影响我们线上的业务,就是出了问题我们也能快速的解决(把金丝雀撤回来)

灰度发布的不足或风险

发布工具比较复杂,

流量走势图:

首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布_第11张图片

参考:
https://www.v2ex.com/t/344341
http://www.10tiao.com/html/773/201803/2247487627/1.html