企业常用的几种发布方式(蓝绿发布 | 滚动升级 | 金丝雀发布)
时间:2022-07-22
本文章向大家介绍企业常用的几种发布方式(蓝绿发布 | 滚动升级 | 金丝雀发布),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
部署是将服务的某个版本投入生产环境的过程。部署的总体目标是:对系统用户产生最小影响的情况下,把服务的升级版本投放到生产环境中。
服务变更的主要原因
- 1、修复错误
- 2、提高服务的质量
- 3、增加新的功能
服务变更需要注意哪些(或者说如何产生最小影响)?
SRE 经验告诉我们,大概 70% 的生产事故由某种部署的变更而触发。变更管理的最佳实践可使用自动化来完成以下几点:
- 1、部署尽可能在用户少的时候。
- 2、每次部署前备份原始数据。
- 3、采用渐进式发布机制。
- 4、迅速而准确地检测到问题的发生。
- 5、当出现问题时,安全迅速地回退改动。
常用部署方式存在以下几种:
- 蓝绿部署
- 滚动部署
- 灰度部署/金丝雀部署
蓝绿部署
正常将项目分为两组, 蓝组和绿组, 正常运转的情况下每组承载 50%
的流量. 当准备发布服务时, 将蓝组流量设置为0%, 将绿组空闲出来, 将服务部署到绿组的机器, 然后利用SLB
将流量切换到绿组的机器, 让绿组来运行业务, 没问题的话流量全部导向绿组, 把蓝组也进行服务更新
优点
- 更新过程无需停机,风险较少
- 回滚方便,只需要更改路由或者切换DNS服务器,效率较高
缺点
- 需要部署两套机器,费用开销大
- 在非隔离的机器(Docker、VM)上操作时,可能会导致蓝绿环境被摧毁风险
- 负载均衡器/反向代理/路由/DNS处理不当,将导致流量没有切换过来情况出现
滚动部署
生产中的N台机器都为版本A的机器, 部署取出一个或者多个服务器停止服务,执行更新版本B,更新后重新将其投入使用,继续不断更新其他机器,直到集群中所有的实例都更新成版本B。这个其实就是K8S里面的更新策略
流程
- 1、负载均衡或者路由移除一台或者多台实例(正常监控也需要移除)
- 2、移除后的实例开始更新
- 3、上线测试后无异常开始接入负载均衡器或者路由
- 4、新增实例监控
- 5、继续上线后一批实例,直到集群中所有的实例都更新
优点
- 更新过程体验影响少,风险较少
- 费用对比蓝绿花费开销较少,无需额外新增机器
缺点
- 上线/回滚完成时间相对较慢
- 需要监控和负载均衡器的移除和接入能力
金丝雀部署(灰度发布)
以前旷工开矿下矿洞前,先会放一只金丝雀进去探是否有有毒气体,看金丝雀能否活下来,金丝雀发布由此得名。
金丝雀发布一般先发布一台, 或者小比例, 例如2%的服务器进行流量验证,国内也称为金丝雀测试, 流量测试通过, 慢慢将剩余机器也进行发布, 可以达到一个平滑过渡效果.
灰度发布可以保证整体系统的稳定性, 在初始灰度的时候就可以发现 调整以保证其影响度
流程
- 首先部署少量服务器密切
- 观察是否因为版本产生预期结果
- 当结果满意时候再全量部署
优点
- 用户体验影响小,金丝雀发布过程出现问题只影响少量用户
缺点
- 发布自动化程度不够,发布期间可引发服务中断
- MySQL 死锁与日志二三事
- 一千个不用 Null 的理由
- TensorFlow强化学习入门(1.5)——上下文赌博机
- 以太坊·代币开发详解
- JSON Web Token - 在Web应用间安全地传递信息
- TensorFlow强化学习入门(2)——基于策略的Agents
- 用ABAP 生成二维码 QR Code
- CDS view注解解析 - @Environment.systemField
- Document flow API in SAP CRM and C4C
- Python基础知识4:文件操作
- Python基础知识6:格式化字符、颜色
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- 【开源】QuickPager ASP.NET2.0分页控件 v2.0.0.2版本。
- 【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法