运维发布系统详谈(代码片段)

author author     2022-12-21     344

关键词:

蓝绿发布
概念:
蓝绿部署是不停老版本,部署新版本然后进行测试。确认OK后将流量切到新版本,然后老版本同时也升级到新版本

特点:
蓝绿部署无需停机,并且风险较小。

部署过程

部署版本 1 的应用(初始的状态)
所有外部请求的流量都打到这个版本上。
技术分享图片

部署版本 2 的应用
版本 2 的代码与版本 1 不同(新功能、Bug修复等)。

将流量从版本 1 切换到版本 2。
技术分享图片

如版本 2 测试正常,就删除版本 1 正在使用的资源(例如实例),从此正式用版本 2。
小结

从过程不难发现,在部署的过程中,我们的应用始终在线。并且新版本上线的过程中,并没有修改老版本的任何内容,在部署期间,老版本的状态不受影响,这样风险很小。并且只要老版本的资源不被删除,理论上,我们可以在任何时间回滚到老版本。

蓝绿发布的注意事项

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

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

优势和不足

优势
升级切换和回退速度非常快。

不足
切换是全量的,如果 V2 版本有问题,则对用户体验有直接影响。
需要两倍机器资源。

适用场合

对用户体验有一定容忍度的场景。
机器资源有富余或者可以按需分配(AWS 云,或自建容器云)

灰度发布

定义

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

灰度发布结构图
技术分享图片

A/B Testing

A/B 测试是用来测试应用功能表现的方法,例如可用性、受欢迎程度、可见性等等。 A/B 测试通常用在应用的前端上,不过当然需要后端来支持。

A/B 测试与蓝绿部署的区别在于, A/B 测试目的在于通过科学的实验设计、采样样本代表性、流量分割与小流量测试等方式来获得具有代表性的实验结论,并确信该结论在推广到全部流量可信;蓝绿部署的目的是安全稳定地发布新版本应用,并在必要时回滚。
技术分享图片

  1. 金丝雀发布

我们平常所说的金丝雀部署也是灰度发布的一种方式,在原有版本可用的情况下,同时部署一个新版本应用作为「金丝雀」服务器来测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。

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

灰度发布/金丝雀发布由以下几个步骤组成:

准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
从负载均衡列表中移除掉「金丝雀」服务器。
升级「金丝雀」应用(排掉原有流量并进行部署)。
对应用进行自动化测试。
将「金丝雀」服务器重新添加到负载均衡列表中(连通性和健康检查)。
如果「金丝雀」在线使用测试成功,升级剩余的其他服务器(否则就回滚)。
除此之外灰度发布还可以设置路由权重,动态调整不同的权重来进行新老版本的验证。

  1. 优势和不足

优势
用户体验影响小,灰度发布过程出现问题只影响少量用户。

不足
发布自动化程度不够,发布期间可引发服务中断。

滚动发布

在金丝雀发布基础上的进一步优化改进,是一种自动化程度较高的发布方式,用户体验比较平滑,是目前成熟型技术组织所采用的主流发布方式。

  1. 定义

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

  1. 特点

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

  1. 部署过程

滚动式发布一般先发 1 台,或者一个小比例,如 2% 服务器,主要做流量验证用,类似金丝雀 (Canary) 测试。
滚动式发布需要比较复杂的发布工具和智能 LB,支持平滑的版本替换和流量拉入拉出。
每次发布时,先将老版本 V1 流量从 LB 上摘除,然后清除老版本,发新版本 V2,再将 LB 流量接入新版本。这样可以尽量保证用户体验不受影响。
一次滚动式发布一般由若干个发布批次组成,每批的数量一般是可以配置的(可以通过发布模板定义)。例如第一批 1 台(金丝雀),第二批 10%,第三批 50%,第四批 100%。每个批次之间留观察间隔,通过手工验证或监控反馈确保没有问题再发下一批次,所以总体上滚动式发布过程是比较缓慢的 (其中金丝雀的时间一般会比后续批次更长,比如金丝雀 10 分钟,后续间隔 2 分钟)。
回退是发布的逆过程,将新版本流量从 LB 上摘除,清除新版本,发老版本,再将 LB 流量接入老版本。和发布过程一样,回退过程一般也比较慢的。

  1. 优势和不足

优势
用户体验影响小,体验较平滑。

不足
发布和回退时间比较缓慢。
发布工具比较复杂,LB 需要平滑的流量摘除和拉入能力。

上述都是偏传统的发布方式,能覆盖大部分应用发布场景。针对一些关键新功能的上线发布,或者一些特定的场景,还有一些特殊的发布方式。

功能开关发布

  1. 部署过程

功能开关发布需要一个配置中心或者开关中心这样的服务支持,例如携程的 Apollo 配置中心或者开源的 FF4J,这些都支持开关发布。业界还有专门的功能开关 SaaS 服务,例如 LaunchDarkly。通过配置中心,运维或研发人员可以在运行期动态配置功能开关的值。当然,功能开关发布只是配置中心的一种使用场景,配置中心还能支持其它很多动态配置场景。
功能开关服务一般提供客户端 SDK,方便开发人员集成。在运行期,客户端 SDK 会同步最新的开关值,技术实现有推方式 (push),也有拉方式 (pull),或者推拉结合方式。
新功能(V2 new feature)和老功能(V1 old feature)住在同一套代码中,新功能隐藏在开关后面,如果开关没有打开,则走老代码逻辑,如果开关打开,则走新代码逻辑。技术实现上可以理解为一个简单的 if/else 逻辑。
应用上线后,开关先不打开,然后运维或研发人员通过开关中心打开新功能,经过流量验证新功能没有问题,则发布完成;如果有问题,则随时可以通过开关中心切回老功能逻辑。

  1. 优势和不足

优势
升级切换和回退速度非常快。
相对于复杂的发布工具,实施比较简单,成本相对低廉。
研发能够灵活定制发布逻辑,支持 DevOps 自助发布。

不足
切换是全量的,如果 V2 版本有问题,则对用户体验有直接影响。
对代码有侵入,代码逻辑会变复杂,需要定期清理老版本逻辑,维护成本变高。

其他发布下次记录
系统运维工程师 李超

详谈二叉搜索树(代码片段)

详谈二分搜索树二分搜索树的概念在了解二分搜索树之前,我们得弄清楚什么是二叉树。什么是二叉树?二分搜索树二分搜索树的创建以及实现其方法1.内部结构内部有一个结点类,作为二分搜索树的成员变量使用priv... 查看详情

bitmap优化详谈(代码片段)

目录介绍01.如何计算Bitmap占用内存1.1如何计算占用内存1.2上面方法计算内存对吗1.3一个像素占用多大内存02.Bitmap常见四种颜色格式2.1什么是bitmap2.2Android常见是那种2.3常见四种颜色格式介绍2.4Bitmap到底有几种颜色格式03.Bitmap压缩... 查看详情

c++_继承详谈(代码片段)

文章目录1.继承的概念及定义1.1继承的概念1.2代码示例1.3继承定义1.3.1定义格式1.3.2继承关系和访问限定符1.3.3继承基类成员访问方式2.基类和派生类对象赋值转换2.1代码示例3.继承中的作用域3.1代码示例4.派生类的默认成员函数4.1... 查看详情

复习(代码片段)

运维工作分类:监控运维(7*24运维值班、故障处理)安全运维(整体的安全方案、规范、漏洞检测、分析、安全防护等)sshIDS/IPS应用运维(项目上线、业务部署、版本管理、灰度发布)git/svn系统运维(架构层面的分布式缓存、分布式文... 查看详情

knife4j注解详谈(代码片段)

Controller层添加注解@Api:用于类;表示标识这个类是swagger的资源 属性名称数据类型  默认值 说明 value   String "" 字段说明  tags  String[] "" 标签说明  de 查看详情

c++内存管理--详谈(代码片段)

1、简述内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存... 查看详情

运维自动化之系统部署(代码片段)

运维自动化发展历程及技术应用安装程序CentOS系统安装系统启动流程:??bootloader-->kernel(initramfs)-->rootfs-->/sbin/initanaconda:系统安装程序??gui:图形窗口??tui:基于图形库curses的文本窗口安装程序启动过程MBR:isolinux/boot.catstage2:i... 查看详情

网络协议_udp详谈(代码片段)

文章目录1.UDP简介2.UDP特点3.UDP首部格式4.UDP伪首部5.UDP面向数据报6.UDP的缓冲区7.基于UDP的应用层协议8.UDP套接字编程1.UDP简介Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagramProtocol&#... 查看详情

运维自动化方案(代码片段)

运维自动化简写自动化运维主要包括以下几个方面:系统安装系统优化系统监控日志监控和收集应用自动化部署代码自动化部署自动化测试自动化更新自动化扩容配置文件管理系统自动化安装和优化系统的自动化安装和优化,可... 查看详情

网络协议_udp详谈(代码片段)

文章目录1.UDP简介2.UDP特点3.UDP首部格式4.UDP伪首部5.UDP面向数据报6.UDP的缓冲区7.基于UDP的应用层协议1.UDP简介Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagramProtocol)。UDP为应... 查看详情

mmap详谈(代码片段)

简述:  mmap函数将文件系统内的文件或者是Posix共享内存对象映射到调用进程的地址空间。用途:  1.对普通文件使用mmap提供内存映射I/O,以避免系统调用(read、write、lseek)带来的性能开销。同时减少了数据在内核缓冲区... 查看详情

windows运维之道——系统安装(代码片段)

在企业做运维工程师期间,安装Windows/Linux系统是非常常见的,本篇文章为大家介绍下如何使用U盘安装Windows系统(Linux类似),因为安装方法很多中,本文为大家介绍一种快速且稳定地安装Windows系统的方法。第一步,我们需准备以... 查看详情

unicodeansiutf-8gbk详谈(代码片段)

最近在写网络通信上的一些东西,快被这些编码格式搞崩溃了。 一、什么是编码  编码是对现有“符号”进行转化,可以存储在计算机中,在没有计算机时,我们的使用的“符号”,都是手写的,我们的大脑对其编码,这... 查看详情

日常运维(代码片段)

系统日志/var/log/messages系统总日志syslogs/etc/logrotate.conf日志切割配置文件logrotate参考https://my.oschina.ne00675log/9818dmesg命令把系统硬件相关日志列出来。这些日志是保存在内存中的dmesg-c清空/var/log/dmesg系统启动日志,记录启动的相关... 查看详情

详谈单例饿汉和懒汉模式(代码片段)

一、基本概念单例模式属于创建型设计模式。确保一个类只有一个实例,并提供该实例的全局访问点。实现: 使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。二、结构类图:   私有构造函... 查看详情

linux运维命令总结(代码片段)

、什么是运维?什么是游戏运维?1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络、系统、数据库、开发、安全、监控于一身的技... 查看详情

详谈数据结构与算法(代码片段)

1.为什么需要学习算法?    程序员校招社招到底该面不面算法题?该如何准备?_涤生大数据的博客-CSDN博客2.数据结构与算法的关系    很多人在开始接触编程时都会经历面向对象、数据结构,再到刷算法题&#... 查看详情

详谈数据结构与算法(代码片段)

1.为什么需要学习算法?    程序员校招社招到底该面不面算法题?该如何准备?_涤生大数据的博客-CSDN博客2.数据结构与算法的关系    很多人在开始接触编程时都会经历面向对象、数据结构,再到刷算法题&#... 查看详情