关于不停机发布新版本程序的方式
“不停机发布新版本程序”,暂且这么称呼吧,其实就是所说的滚动发布、灰度发布、金丝雀发布和蓝绿发布。
之所以会总结性地提一下这几个概念,主要是本次出门游历,流浪到了乌兰察布市四王子旗,在这儿遇上了个有趣儿的家伙,就此话题进行了兴致勃勃地探讨,借此记录一下探讨结果。
滚动发布是指每次只升级一个或多个服务, 升级完成后加入生产环境, 不断执行这个过程, 直到集群中的全部旧版本升级新版本。 本质是新版本逐步替换旧版本。
| 优点 | 缺点 |
| 用户无感知, 平滑过渡 | 部署时间慢, 取决于每阶段更新时间 |
| 节省服务器 | 发布策略较复杂, 高度依赖自动发布工具 |
| 无法确定新旧版本之间谁产生了缺陷 | |
| 不易回滚 |
操作过程:
先升级 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…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
