关于不停机发布新版本程序的方式
“不停机发布新版本程序”,暂且这么称呼吧,其实就是所说的滚动发布、灰度发布、金丝雀发布和蓝绿发布。
之所以会总结性地提一下这几个概念,主要是本次出门游历,流浪到了乌兰察布市四王子旗,在这儿遇上了个有趣儿的家伙,就此话题进行了兴致勃勃地探讨,借此记录一下探讨结果。
滚动发布是指每次只升级一个或多个服务, 升级完成后加入生产环境, 不断执行这个过程, 直到集群中的全部旧版本升级新版本。 本质是新版本逐步替换旧版本。
| 优点 | 缺点 |
| 用户无感知, 平滑过渡 | 部署时间慢, 取决于每阶段更新时间 |
| 节省服务器 | 发布策略较复杂, 高度依赖自动发布工具 |
| 无法确定新旧版本之间谁产生了缺陷 | |
| 不易回滚 |
操作过程:
先升级 1 个副本, 主要做部署验证;
每次升级副本, 都需将待操作副本从 LB 上先摘掉, 待升级成功后再加入集群;
事先需要有自动更新策略, 分为若干次, 每次数量/百分比可配置;
回滚是发布的逆过程, 先从 LB 摘掉新版本, 再升级老版本, 这个过程一般时间比较长;
业务部署自动化程度要求高。
开始滚动升级后, 流量会直接指向已经启动起来的新版本, 但是这个时候,新版本是不一定可用的, 比如需要进一步的测试才能确认。 那么在滚动升级期间, 整个系统就处于非常不稳定的状态, 如果发现了问题, 也比较难以确定是新版本还是老版本造成的问题。
蓝绿发布提供了一种零宕机的部署方式。 不停旧版本, 部署新版本进行试, 确认业务状态无异常后, 将流量切到新版本。 始终有两个版本同时在线,有问题可以快速切换。 一套是正在提供服务系统, 标记为“绿色” ; 另一套是准备发布的系统, 标记为“蓝色” 。 两套系统都是功能完善的, 并且正在运行的系统, 只是系统版本不同。 开发了新版本, 要用新版本替换线上的旧版本,在线上的系统之外, 搭建了一个使用新版本代码的全新系统。 这时候, 一共有两套系统在运行, 正在对外提供服务的系统是绿色系统, 新部署的系统是蓝色系统。 蓝色系统经过反复的测试、 修改、 验证, 确定达到上线标准之后, 先将绿组的集群从负载均衡中移除, 由蓝组则对用户提供服务。 这段时间内观察蓝色系统(新系统) 工作状态, 如果出现问题, 直接切换回绿色系统。 当确信对外提供服务的蓝色系统工作正常, 不对外提供服务的绿色系统已经不再需要的时候, 蓝色系统正式成为对外提供服务系统, 成为新的绿色系统。 原先的绿色系统可以销毁, 将资源释放出来, 用于部署下一个蓝色系统。 或者移出的绿组进行服务的升级, 等升级完毕后, 再从新将绿组接入到负载均衡中为用户提供服务。 再把蓝组进行移除销毁, 将资源释放出来, 用于部署下一个蓝色系统。此时整个项目集群得进行升级完毕, 我们将此称为蓝绿发布。
蓝绿部署能够简单快捷实施的前提假设是目标业务系统是非常内聚的, 如果目标系统相当复杂,那么如何切换、两套系统的数据是否需要以及如何同步等,都需要仔细考虑。
| 优点 | 缺点 |
| 发布策略简单 | 服务器数量翻倍, 需要准备正常业务使用资源的两倍的服务器 |
| 用户无感知, 平滑过渡 | 如果出问题, 影响范围较大 |
| 升级或回滚速度快 | 短时间内会大幅增加资源成本 |
| 基础设施无改动, 升级稳定性较强 | 在非隔离基础架构(VM、 Docker 等) 上执行蓝绿部署, 蓝色环境和绿色环境有被摧毁的风险 |
金丝雀发布(Canary Release) , 中国大陆又称作灰度发布(Gray Release)。本质上是在生产环境上引一部分实际流量对一个新版本进行测试, 测试新版本的性能和表现, 在保证系统整体稳定运行的前提下, 尽早发现新版本在实际环境上的问题, 以确定产品交付形态。 它在一部分用户中逐步推出新功能或更新,以便在全面推出之前进行测试和评估, 这种方法可以帮助开发人员识别和解决潜在的问题, 同时最小化对用户的影响。 也算是一种软件产品质量测试方式,新版本如果出现问题, 只会发生在低比例的流量上。
事实上金丝雀发布(Canary Release) 和灰度发布(Gray Release) 略有区别: 金丝雀发布是只有一套系统, 版本升级是逐步替换这套系统; 灰度发布则是有稳定和灰度两套环境, 只升级部分服务, 一部分用户继续用老版本, 一部分用户开始用新版本, 如果用户对新版本没什么意见, 那么逐步扩大范围,把所有用户都迁移到新版本上面来, 即通过切换线上并存版本之间的路由权重,逐步从一个版本切换为另一个版本。
金丝雀发布实现步骤:
步骤一: 将流量从待部署节点移出, 更新该节点服务到待发布状态, 将该节点称为金丝雀节点;
步骤二: 根据不同策略, 将流量引入金丝雀节点。 策略可以根据情况指定, 比如随机样本策略、狗粮策略、分区策略、用户特征策略;
步骤三: 金丝雀节点验证通过后, 选取更多的节点称为金丝雀节点, 重复步骤一和步骤二, 直到所有节点全部更新。
| 优点 | 缺点 |
| 保证整体系统稳定性, 影响范围可控, 在初始灰度的时候就可以问题 | 影响范围很小, 相对用户体验也少 |
| 用户无感知, 平滑过渡 | 自动化要求高 |
| 新功能逐步评估性能, 稳定性和健康状况 | 只能适用于新旧版本兼容迭代场景 |
| 小步快跑, 快速迭代 | 需要详细规划业务流量切分的时机和权重策略 |
相关文章:
关于不停机发布新版本程序的方式
“不停机发布新版本程序”,暂且这么称呼吧,其实就是所说的滚动发布、灰度发布、金丝雀发布和蓝绿发布。 之所以会总结性地提一下这几个概念,主要是本次出门游历,流浪到了乌兰察布市四王子旗,在这儿遇上了个有趣儿的家伙…...
MeterSphere压测,出现HttpHostConnectException
现象:MeterSphere更换压力机后,压测出现出现HttpHostConnectException 解决方案: net.ipv4.tcp_tw_reuse默认是0或者2,更改为1 net.ipv4.tcp_tw_reuse,表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连…...
cherry-pick
要将dev分支的某次提交给master分支,可以使用以下命令: 1. 切换到dev分支:git checkout dev 2. 查看提交历史,找到要提交给master的某次提交的commit hash(假设为 <commit_hash>) 3. 切换到master…...
opencv形状目标检测
1.圆形检测 OpenCV图像处理中“找圆技术”的使用-图像处理-双翌视觉OpenCV图像处理中“找圆技术”的使用,图像处理,双翌视觉https://www.shuangyi-tech.com/news_224.htmlopencv 找圆心得,模板匹配比霍夫圆心好用 - 知乎1 相比较霍夫找直线算法, 霍夫找…...
k8s中无法获取到nginx-ingress的客户端真实ip地址x-forwarded-for
1.查看阿里云的nginx-ingress配置文档https://help.aliyun.com/document_detail/42205.html 容器K8s配置方案 如果您的服务部署在K8s上,K8s会将真实的客户端IP记录在X-Original-Forwarded-For字段中,并将WAF回源地址记录在X-Forwarded-For字段中。您需要…...
MySQL(4)索引实践(2)
一、分页优化 limit 1000 10, 其实不是只查询出10条记录,mysql底层会查询出1100条,然后舍去前1000条 所以,随着页的增多,查询效率会降低 1、可以使用取范围的方式比如id>1000 方式优化 2、使用关联查询优化…...
Kafka【命令行操作】
Kafka 命令行操作 Kafka 主要包括三大部分:生产者、主题分区节点、消费者。 1、Topic 命令行操作 也就是我们 kafka 下的脚本 kafka-topics.sh 的相关操作。 常用命令行操作 参数 描述 --bootstrap-server <String: server toconnect to> 连接的Kafka …...
springboot配置注入增强(二)属性注入的原理
一 原理 1 配置的存储 springboot在启动的时候会后构建一个org.springframework.core.env.Environment类型的对象,这个对象就是用于存储配置,如图springboot会在启动的最开始创建一个Environment对象 这个webApplicationType的枚举是在new SpringAppli…...
Android 使用Camera1实现相机预览、拍照、录像
1. 前言 本文介绍如何从零开始,在Android中实现Camera1的接入,并在文末提供Camera1Manager工具类,可以用于快速接入Camera1。 Android Camera1 API虽然已经被Google废弃,但有些场景下不得不使用。 并且Camera1返回的帧数据是NV21…...
2024字节跳动校招面试真题汇总及其解答(四)
12.Java的类加载机制 Java的类加载机制是指将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 类的加载过程分为以下五个阶段: 加载:将Class文件从磁盘读入内存,并…...
网页的快捷方式打开自动全屏--Chrome、Firefox 浏览器相关设置
Firefox 的全屏方式与 Chrome 不同,Chrome 自带全屏模式以及APP模式,通过简单的参数即可设置,而Firefox暂时么有这个功能,Firefox 的全屏功能可以通过全屏插件实现。 全屏模式下,按 F11 不会退出全屏,鼠标…...
LabVIEW使用ModbusTCP协议构建分布式测量系统
LabVIEW使用ModbusTCP协议构建分布式测量系统 分布式测量系统主要用于监控远程物体。这种系统允许对系统用户获得的数据进行全面的数据收集、处理、存储和组织访问。它们可能包括许多不同类型的传感器。 在任何具有互联网接入的个人计算机上运行的软件都会发送来自传感器的测…...
unity学习第1天
本身也具有一些unity知识,包括Eidtor界面使用、Shader效果实现、性能分析,但对C#、游戏逻辑不太清楚,这次想从开发者角度理解游戏,提高C#编程,从简单的unity游戏理解游戏逻辑,更好的为工作服务。 unity201…...
Spring Boot实现对文件进行压缩下载
在Web应用中,文件下载功能是一个常见的需求,特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API,通过该API,用户可以下载问价为ZIP压…...
Mac专用投屏工具AirServer 7 .27 for Mac中文免费激活版
AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具,能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App,从 iOS 设备无线传送到 Mac 电脑的屏幕上,把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…...
LabVIEW使用巴特沃兹低通滤波器过滤噪声
LabVIEW使用巴特沃兹低通滤波器过滤噪声 设备采集到的数据往往都有噪声,有时候这些数据要做判断使用,如果不处理往往会影响最终的结果。可以使用动态平滑,或者中值滤波等方法。这里介绍使用巴特沃斯低通滤波,也是非常方便的。 下…...
【Realtek sdk-3.4.14b】RTL8197FH-VG和RTL8812F自适应认证失败问题分析及修改
WiFi自适应认证介绍 WiFi 自适应可以理解为针对WiFi的产品,当有外部干扰信号通过,WiFi产品自动停止发出信号一段时间,以达到避让的目的。 问题描述 2.4G和5G WiFi自适应认证失败,信道停止发送信号时间过长,没有在规定时间内停止发包 2.4G截图 问题分析 根据实验室描述可以…...
SpringBoot 的版本、打包、Maven
一、SpringBoot 结构、集成 1.1、集成组件 Spring Core:Spring的核心组件,提供IOC、AOP等基础功能,是Spring全家桶的基础。 Spring Boot:一个基于Spring Framework的快速开发框架,可以快速创建独立的、生产级别的…...
不同类型程序的句柄研究
先做一个winform程序;随便放几个控件; 用窗口句柄查看工具看一下;form和上面的每个控件都有一个句柄; 然后看一下记事本;记事本一共包含三个控件,各自有句柄; 这工具的使用是把右下角图标拖到要…...
【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理
Godot 4.1 因为我在游戏中发现,越运行游戏变得越来越卡,当你使用 Node 节点中的 print_orphan_nodes() 方法打印信息的时候,会出现如下的孤儿节点信息 孤儿节点信息是以 节点实例ID - Stray Node: 节点名称(Type: 节点类型) 作为格式输出&a…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
Springboot多数据源配置实践
Springboot多数据源配置实践 基本配置文件数据库配置Mapper包Model包Service包中业务代码Mapper XML文件在某些复杂的业务场景中,我们可能需要使用多个数据库来存储和管理不同类型的数据,而不是仅仅依赖于单一数据库。本技术文档将详细介绍如何在 Spring Boot 项目中进行多数…...
5. TypeScript 类型缩小
在 TypeScript 中,类型缩小(Narrowing)是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码,确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…...
