蓝绿发布、滚动发布、灰度发布,有什么区别?

2023-11-03


在项目迭代的过程中,不可避免需要”上线“。上线对应着部署,或者重新部署;部署对应着修改;修改则意味着风险。目前有很多部署发布的技术, 这儿将常见的做一个总结。

举一个情景例子, 你负责的项目要上线, 现在新版本较原来的老版本有很大的改变, 涉及到服务架构、前端UI等等, 经过测试功能没有障碍, 那么这时候如何让用户切换到新的版本呢?

显而易见, 第一次发布的应用是没有所谓的这个问题的, 这种如何发布的思考只会出现在后面的版本迭代中。


01、蓝绿发布

在蓝绿部署中,一共有两套系统:

  • 一套是正在提供服务系统(旧版),标记为“绿色”;
  • 另一套是准备发布的系统(新版),标记为“蓝色”。

两套系统都是功能完善的,并且正在运行的系统,只是系统版本和对外服务情况不同。正在对外提供服务的老系统是绿色系统,新部署的不对外提供服务的系统是蓝色系统。

蓝色系统不对外提供服务,用来做啥?

用来做发布前测试,测试过程中发现任何问题,可以直接在蓝色系统上修改,不干扰用户正在使用的系统。

蓝色系统经过反复的测试、修改、验证,确定达到上线标准之后,直接将用户切换到蓝色系统, 切换后的一段时间内,依旧是蓝绿两套系统并存,但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统(新系统)工作状态,如果出现问题,直接切换回绿色系统。

当确信对外提供服务的蓝色系统工作正常,不对外提供服务的绿色系统已经不再需要的时候,蓝色系统正式成为对外提供服务系统,成为新的绿色系统。原先的绿色系统可以销毁,将资源释放出来,用于部署下一个蓝色系统。
在这里插入图片描述
蓝绿发布特点

  1. 蓝绿部署的目的是减少发布时的中断时间、能够快速撤回发布。
  2. 两套系统没有耦合的时候才能百分百保证不干扰。

蓝绿发布注意事项

蓝绿部署只是上线策略中的一种,它并不是可以应对所有情况的万能方案。蓝绿部署能够简单快捷实施的前提假设是目标系统是非常内聚的,如果目标系统相当复杂,那么如何切换、两套系统的数据是否需要以及如何同步等,都需要仔细考虑。

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

  1. 可能会出现需要同时处理“微服务架构应用”和“传统架构应用”的情况,如果在蓝绿部署中协调不好这两者,还是有可能会导致服务停止。
  2. 需要提前考虑数据库与应用部署同步 迁移 /回滚 的问题。
  3. 蓝绿部署需要有基础设施支持。
  4. 在非隔离基础架构( VM 、 Docker 等)上执行蓝绿部署,蓝色环境和绿色环境有被摧毁的风险。


02、滚动发布

一般是取出一个或者多个服务器停止服务,执行更新,更新完成后新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。

发布流程:

相对于蓝绿发布需要一套完备的机器不同, 滚动发布只需要一台机器(这里拿一台机器举例是为了理解, 实际可能是多台), 我们只需要将新功能部署在这台机器上, 然后去替换正在运行的机器, 如上图, 将更新后的功能部署在Server1 上, 然后Server1去替换正在运行的Server, 替换下来的物理机又可以继续部署Server2的新版本, 然后去替换正在工作的Server2 , 以此类推, 直到替换完所有的服务器, 至此 ,服务更新完成。
在这里插入图片描述
滚动发布特点

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

滚定发布注意事项

  1. 滚动发布没有一个确定可行的环境。使用蓝绿部署,我们能够清晰地知道老版本是可行的,而使用滚动发布,我们无法确定。
  2. 修改了现有的环境,回滚困难。举个例子,在某一次发布中,我们需要更新100个实例,每次更新10个实例,每次部署需要5分钟。当滚动发布到第80个实例时,发现了问题,需要回滚,这个回滚却是一个痛苦,并且漫长的过程。
  3. 有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
  4. 因为是逐步更新,那么我们在上线代码的时候,就会短暂出现新老版本不一致的情况,如果对上线要求较高的场景,那么就需要考虑如何做好兼容的问题。


03、灰度发布

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

具体到服务器上, 实际操作中还可以做更多控制,譬如说,给最初更新的10台服务器设置较低的权重、控制发送给这10台服务器的请求数,然后逐渐提高权重、增加请求数。一种平滑过渡的思路, 这个控制叫做“流量切分”。

过程:

  1. 准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
  2. 将“金丝雀”服务器部署进服务器中。
  3. 从负载均衡列表中移除掉“金丝雀”服务器。
  4. 升级“金丝雀”应用(排掉原有流量并进行部署)。
  5. 对应用进行自动化测试。
  6. 将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
  7. 如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)
    在这里插入图片描述


04、A/B测试

A/B测试和蓝绿发布、滚动发布以及金丝雀发布,完全是两回事。

蓝绿发布、滚动发布和金丝雀是发布策略,目标是确保新上线的系统稳定,关注的是新系统的BUG、隐患。

A/B测试是效果测试,同一时间有多个版本的服务对外服务,这些服务都是经过足够测试,达到了上线标准的服务,有差异但是没有新旧之分(它们上线时可能采用了蓝绿部署的方式)。

A/B测试关注的是不同版本的服务的实际效果,譬如说转化率、订单情况等。

A/B测试时,线上同时运行多个版本的服务,这些服务通常会有一些体验上的差异,譬如说页面样式、颜色、操作流程不同。相关人员通过分析各个版本服务的实际效果,选出效果最好的版本。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝绿发布、滚动发布、灰度发布,有什么区别? 的相关文章

  • 6类典型场景的无线AP选型和部署方案

    你们好 我的网工朋友 前段时间刚给你们来了篇解决无线频繁断网的技术文 解决无线频繁断网 这个办法值得收藏 不少朋友私聊 说想再聊聊无线AP的选型和部署方案 这不就安排上了 无线网络覆盖项目中 无线AP的合理选型和部署非常重要 在设计施工中
  • Linux 软件安装以及管理

    本篇主要记录常用的软件安装和管理方式 主要是 yum rpm dnf apt pip 大致都是一样的 主要是部分软件提供了解决依赖的功能 内容不包括源码安装 源码安装情况相对比较复杂 后续有时间再补充 约定 案例所用模板软件均为 pytho
  • 自定义编写zabbix_agent脚本

    vi usr lib systemd system zabbix agent servicce Unit Description Zabbix Agent After syslog target After network target S
  • sonar.analysis.mode 参数的替代方案

    我正在使用 Sonarqube 7 9 和 Gitlab 以及 Maven docker 映像 该映像使用以下命令调用我的 Sonarqubemvn batch mode verify sonar sonar DskipTests true
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • GitLab CI 实现项目A更新代码自动触发项目B更新错误码文档

    一 CI CD简介 CI CD 是持续集成 Continuous Integration 和持续交付 持续部署 Continuous Delivery Continuous Deployment 的缩写 是一种软件开发和交付的最佳实践 这两
  • 组名称变量在天蓝色管道中可以是动态的吗?

    我在 azure 上有两个环境 它们之间的区别之一只是来自变量组的环境变量 是否可以为一个管道动态设置组名称 而不是设置两个可以映射自己的组变量的管道 这是我的构建管道的示例 trigger master develop jobs job
  • Azure DevOps 中的构建管道和发布管道有什么区别?

    我已经设置了几个多阶段构建管道Azure DevOps通过使用 yaml文件 我读过有关可用的 发布管道 的信息 我想知道它们有什么好处 他们似乎也在做同样的事情 甚至不提供 YAML 的支持 那么这里的主要区别是什么 使用发布管道而不是通
  • 循环访问 Azure 管道中的变量

    我有一个文本文件 其中有两个名称client1 and client2 我有一个 Powershell 脚本来读取文本文件 我对它的理解是它已经创建了一个数组 clientvariable Get Content Path FilePath
  • 我的 docker 容器没有互联网

    我本来可以正常工作 但现在停止了 我尝试了以下命令但没有效果 docker run dns 8 8 8 8 base ping google com docker run base ping google com sysctl w net
  • 在开发与生产版本中自动更改 Vite 代理位置?

    在我正在开发的单页应用程序中 我正在使用 Vite 并在我的vite config ts文件我有以下代理 proxy v1 target https 127 0 0 1 8080 changeOrigin true secure false
  • 如何使用jenkins管道将war部署到tomcat?

    我想使用管道部署 war 文件 正确的做法是什么 有没有办法在管道代码中使用部署到容器 调用catalina sh或使用curl命令使用jenkins管理器进行部署的问题是我找不到任何方法来检测成功的部署 有没有标准的方法可以做到这一点 在
  • 使用服务名称在 docker-compose React 容器中调用 API 到 django 容器

    我有一个 docker compose 其中包含一个 React 应用程序和其他 django 容器 它们位于同一网络中 因此当我尝试使用服务名称从 React 容器向其中一个 django 服务发出curl 请求时 它可以工作 但在 We
  • 使用 TFS 命令行部署 SSIS 项目

    如何从 TFS 2015 部署 SSIS 项目 对于常规数据库项目来说 sqlpackage exe publish与发布配置文件 将 SSIS 项目模型自动部署到服务器中的命令行参数是什么 我们使用的是 SQL Server 2016 E
  • 无法将 SonarQube 分析结果与 VSTS 集成

    我正在 VSTS 中使用准备 运行和发布分析任务来运行 SonarQube 分析并发布结果以构建摘要 前两个步骤成功执行 但 发布分析 任务失败 因为它无法获取分析 ID 的任务 我收到以下错误消息 无法获取 ID AWE9 wu8 fbf
  • Terraform 规划自动化中人类可读的输出

    我已经通过 github jenkins 设置了自动化 以通过 jenkins 发布 repo 的 terraform plan 的输出 作为对 github 中拉取请求的评论 整个编排工作得很好 除了 terraform plan 的输出
  • 在 Subversion 中合并分支时预防冲突

    我最近在 Subversion 中观察到一个非常奇怪的合并冲突 我使用乌龟SVN作为客户端 干线和分行详细信息请参见以下信息 树干 两个用户正在研究这个问题 QA 是主干合并将发生的分支 为了简单起见 trunk ClassLibrary1
  • 如何从 docker 容器运行 webpack 构建?

    我正在制作的应用程序是用 ES6 编写的 其他好东西是由 Docker 容器内的 webpack 转译的 目前 一切工作从创建内部目录 安装依赖项到创建编译的捆绑文件 当运行容器时 它说 dist bundle js 不存在 除非我在主机目
  • 为 Azure Bot 服务设置插槽或多个环境

    我正在使用 Azure Bot 服务开发 Microsoft Bot 希望为 QA 开发 暂存设置不同的环境或插槽 就像我们在 azure 应用程序服务中所做的那样 在设置中 我没有找到 部署槽位 选项 但在设置下 每个设置都有 槽位设置
  • 在 terraform 存储库中设置多个逻辑组织的子文件夹的正确方法是什么?

    目前我正在 azure 中开发一个基础设施 其中包括以下内容 资源组 应用网关 应用服务 etc 我所拥有的一切都在一张单曲里main tf我知道这是一个错误的文件 但我想从那里开始 我目前正在尝试将每个部分移到我的存储库中自己的子文件夹中

随机推荐

  • 单目标应用:海鸥优化算法(Seagull optimization algorithm,SOA)求解无人机路径规划(提供MATLAB代码)

    一 海鸥优化算法 海鸥优化算法 Seagull optimization algorithm SOA 由Gaurav Dhiman等人于2019年提出 海鸥是候鸟 繁殖期主要栖息于北极苔原 森林苔原 荒漠 草地的河流 湖泊 水塘和沼泽中 冬
  • Tomcat服务器解决跨域问题解决方式二

    第一步 在https mvnrepository com上查询并下载cors filter 1 7 jar java property utils 1 9 jar这两个库文件 放到lib目录下 E apache tomcat gcxt li
  • Angular,Vue,React三者的区别-个人理解

    题外话 学习了jQuery后 就在公司接触了Angular 第一次接触的时候 简直一脸懵逼呀 对于曾经习惯了对DOM元素进行操作的我真的好难好难 对于曾经没工作经验的我 Angular1入门还是比较难的 还好 努力克服了这个坎 在一次公司的
  • OD(Ollydbg)简介

    ollydbg简介 Ollydbg 通常称作OD 是反汇编工作的常用工具 OD附带了200脱壳脚本和各类插件 功能非常强大 可以过SE VMP3 0 深受逆向圈内人士的喜爱 OD 是一个反汇编工具 又叫OllyDebug 一个新的动态追踪工
  • 源码、反码、补码

    接下来的一章会提到位操作符 所以我们先介绍一下这三种二进制形式 整数的二进制表示形式 一共有三种 源码 反码 补码 1 正整数的原码 反码和补码都是相同的 2 负整数的原码 补码和反码是要经过计算的 首先 不管是正整数还是负整数都可以直接写
  • GateWay启动报错:Error processing condition on org.springframework.cloud.gateway.config.GatewayAutoConfig

    错误 java lang IllegalStateException Error processing condition on org springframework cloud gateway config GatewayAutoCon
  • 15.线程同步的几种方法

    一 为什么需要线程同步 线程同步通常是出现在多线程环境下的问题 对于多个线程同时访问的共享内存中的变量 如果不进行保护 就会导致一些列数据出错问题 以下图为例 假设线程A在第一次读取变量的值为10 每次写周期会将变量A加5 理论上当线程A完
  • mysql主键id的生成方式(自增、唯一不规则)

    1 利用uuid函数生成唯一且不规则的主键id sql CREATE TABLE test id varchar 100 COLLATE utf8 estonian ci NOT NULL COMMENT 唯一不重复 create time
  • AIX软件安装的相关命令

    文件集 Filesets AIX操作系统的最小可安装单元软件包 Packages 软件包由一组可独立安装的文件集组成注册的程序产品 LPP LPP包含所有与该注册的程序相关联的软件包 软件束 Bundles 一组软件 包含文件集 软件包和L
  • moment.js 时间处理的使用方法--含有CDN链接

    范例 https cybozudev kf5 com hc kb article 211149 CDN链接 https cybozudev kf5 com hc kb article 206405
  • ORACLE等待事件类型(一)

    author skate tiime 2009 11 18 ORACLE等待事件类型 Classes of Wait Events 每一个等待事件都属于某一类 下面给出了每一类等待事件的描述 Every wait event belongs
  • linux模拟网络丢包、延迟、数据包损坏

    环境 工具 linux TC tc默认系统自带 只对物理网卡生效 不对虚拟网卡生效 如果对关联了虚拟网卡的物理网卡使用会同时生效 模拟网络延迟 tc qdisc add dev eth0 root netem delay 1000ms ro
  • 解读es6 class 中 constructor 方法 和 super 的作用

    ES6 的 class 属于一种 语法糖 所以只是写法更加优雅 更加像面对对象的编程 其思想和 ES5 是一致的 类和模块的内部 默认就是严格模式 所以不需要使用use strict指定运行模式 定义类 class Point constr
  • c++ 文件类型判断

    要判断文件类型 即判断文件名是否包含文件的后缀 例如 txt文件的判断 string str abcd txt string str1 txt 当 str find str1 string npos时则说明字符串str中不存在 txt 这个
  • MonoField MonoReflectionField FieldInfo

    mono mcs class corlib System Reflection MonoField cs StructLayout LayoutKind Sequential internal class MonoField RtField
  • 环形链表问题

    题目 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示
  • linux 软件安装各种方法

    一 简单介绍 1 软件安装卸载 分几种情况 A RPM包 这种软件包就像windows的EXE安装文件一样 各种文件已经编译好 并打了包 哪个文件该放到哪个文件夹 都指定好了 安装非常方便 在图形界面里你只需要双击就能自动安装 如何卸载 1
  • SE-ResNet的实现

    见 D pythonCodes 深度学习实验 4 1 经典分类网络 inference代码汇总 models se resnet py 一 SE ResNet的实现方法 读了senet这篇论文之后 可以知道senet并没有提出一个新的网络
  • Easyui combobox 判断输入项是否存在于下拉列表中

    combobox的getValue方法很诡异 当输入项是存在于下拉列表时 返回的是需要的ID 但是当输入项是不存在于下拉列表时 却直接返回用户的输入结果 从而导致没法判断用户是否输入了下拉框不存在的项 本来第一时间想到直接判断getValu
  • 蓝绿发布、滚动发布、灰度发布,有什么区别?

    目录 01 蓝绿发布 02 滚动发布 03 灰度发布 04 A B测试 在项目迭代的过程中 不可避免需要 上线 上线对应着部署 或者重新部署 部署对应着修改 修改则意味着风险 目前有很多部署发布的技术 这儿将常见的做一个总结 举一个情景例子