浅聊版本发布

news2025/1/20 19:23:01

在一般情况下,升级服务器端应用,需要将应用源码或程序包上传到服务器,然后停止掉老版本服务,再启动新版本。但是这种简单的发布方式存在两个问题,

(1)在新版本升级过程中,服务是会暂时中断的。

(2)如果新版本有BUG,升级失败,回滚起来也非常麻烦,容易造成更长时间的服务不可用。

(3)新功能体验不好,版本升级过程中带来的流量有损,造成用户流失。

为了解决这些问题,人们研究出了几种常见的服务发布策略,下面一一介绍。

蓝绿发布

如上图所示,所谓蓝绿部署,是指同时运行两个版本的应用,蓝绿发布部署时候需要对服务的新版本进行冗余部署并不停止掉老版本,一般新版本的机器规格和数量与旧版本保持一致,相当于该服务有两套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进行版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。由于冗余部署的缘故,如果新版本上线后出现严重的程序 BUG,那么我们只需将流量全部切回至旧版本,大大缩短故障恢复的时间。待新版本完成 BUG 修复并重新部署之后,再将旧版本的流量切换到新版本。蓝绿发布通过使用额外的机器资源来解决服务发布期间的不可用问题,当服务新版本出现故障时,也可以快速将流量切回旧版本。

当然,蓝绿发布也可以在系统空闲时段进行升级,把现有的集群服务器一分为二,一半升级一半保留并隔离,待到新系统稳定后升级另一半服务器,并解除隔离。从而充分利用现有服务器资源。

蓝绿发布优点:

  1. 部署结构简单,运维方便;
  2. 服务升级过程操作简单,周期短。

蓝绿发布缺点:

  1. 资源冗余,需要部署两套生产环境;
  2. 新版本故障影响范围大。

滚动发布

滚动发布能够解决掉蓝绿部署时对硬件要求增倍的问题。

所谓滚动升级,就是在升级过程中,并不一下子启动所有新版本,是先启动一台新版本,再停止一台老版本,然后再启动一台新版本,再停止一台老版本,直到升级完成,这样的话,如果日常需要10台服务器,那么升级过程中也就只需要11台就行了。

但是滚动升级有一个问题,在开始滚动升级后,流量会直接流向已经启动起来的新版本,这个时候,新版本是不一定可用的,比如需要进一步的测试才能确认。那么在滚动升级期间,整个系统就处于非常不稳定的状态,如果发现了问题,也比较难以确定是新版本还是老版本造成的问题,但是如果原来没问题,也大致可以定位是新版本的问题。为了解决这个问题,我们需要为滚动升级实现流量控制的功能。

灰度发布(金丝雀发布)

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

在灰度发布开始后,先启动一个新版本应用,但是并不直接将流量切过来,而是测试人员对新版本进行线上测试,启动的这个新版本应用,就是我们的金丝雀。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。相比于前两种发布策略,灰度发布的思想则是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的机器。

灰度发布可以基于用户请求的元信息将流量路由到新版本,这是一种基于请求内容匹配的灰度发布策略。只有匹配特定规则的请求才会被引流到新版本,常见的做法包括基于 Http Header 和 Cookie。基于 Http Header 方式的例子,例如 User-Agent 的值为 Android 的请求可以访问新版本,其他系统仍然访问旧版本。基于 Cookie 方式的例子,Cookie 中通常包含具有业务语义的用户信息,例如VIP可以访问新版本,普通用户用户仍然访问旧版本(或者相反)。

如图,某服务当前版本为 v1,现在新版本 v2 要上线。为确保流量在服务升级过程中平稳无损,采用金丝雀发布方案,逐步将流量从老版本迁移至新版本。

灰度发布期间再对新版本做运行状态观察,收集各种运行时数据,如果此时对新旧版本做各种数据对比,就是所谓的A/B测试。通过在监控平台观察旧版本与新版本的成功率、RT 对比,当新版本整体服务预期后,即可将所有请求切换到新版本。

灰度发布的优点:

  1. 可以对特定的请求或者用户提供服务新版本,新版本故障影响范围小;
  2. 发布期间逐步对新版本扩容,同时对老版本缩容,资源利用率高。
  3. 需要构建完备的监控平台,用于对比不同版本之间请求状态的差异(做A/B测试)。

灰度发布的缺点:

  1. 仍然可能存在资源冗余,因为无法准确评估请求容量;
  2. 如果流量无差别地导向新版本,可能会影响用户的体验;
  3. 发布周期长。

总结:如下图描述了几种部署方式的演进

在新版本应用发布时,为了服务器不停机升级且影响最小,使用灰度发布策略,

在灰度发布开始时,使用HTTP Header等策略 匹配指定测试人员的流量到新版本上,

然后当新版本内部测试通过后,可以再按百分比、白名单等,将用户流量一点一点导入到新版本中,直到将流量全部导入到新版本上,最后完成升级,

如果期间发现问题,就立即取消升级,将流量切回到老版本。

运用灰度发布,就再也不需要加班到深夜进行停机升级了,在白天就可以放心大胆地、安全地发布新版本。


参考文档

蓝绿发布、滚动发布、灰度发布(金丝雀发布)、A/B测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 之 findChild

文章目录一、简述二、原型三、使用示例注意:Widget根据容器的不同寻找的方式不一样比如QWidget_3里面有LineEdit只需要直接找ui.QWidget_3但是如果是QStackWidget里面的化就是直接放ui->stackedDecive2->widget(0)里面就可以了一、简述 在Qt编程过程中&#…

Arm Linux Can

Arm Linux Can一:can-utils 安装二:can-utils 使用can网络关闭can波特率设置查询can0设备的参数设置can网络开启查询工作状态can发送数据can接受数据三:can回环测试四:C语言CAN编程初始化数据结构数据发送错误处理过滤规则回环设置五:Linux 系统中CAN 接口应用程序示例报文发送…

Spring 整合 Redis 的三个简单步骤

一、导入 Redis 依赖 1、导入 Redis 客户端 jar 包依赖 导入 jar 包是需要注意,Redis 是属于 CS 架构模式,服务端需先启动,然后客户端主动去连它。但是客户端怎么去连接服务端呢?这里有两种方式:一种是 Jedis 客户端…

糖果(差分约束+找最小值)

糖果 题目描述 幼儿园里有 n 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。 但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果…

区块链技术相关概述

第一节区块链技术相关概述一、区块链定义区块链其实就相当于一个去中介化的数据库,是由一串数据块组成的。狭义:区块链是就是一种按照时间顺序来将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造…

WebDAV之葫芦儿·派盘+MiXplorer

MiXplorer 支持WebDAV方式连接葫芦儿派盘。 手机内存不够用了?东西太多清理不过来?快来试试这款MiXplorer。 MiXplorer是一款非常强大实用的手机文档管理器,能给用户提供了一系列的文档处理功能,包括本地文件浏览、文件排序、文件筛选、切换视图、新建文件、添

SSH免密登录配置

情况 服务器A: 192.168.0.101 服务器B: 192.168.0.102 在服务器A上 可以使用 ssh root192.168.0.102 无需密码登录到192.168.0.102 配置 服务器A: 192.168.0.101 上查看是否有ssh公钥 1.进入.ssh目录: cd ~/.ssh 2.找到id_rsa.pub文件: ls 3.查看公钥…

ucos3+emwin+appwizard控制硬件LED

1.新建appwizard项目2.AppWizard 设计器导出代码,点击 File→Export&Save 3.移植代码到keil其中,Soure 和Resource 中的C文件,添加到项目代码Simulation和Soure 和Resource 中的h文件,添加到编译器的include path。修改Source\Generated下…

Docker容器管理常用

Docker容器管理常用docker容器管理命令创建容器进入容器Attach和exec暂停容器删除容器创建容器并在停止时销毁容器查看容器查看容器的详细信息查看容器执行的完整命令查看容器日志查看已退出容器的日志查看容器指定日期的日志修改容器名指定容器实例的主机名容器特权privileged…

从零开始学习Redis

非关系型数据库简述 关系型数据库(SQL):Mysql,oracle 特点:数据和数据之间、表和字段之间,表和表之间是存在关系的。 优点:数据之间有关系、进行数据的增删改查时非常方便、关系型数据库有事务操作,保证数据的完整性…

离散数学与组合数学-02二元关系

文章目录离散数学与组合数学-02二元关系上2.1 序偶和笛卡尔积2.1.1 有序组的定义2.1.2 笛卡儿积笛卡儿积的性质2.2 关系的定义2.2.1 二元关系定义与案例2.2.2 二元关系的数学符号定义案例枚举二元关系2.2.3 定义域和值域2.2.4 二元关系概念的推广2.3 关系的表示2.3.1 集合表示法…

Swift(1)

前段时间在忙着考试,今天终于线上考试结束了,最后一场考试被安排到开学。 今天来看一下Swift: 首先,Swift是苹果于2014年WWDC苹果开发者大会发布的新开发语言,可与Objective-C共同运行于macOS和iOS平台,用…

CadSoftTools Web CAD SDK 14.1.0.51184 Crack

Web CAD SDK是一个 ASP.NET 控件,用于在Internet、Intranet、SharePoint、Office 365 和其他支持 HTML5 的在线技术上 查看DWG和其他CAD 文件。该产品不需要安装AutoCAD或其他第三方应用程序或组件,并随 C# 示例一起提供。 格式 CAD 格式: A…

克里金法学习笔记

目录1.Arcmap克里金法的工作原理:2.Kriging From Wikipedia:[https://en.wikipedia.org/wiki/Kriging](https://en.wikipedia.org/wiki/Kriging)3.实例分析4.代码部分5.较好的案例1.Arcmap克里金法的工作原理: https://desktop.arcgis.com/zh-cn/arcmap…

Android so库开发——使用addr2line查看so异常信息(四)

在NDK开发中经常会出现应用Crash的情况,而JNI层的报错信息,不像Java层报错信息那样可以直接在日志中看到错误的行数,JNI层中出现的错误直接看根本定位不到错误的位置。通常来说,JNI报的基本都是堆栈信息,需要NDK的一些…

时序数据库TDengine建模思路

一、时序数据库基本概念 基本属性 1.采集量 采集量是指传感器、设备或其他类型采集点采集的物理量,比如电流、电压、温度、压力、GPS 位置等,是随时间变化的参数 2.标签 标签是指传感器、设备或其他类型采集点的静态属性,不是随时间变化的…

纯 CSS3 卡通小火车行驶动画

自从CSS3流行以来,基于纯CSS3的动画就层出不穷,有纯CSS3的人物动画、纯CSS3按钮动画等。这次,我们给大家分享一个很不错的CSS3卡通火车沿轨道行驶动画,一辆卡通样式的火车缓缓驰过,特别是火车头的动画设计,…

二叉树21:合并二叉树

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:617. 合并二叉树 题目: 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其…

Vuex状态管理

Vuex:管理组件中共用的一些状态,并能够做一些操作 一、准备工作 安装Vuex ① 默认安装vuex4版本:执行命令 npm install vuex ② 指定安装vuex3版本:执行命令 npm install vuex3 引入Vuex 在src目录下新建名称为store的文件夹&am…

微信小程序wxss相关介绍、全局配置和tabbar知识以及发送数据请求(post,get)

wxss相关介绍 什么是wxss??? wxss (WeiXin Style Sheets)是一套样式语言,用于美化WXML的组件样式,类似于网页开发中的CSS。 WXSS 具有CSS大部分特性,同时,WXSS还对CSS进行了扩充以及修改,以适应微信小程序的开发。 …