万字长文一文看懂持续部署按需发布!DevOps部署和发布方法大全 | IDCF
Posted DevOps
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万字长文一文看懂持续部署按需发布!DevOps部署和发布方法大全 | IDCF相关的知识,希望对你有一定的参考价值。
来源:精益敏捷 作者:赵卫David
-
蓝绿部署 -
滚动部署 -
黑启动
-
金丝雀发布 -
灰度发布 -
A/B测试
-
特性开关 -
特性分支 -
抽象分支
一、前言
二、什么是部署与发布
-
研发团队发布一个版本,代表着开发完成并且测试完成是一个可以销售的软件,也代表着这个软件的上市。 -
将软件售卖之前,需要把版本复制到软盘、U盘或者刻录到光盘上,通常叫做发布到工厂(RTM,Release to manufacturing)。 -
软件正式上市售卖代表着软件已经Gone Live,上线。
-
如果是面向个人的桌面系统软件,那么由个人担当部署的人员,将软件(来源于软盘、光盘、U盘)进行安装,安装后自行进行配置。 -
如果是面向企业的软件,那么由甲方的IT工程师负责安装和配置,或者是由乙方的服务人员负责安装和配置。 -
还有另外一种情况,在甲方真正安装和配置软件之前,有一个用户验收测试(UAT,User Acceptance Test),在甲方的机房,先安装和配置一套,然后由甲方进行测试,如果测试通过,代表验收成功,就可以正式的去安装和配置。
-
用户能看见软件或者直接使用软件,概念上和互联网之前的年代是一样的,目的都是上市 通常是将一个版本发布到网上(RTW,Release to the web)或者叫做网上发布(Web release)。 -
在中国互联网行业,通常称之为上线(Release to production)。
-
部署变成了将软件包发布到生产环境的一个动作,或者是一个步骤。 -
即通过部署的动作,达成了发布的结果。
-
持续的,自动化的,将软件包发布到生产环境。 -
SaaS和网站类型的,就是直接部署到网站上。 -
移动应用App类型的会通过各种APP分发渠道,发到应用市场,例如苹果的AppStore,安卓的各种应用市场。
-
根据业务需要,发布功能。 -
发布,代表用户看见软件或者可以直接使用软件的功能,即release the functionality to end users。
-
对于一些ToB的企业级软件,例如电信行业,通常是软件+硬件整体销售给运营商(例如中国移动),仍然会涉及到发送硬件(例如交换件、路由器)到运营商,然后设备商(例如华为)的服务人员在客户现场进行机房、硬件等的安装和配置,之后才会割接上线。 -
而2011年建立的开放网络基金会开始在业界大力提倡软件定义网络(SDN,Software-defined networking)和OpenFlow协议,在一定程度上解耦了软件和硬件,那么DevOps的理念就有可能被达成,例如在华为生产的软件通过网络直接在中国移动的网络上升级软件。
-
是指在特定的环境中安装指定版本的软件(例如,将代码部署到集成测试环境中,或者部署到生产环境中)。 -
具体的说,部署可能与某个特性的发布无关。 -
如果部署与某个特性发布有关,部署后即时生效,即代表着发布,部署=发布。
-
是指把一个特性(或者一组特性)提供给所有客户或者一部分客户(例如,向5%的客户群开放特性)。 -
代码和环境架构要能够满足这种要求:特性发布不需要变更应用的代码。
三、什么是持续部署
四、持续部署实践
-
企业并没有广而告之声明有新版本发布,用户不知道软件已经升级,并且只有发布给选定的小部分用户,他们才能感知到新功能。 -
用户不知道被选定在测试新功能,例如用户界面没有变化,仅仅是后端算法逻辑等发生变化。 -
黑启动的另外一种做法,就是选定的部分用户实际上是公司内部员工,这样内部员工可以先吃自己的狗粮,对新功能进行测试,而真实用户并未真正使用新功能。
-
要黑启动这个功能,先发布给1%用户给他们启动这个功能,然后再分别发布给5%,30%用户。 -
在这个过程中评估结果。如果结果是增加了成交额,就可以逐渐增加推出的百分比,否则可以简单地回滚该功能,以便进一步评估和优化这个功能。
-
在将所有流量切换到新的系统架构之前,可以通过专门用于配置管理的开关/标志(toggle/flag)切换路由流量,以黑启动新的基础架构。例如,假设要停止维护自己的队列系统并切换到托管服务。可能会创建一个标志,将一些作业发送到新的托管服务,同时仍将大多数作业发送到旧的队列系统(并且设置了守护程序来监听这两个作业)。然后,可以在监视性能和其他指标时逐渐过渡到全托管服务。 -
这个发布策略和笔者2009年在敏捷中国大会参加会前Kent Beck的响应式设计培训是一致的,Kent Beck提到响应式软件设计的四个策略:飞跃Leap,并行Parallel,踏脚石Stepping stone,简化Simplification。针对风险比较大的重构或者新的基础设施,可以采用新老两套架构并行的方式,逐步迁移,并且两个架构同时向前发展,直到最终新架构代替老架构。
-
新功能对原有用户与系统的交互逻辑进行了修改。 -
通过ID(例如邮件或者用户名等)来圈出特定的要进行测试的β用户群,黑启动新功能给这些特定人群,企业随时可以添加或者删除β用户。 -
这种场景,被选定的用户群是可以感知新的功能的,这也被称作金丝雀发布,金丝雀发布时黑启动的一种类型。
-
在全面发布给所有用户之前,黑启动允许向VIP用户推出新功能。 -
可以允许用户自己选择加入或者退出黑启动功能。
五、按需发布实践
-
第一批金丝雀用户:先将新版本部署部分机器或者服务实例,并对部分选定用户开放。 -
第二批所有用户:之后再将所有其他机器或者服务实例进行部署,并对所有用户开放。
-
A1组:仅向内部员工提供服务的生产环境服务器。 -
A2 组:仅向一小部分客户提供服务的生产环境服务器,在软件达到某些验收标准后部署(自动化部署或手动部署均可)。 -
A3 组:其余的生产环境服务器,软件在A2 组中达到某些验收标准后再部署。
-
暂存用于部署的工件,包括:构建工件,测试脚本,配置文件和部署清单。 -
从负载均衡(Load Balancer)中删除“ 金丝雀”服务器。 -
在“ 金丝雀”服务器上升级新版本应用程序。 -
自动化测试应用程序。 -
恢复“ 金丝雀”服务器连接到负载均衡(连接性和完整性检查)。 -
如果用户实时使用情况下的“ 金丝雀”测试成功,则升级其余服务器。(否则回滚)
-
灰度发布,可以结合滚动部署一起使用,通过分批部署,部署即发布,来让部分客群可见。 -
灰度发布,需要结合特性开关等技术,做更复杂灵活的灰度。
-
实验目标:为同一个目标(例如优化转化率或改进某些业务指标等)。 -
实验变量:针对单一变量(例如页面的按钮颜色发生了变化)。 -
实验方案:制定两个版本(即A和B两个变体),在总体用户中取出一小部分,将这部分用户完全随机地分在两个组中,使两组用户在统计角度无差别,将两个版本分别展示给不同的用户组。 -
试验分析:有可能版本A是老版本称之为对照组,B是新版本称之为实验组,收集对照组和实验组组对应的用户体验数据和业务数据,最后分析、评估出最好版本,正式采用。
六、支持不同发布方式的技术实现
-
ToC的例子,所有的用户使用同样的单体软件部署到PC上之后,根据用户的购买的License,打开和关闭某些特性。 -
ToB的例子,电信行业,例如华为和中兴卖给中国移动的设备,在部署到客户网路之中后,不用升级软件,只要购买了新的License,相应的特性就会被打开。
-
在你想改变的那部分代码之上创建一个抽象层。 -
对其余部分的代码进行重构,使其使用这个抽象层使用其之下的代码提供的功能。 -
在新的实现代码里实现一些新的类,让其上的抽象层根据需要,选择性的导向旧代码或新增的类上。 -
剔除原有的旧实现。 -
清理,并重复前两步,如果需要,可同时交付你的软件。 -
一旦旧实现完全被代替后,如果你愿意,可以移除那个抽象层。
七、Facebook的案例
-
预推送测试(Pre-Push Testing):每个开发人员从主干Master上拉一个本地分支,在本地分支开发,在本地经过单元测试,静态代码扫描,以及部分集成测试之后,进行代码评审。 -
推送中(On push):代码评审之后就启动合并到Master的推送请求,代码在真正的push到master分支之前,触发了自动化测试,包括:单元测试,黄金流程(被大量使用的功能以及核心流程)的冒烟测试,以及简单的新功能测试确保新构建没有问题(build test);所有的自动化测试通过后,本地分支代码就被允许自动合并到master分支,如果出现合并冲突,相关的开发人员就解决冲突。 -
在主干和发布分支上持续测试:每隔几个小时,并行的在主干和发布分支上,持续的运行所有的自动化测试,包括:全面的的build test, 回归测试以及性能测试等。
八、总结
分类 |
方式 |
简要描述 |
特点 |
优势 |
不足 |
适用场合 |
部署 |
蓝绿部署
|
1.也称为红黑部署,不停绿环境的老版本,部署新版本到蓝环境 2.测试蓝环境确认OK后将流量切到新版本,然后老版本同时也升级到新版本 3.如果没有使用其他发布技术,部署即发布 |
1.使用负载均衡(Load Balancer) 2.一次性切换版本,立即生效 |
1.升级切换和回退速度非常快 2.零停机时间 |
1.切换是全量的,如果 V2 版本有问题,则对用户体验有直接影响 2.需要两倍机器资源 3.如果两个版本共享数据,需具备向后兼容 |
1.对用户体验有一定容忍度的场景 2.机器资源有富余或者可以按需分配(容器云) 3.对服务连续性要求优先级是最高的 4.每个新版本每次部署都采用这个策略 |
滚动部署 |
1.一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本 2.如果没有使用其他发布技术,部署即发布 |
1.相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。
2.使用负载均衡 3.经过多个批次的部署后,才最终部署完成 |
1.部署期间用户体验影响小,体验较平滑 2.零停机时间 |
1.部署和回滚时间相对缓慢,因为是分批次滚动操作 2.部署工具比较复杂,负载均衡需要平滑的流量摘除和拉入能力 3.由于两个版本同时存在,需要向后兼容 |
1.对用户体验和性能要求比较高,需要先行验证 2.对服务连续性要求非常高 3.要部署的机器或实例非常多 4.每个新版本每次部署都采用这个策略 |
|
黑启动 |
1.本意:针对新功能或者特定主要版本,首先是用户无感知的部署,进行性能等测试 2.扩展:然后可以开放部分客群流量,逐步扩大用户感知范围 |
1.先部署成功(结合其他部署方式) 2.再打开特性开关,逐步发布到更大范围的客群 |
1.用户无感知或者感知小 2.在暗模式下,可以提前发现大规模的性能问题 3.根据条件向部分用户发布,比较灵活去做验证或实验 |
1.为了真正的黑启动,让用户无感知,需要技术和工具手段 2.为了扩展,逐步扩大放量,需要其他的基础设施支持,投入较大 |
1.针对新功能或者特定主要版本,并不是每个版本都需要这个策略 2.验证重大算法、架构重构或者重大业务等 |
|
发布 |
金丝雀发布 |
1.也叫金丝雀测试,先发布一台或者小比例服务器或实例,经过流量验证后,再发布给所有用户,目的是线上验证,减少缺陷带来的影响 2.滚动部署的一个特例 3.黑启动的一种实现方式 |
1.对比滚动部署,先部署少量金丝雀机器或实例 2.少量金丝雀先接受流量 3.再全量发布 |
1.能够测试实时生产流量 2.用户体验影响小,发布过程出现问题缺陷等只影响少量用户 3.快速回滚 4.零停机时间 |
1.发布速度慢,因为需要监控金丝雀一段时间 2.需要对监控和可观测性投入 3.需要向后兼容 |
1.对新版本功能或性能缺乏足够信心 2.用户体验要求较高 3.降低全量发布的风险 4.网站式服务端发布应用比较广泛 |
灰度发布 |
1.增强性质的滚动部署和金丝雀发布,黑启动的一种实现方式 2.逐步发布开放流量给更大范围的客群,目的是利用客群流量提前发现缺陷 |
1.可以结合使用负载均衡的滚动部署和金丝雀发布 2.可以使用特性开关,结合其他技术,对不同范围客群打开特性开关 |
1.具备金丝雀发布特点 2.在保证基本功能和性能在金丝雀发布被验证之后,再逐步加大放量进一步验证 3.随着客群范围的逐步扩大,问题和缺陷可以得到及时发现和修复 |
1.发布速度慢,因为刻意的逐步放量有个时间过程 2.需要对监控和可观测性投入 3.需要向后兼容 |
1.对新版本质量、功能、性能缺乏足够信心 2.用户体验要求较高 3.降低全量发布的风险 4.移动端APP应用比较广泛
|
|
A/B 测试 |
1.针对两个功能A和B,随机选定两组类似的客群,进行对比试验,目的是验证假设,探索业务 2.黑启动的一种实现方式 |
1.测试功能表现和效果如何,例如可用性、受欢迎程度、可见性、转化率、业务指标等等 2.通常应用在前端页面上 3.也可以应用在后台不同策略的对比上 |
1.快速实验能力 2.用户体验影响小 3.可以使用生产流量测试 4.可以做到针对某类特定目标用户进行测试 |
1.设置和搭建复杂度相对较高,有技术门槛 2.由于采样偏差问题导致结果偏差 |
1.用来业务探索 2.有两个或多个方案要进行对比,验证假设 |
|
支撑技术 |
特性开关 |
通过开关控制新版本和老版本功能,打开开关走新版本代码逻辑,关闭开不按走老版本代码逻辑 |
1.支持简单的特性开和关 2.结合其他的分流技术,例如不同的用户画像、地域、IP网段、机房等,可以支持A/B测试,灰度发布,金丝雀发布 3.如果具备特性开关技术,可以不使用特性分支,来支持主干开发 |
1.针对不同条件,打开关闭开特性,非常灵活 2.升级和回滚非常快 3.零停机时间 |
1.简单的特性开关是全量切换,有可能打开开关给所有用户带来大量影响 2.复杂特性开关要结合各种分流技术 3.功能开关需要一个配置中心或者开关中心 |
1.需要精细化精准化运营测试 2.支持灰度发布 3.支持A/B测试 |
特性分支 |
根据选择的不同特性的分支,产生不同的版本 |
1.物理上是两个版本,各自有二进制包 2.需要结合不同的部署方式进行部署 |
1.与不同部署方式优势之处一样 2.结合滚动部署,金丝雀发布,支持有限的A/B测试 |
1.与不同部署方式不足之处一样 2.需要维护多个分支和版本 |
1.没有特性开关工具或研发能力 2.简单的版本管理 3.简单的部署管理 |
|
抽象分支 |
不使用特性分支,还能达到创建分支进行重构的同样效果,迭代发布增量的重构 |
1.没有使用多个分形分支 2.对新代码使用设计手段达成分支效果 |
1.持续发布 2.业务功能交付与重构交付并行 3逐步验证架构的方向和正确性 |
1.成本比一次性完成高 2.整个重构完成时间周期可能会较长 3.技术手段可能较难 |
1.需要较大的架构改动和重构 2.架构风险较大 3.同时还要支持交付业务功能 |
参考
软件发布生命周期:https://en.wikipedia.org/wiki/Software_release_life_cycle
持续部署:https://www.scaledagileframework.com/continuous-deployment/
按需发布:https://www.scaledagileframework.com/release-on-demand
亚马逊平均每11.6秒部署一次:https://www.youtube.com/watch?v=dxk8b9rSKOo
《凤凰项目:一个IT运维的传奇故事》:https://item.jd.com/12708994.html
《持续交付:发布可靠软件的系统方法》:https://item.jd.com/10843669.html
《持续交付2.0:业务引领的DevOps精要》:https://item.jd.com/12512514.html
《发布!设计与部署稳定的分布式系统 第2版》:https://item.jd.com/12627801.html
Facebook大规模快速发布:https://engineering.fb.com/2017/08/31/web/rapid-release-at-massive-scale/,https://www.jianshu.com/p/ef4e9aeac507
Facebook如何实现大规模快速发布:https://www.infoq.com/news/2017/09/facebook-release-scale/,https://www.zybuluo.com/sambodhi/note/893487
Facebook的移动端软件的持续部署:https://research.fb.com/wp-content/uploads/2017/01/paper_fse2016-003.pdf
Facebook移动发布流程:https://www.infoq.com/presentations/Facebook-Release-Process/
Facebook 的 DevOps 案例研究与相关工具:https://segmentfault.com/a/1190000019236151
我们经常聊的金丝雀发布、滚动发布、蓝绿发布到底有什么差别?https://mp.weixin.qq.com/s/MS8wi5t7btxO18Q0rfat4g
应用部署和测试战略:https://cloud.google.com/solutions/application-deployment-and-testing-strategies
应用部署的六个战略:https://thenewstack.io/deployment-strategies/
什么是蓝绿部署:https://digitalvarys.com/what-is-blue-green-deployment/
为什么领先公司使用黑启动:https://launchdarkly.com/blog/why-leading-companies-dark-launch/
Facebook Chat:https://www.facebook.com/note.php?note_id=14218138919
Facebok黑启动:https://controlaltconstruct.blogspot.com/2019/01/facebook-dark-launching-technique.html
黑启动:https://martinfowler.com/bliki/DarkLaunching.html
Kent Beck响应式设计:https://www.infoq.com/presentations/responsive-design/
动物哨兵:https://en.wikipedia.org/wiki/Sentinel_species
国内金丝雀:https://en.wikipedia.org/wiki/Domestic_canary
金丝雀发布:https://martinfowler.com/bliki/CanaryRelease.html
金丝雀测试:https://featureflags.io/canary-testing/
蓝绿部署,A/B测试和金丝雀发布:https://blog.christianposta.com/deploy/blue-green-deployments-a-b-testing-and-canary-releases/
A/B测试:https://en.wikipedia.org/wiki/A/B_testing
A/B测试知识点总结:https://www.jianshu.com/p/c5832ad60575
A/B测试实践全总结:http://www.woshipm.com/pmd/699804.html
A/B测试:https://learn.growthhackers.com.cn/skills/ab/
多变量测试与A/B测试:https://www.optimizely.com/optimization-glossary/multivariate-test-vs-ab-test/
特性开关:https://martinfowler.com/articles/feature-toggles.html
部署新版本:特性开关还是猪增量发布?:https://opensource.com/article/18/2/feature-flags-ring-deployment-model
特性开关驱动开发:https://blog.launchdarkly.com/feature-flag-driven-development/
探索如何在生产环境逐步地为部分或者全部用户启用特性:https://docs.microsoft.com/en-us/azure/devops/migrate/phase-features-with-feature-flags?view=azure-devops
特性开关使用场景:https://featureflags.io/feature-flag-uses/
利用抽象分支做增量式大规模软件改造:http://www.continuousdelivery.info/index.php/2013/01/04/branch_by_abstraction/
老马的抽象分支:https://martinfowler.com/bliki/BranchByAbstraction.html
Facebook主干开发:https://paulhammant.com/2013/03/13/facebook-tbd-take-2/
以上是关于万字长文一文看懂持续部署按需发布!DevOps部署和发布方法大全 | IDCF的主要内容,如果未能解决你的问题,请参考以下文章