当前位置: 首页 > news >正文

Master-Worker 架构的灰度发布难题

作者:石超

Master-Worker 架构的灰度发布难题

一、前言

Master-Worker 架构是成熟的分布式系统设计模式,具有集中控制、资源利用率高、容错简单等优点。我们数据中心内的几乎所有分布式系统都采用了这样的架构。



我们曾经发生过级联故障,造成了整个集群范围的服务中断。这让我们反思到 Master-Worker 架构难以有效的分批灰度发布的问题。本文试图分析其中原因,并尝试提出几种解决方案。

二、Master-Worker 架构

Master-Worker 架构有时也被称为 Master-Server 架构 或 Master-Slave 架构。



在实践中,为了避免 Master 成为单点故障,Master 通常由多个节点用 Raft 组成的服务,以一主多从的形式出现。有时在一个 Raft 服务中,我们也用 Master 和 Slave 述语指代主和从节点。为了避免混淆,这里我们称为 Master 的“主节点”和“从节点”,主从节点统称为“一组 Master 节点”。



据系统的规模的不同,Master 节点通常能够管理数台至数万台 Worker 节点。



下面介绍几种常见的 Master-Worker 架构。第一种是经典的分布式系统架构,后两种是常见变种。其实它们都披着外衣而本质相的架构。

2.1 经典架构

根在有些系统中,用户总是需要访问 Master 才能得到服务。若 Master 故障,则整个集群服务中断。需要指出的是,这里说的故障不一定是程序崩溃,还包括性能下降、死锁等其他形式的功能失效。Raft 的高可用机制能很好处理如宕机、程序崩溃等明确的问题,却难以处理这些“半死不活”的问题。我们曾经遇到过部分线程失效而心跳线程仍然好好的活着的问题。墨菲定律说,只要可能发生的事,最终都会发生。在我们这样云计算数据中心规模和长时间的部署中,各种稀奇古怪的问题都会被撞见。

2.2 数据面和控制面分离

在数据面和控制面分离的设计中,用户直接和数据面的节点交互。有中心化部署的管控节点,负责负载均衡、宕机恢复、限流等集中工作。用户的请求路径不经过中心管控节点。中心管控节点和数据面节点构成 Master-Worker 架构。尽管数据面划分了多个集群,但中心管控同时连接了多个集群的数据面,同样有级联故障隐患。设想这样的场景:中心管控升级后,发送了新格式请求到数据节点。后者无法正确处理新格式的请求,产生 coredump。

2.3 有网络功能的基础组件库

程序倚赖的公共基础组件,如安全、运维、监控等,很多以 SDK 库的形式嵌入在服务进程中。SDK 作为客户端和公共组件服务的服务端通讯,或上报信息,或拉取配置。这样,SDK 和服务端也构建经典的 Master-Worker 架构。这些 SDK 尽管是旁路系统,但仍然有机会“兴风作浪”,像上面“数据面和控制面分离”一节那样引发数据节点的级联故障。公共服务通常被众多服务使用,一旦发生这样的问题,影响面积将更大。

三、灰度发布的难题

灰度发布是防范故障的最重要手段。典型的灰度发布是这样工作的:在一个集群中,依次升级每个节点,同时观察整个服务有单机异常或整体服务受损。一旦观测到服务受损,则立即中止发布。由于分布式系统自身具有自动恢复(failover)能力,除非是如 coredump 之类的明显问题,从服务整体角度观测需要一定时间。

3.1 分片架构

在普通服务中,这样的灰度发布机制能很好工作。考虑一个由多个节点组成的服务,分批发布,每批一个节点。每批之间观察请求成功率,若跌破阈值则中止发布。现在我们发布一个带 bug 的新版本。在完成第二批发布后,我们观察到系统请求成功率下跌超过阈值,因此中止发布。



这个模型比较简单,但足够说明问题。在实际中,自动恢复机制能掩盖错误。例如,网关服务能够将失败的请求发送至另外的节点重试。但我们仍然能通过蛛丝马迹发现故障。在前述例子中,我们能够通过网关重试率指标来识别到问题。

3.2 Master-Worker 架构

然而在 Master-Worker 架构中,灰度发布机制却不是总是有效。让我们看看在这样的系统中如何进行灰度发布,并分析它无效的原因。



假如现在有 A、B、C 三个 master 节点,其中 B 是主节点。灰度发布步骤如下:

1.升级 A 到新版本。

2.升级 C 到新版本。

3.主从切换,由新升级的 A 作为主节点。

4.升级 B 到新版本。



在执行每步时,我们同样要观察现有服务是否受损。一旦服务受损就立即中止发布。用这样的方法,看似做了灰度,其实第三步主从切换的有很大的风险。考虑假想的极端情况:A 的新版本增加了新的功能,在 A->Worker 心跳等广播类报文中增加新的请求字段。而 Worker 恰好无法处理这个新增字段,导致了死锁或程序崩溃。这样就会导致整个集群内大范围的服务中断。



灰度发布机制对防范此类问题无能为力。Master 的主节点的新代码,只有在第三步主从节换后才能运行起来。一旦新代码被运行起来,在 Master 这样重要的节点,对整个集群可能产生重大影响。这些影响是 0 或 1 的影响,而不是渐近式的影响。因此,在这样的架构无法有效实现灰度发布。

四、解决方案

解法一:Master 分片

在经典的 Master-Worker 架构中,Master 主节点是单体式的。我们可以将它的功能拆分成到多个分片,让每个分片能够单独地升级。这样,整个系统的发布变成渐近式的,给我们创造出了观察窗口。



这种方法能够防止 Master 服务自身出现重大故障。但如果 Master 和 Worker 仍然是高度互联的,无法避免故障沿网络传播至 Worker 所有节点,最终造成服务中断。此外,Master 承担的某些功能天然是集中式的,也就无法用这个方法拆分成多个分片。

解法二:分批推送

另一个思路是切断故障的快速传播途径。级联故障之所以发生,是因为 master 在升级到新版本后立即运行了新的代码路径,发送了新的 RPC 给 worker 节点,从而造成 worker 节点运行到了未经测试的代码路径。这个过程是立时发生,没有分批灰度的。我们可以在这里也引入分批灰度的机制。



这个方案也有短板。在复杂系统中 Master->Server 交互众多,很难针对每个交互都增加这样分批灰度的限制。实际中,分批机制一般只能覆盖到几个重点功能。

解法三:小而稳的 SDK 库

最后一个解法是为公共服务 SDK 库量身定制的。DNS 是最简单的带有网络功能的 SDK 库,它却很少出问题。究其原因,是因为它的功能足够简单。借鉴这个思路,我们可以把 SDK 库做得简单,控制代码量在一千行以内,经过充分测试,能做到近乎 bug-free。

据我所知,能做到这个标准最复杂的库是 sqlite,它有 15 万行代码,但分支覆盖率达到了恐怖的 100%。考虑到我们实际的工程水平,一千行代码是我们能做到的极限。如果 SDK 的功能复杂,无法精减,那么可以将部分逻辑拆分到本机部署的 agent。而 agent 总是比 SDK 更容易做分批灰度发布。

五、结语

防范集群范围的级联故联是分布式系统中的难题。本文提出了三种方法,但它们都有各自的局限。在写作本文时,我找了很多同事讨论,也在互联网上搜索,以及问 ChatGPT,但是都没有得到令人满意的答案。本文抛砖引玉,如果读者想到更好的方法,欢迎一起讨论。

相关文章:

Master-Worker 架构的灰度发布难题

作者:石超 一、前言 Master-Worker 架构是成熟的分布式系统设计模式,具有集中控制、资源利用率高、容错简单等优点。我们数据中心内的几乎所有分布式系统都采用了这样的架构。  我们曾经发生过级联故障,造成了整个集群范围的服…...

钢基础知识介绍

钢铁是一种铁碳合金,含有一定量的碳和其他合金元素,如硅、锰等。而钢材则是经过加工处理后的钢铁材料,具有更高的强度、硬度、塑性和韧性。钢铁的硬度、强度和耐磨性相对较低,而钢材经过加工处理后,其硬度、强度和耐磨…...

linux 系统监控脚本

1.对CPU的监控函数 function GetCpu(){cpu_numgrep -c "model name" /proc/cpuinfocpu_usertop -b -n 1 | grep Cpu | awk {print $2} | cut -f 1 -d "%"cpu_systemtop -b -n 1 | grep Cpu | awk {print $4} | cut -f 1 -d "%"cpu_idletop -b -…...

K8s Pod的QoS类

文章目录 OverviewPod的QoS分类Guaranteed1.如何将 Pod 设置为保证Guaranteed2. Kubernetes 调度器如何管理Guaranteed类的Pod Burstable1. 如何将 Pod 设置为Burstable2.b. Kubernetes 调度程序如何管理 Burstable Pod BestEffort1. 如何将 Pod 设置为 BestEffort2. Kubernete…...

TCP/IP协议栈

一、TCP/IP协议栈和OSI参考模型对比 二、TCP/IP五层功能 三、TCP/IP模型的层间通信与数据封装 四、TCP/IP模型的层间通信与数据解封装...

Vector容器详解

Vector容器详解 本文将详细介绍C#中的Vector容器,包括其定义、特点、使用方法以及示例代码。 目录 Vector容器简介Vector容器的特点Vector容器的使用方法示例代码 1. Vector容器简介 Vector容器是一种动态数组,它可以自动调整大小以容纳更多的元素。…...

设计模式-抽象工厂(创建型)

创建型-抽象工厂 角色 抽象工厂: 声明创建一个族产品对象的方法,每个方法对应一中产品,抽象工厂可以是接口,也可以是抽象类;具体工厂: 实现抽象工厂接口,复杂创建具体的一族产品;抽…...

攻防世界---web---Web_php_unserialize

1、题目描述 2、 3、分析代码 class Demo { private $file fl4g.php; }:定义了一个名为Demo的类,该类有一个私有属性$file,默认值为fl4g.php。 $a serialize(new Demo);:创建了一个Demo类的实例,并对其进行序列化&a…...

嵌入式学习记录

一 环境搭建 1.Ubuntu ssh登陆开发板,短命令替换ssh命令 交叉编译命令 sudo gedit ~/.bashrc # 文件结尾加入: alias tob"ssh root192.168.1.104" alias gb"arm-buildroot-linux-gnueabihf-gcc"往后终端输入top 相当于输入ssh roo…...

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名…...

idea mac快捷键

Mac快捷键 快捷键 说明 ⌘ F 在当前窗口查找 ⌘ ⇧ F 在全工程查找 ⌘ ⇧ ⌥ N 查找类中的方法或变量 F3 / ⇧ F3 移动到搜索结果的下/上一匹配处 ⌘ R 在当前窗口替换 ⌘ ⇧ R 在全工程替换 ⌘ ⇧ V 可以将最近使用的剪贴板内容选择插入到文本 ⌥…...

Day1——一些感想,学习计划和自我激励(不重要,跳过吧)

笨人刚刚接触计算机的时候,属于是两眼一抹黑。高考后玩了一整个暑假,脑子已经丢掉了,学起来很痛苦,但是也在学习过程中接触到了很多新鲜的东西,现在对于计算机的各种方向,我都很想试试(试试就逝…...

网络安全渗透工具汇总

一、HackBar github地址:https://github.com/Mr-xn/hackbar2.1.3.git 介绍 HackBar是一款基于浏览器的渗透测试工具,可以简化目标网站的攻击流程。它可以轻松地注入JavaScript和其他脚本,进行SQL注入、XSS攻击、各种类型的扫描等。该工具…...

JavaScript 学习笔记 总结

回顾: Web页面标准 页面结构:HTML4、HTML5页面外观和布局:CSS页面行为:JavaScript强调三者的分离前后端分离开发模式 响应式设计Bootstrap框架入门 Bootstrap总结 基础 下载和使用基础样式:文本样式、图片样式、表格…...

分布式架构与分布式理论

文章目录 分布式架构什么是分布式系统分布式系统特性分布式系统面临的问题 分布式理论数据一致性CAP理论BASE理论 分布式架构 什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 所谓分…...

Qt——前言

一、Qt介绍 ​ **Qt技术特指用来桌面应用开发;**客户端开发的重要任务就是编写和用户交互的界面;而与用户交互的界面有两种典型风格,1.命令行界面/终端界面,TUI;2.图形化界面,GUI; ​ Qt就是用…...

RN:Error: /xxx/android/gradlew exited with non-zero code: 1

问题 执行 yarn android 报错: 解决 这个大概率是缓存问题,我说一下我的解决思路 1、yarn doctor 2、根据黄色字体提示,说我包版本不对(但是这个是警告应该没事,但是我还是装了) npx expo install --…...

今日科普:了解、预防、控制高血压

高血压,常被称为“隐形的健康威胁”,许多患者可能在毫无预警的情况下发病,且患病率逐年攀升,同时患者群体逐渐年轻化,高血压虽然难以根治,但并不可怕,真正可怕的是血压长期居高不下,…...

Spark关于 ExpressionEncoder[T] 以及 RowEncoder 以及Spark怎么做外部数据和内部数据的转换

背景 本文基于 Spark 3.3, 最近在用 Spark Api 做 DataSet[Row] 转换的时候遇到了一些 Spark内部转换的问题, 在此记录一下。 杂谈 我们知道在Spark中分为 InternalRow和Row, 前者是 Spark 内部的使用的一行数据的表示,后者是给Spark开发者使用的行数…...

D-Day 上海站回顾丨以科技赋能量化机构业务

5月31日下午,DolphinDB 携手光大证券,在上海成功举办 D-Day 行业交流会。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场,深入交流量化投研交易过程中的经验、挑战及解决方案。 DolphinDB 赋能机构业务平台 来自光…...

业财一体化的重点、难点和模式

业财一体化的内涵是企业将经营活动、财务管理、经营决策等进行科学的融合和管理,进而提高企业经营管理和财务决策的科学性,同时,基于IT技术、流程再造和组织重构更好的保障企业价值创造功能的实现。其涵盖管理循环、业务循环、信息循环三个双…...

gorse修改开源项目后,如何使用Docker compose发布

代码修改 git checkout v0.4.15 修改代码后提交。 镜像构建 export GOOSlinux export GOARCHamd64 export GOMAXPROCS8go build -ldflags"-s -w -X github.com/zhenghaoz/gorse/cmd/version.Version$(git describe --tags $(git rev-parse HEAD)) -X github.com/zhengh…...

Bowyer-Watson算法

数学原理及算法过程 Delaunay 三角剖分是一种特殊的三角剖分方法,它满足以下两个重要性质: 最大化最小角性质:Delaunay 三角剖分通过避免细长的三角形来最大化所有三角形的最小角。空外接圆性质:在 Delaunay 三角剖分中&#xf…...

计算机基础之:fork进程与COW机制

在Unix-like操作系统中,fork()是一个系统调用,用于创建一个与调用进程(父进程)几乎完全相同的新进程(子进程),包括父进程的内存空间、环境变量、文件描述符等。这个过程是通过写时复制&#xff…...

47.各种类型的线程池

线程池继承体系 Executor(interface)->ExecutorService(interface)->ThreadPoolExecutor(class) Executors.newFixedThreadPool 核心线程数最大线程数(没有救急线程被创建),所以也无需超时时间阻塞队列LinkedBlockingQueue,可以放任意…...

多目标优化-NSGA-II

文章目录 一、前置知识NSGA-II帕累托前沿 二、算法流程1.NSGA2.NSGA-II 一、前置知识 1.NSGA(非支配排序遗传算法):旨在同时优化多个冲突的目标函数,寻找帕累托前沿上的解集。 什么是多个冲突的目标: 比如你看上了一辆车,你既想要它便宜,又…...

元宇宙数字藏品交易所,未来发展的大趋势

随着科技的飞速进步,元宇宙以其独特的魅力为数字世界绘制了一幅前所未有的宏伟蓝图。在这一宏大的背景下,数字藏品交易所作为连接虚拟与现实的桥梁,正以其卓越的优势,引领着数字藏品市场迈向新的高度。 首先,元宇宙为…...

通配符https数字证书260

随着越来越多的人开始使用互联网,互联网上的信息变得繁杂,用户很难识别网站信息的真实性,为了维护互联网的环境,开发者开始使用https证书对网站传输数据进行加密和身份认证,以此来保护用户的隐私以及标示网站的真实性。…...

C++ | Leetcode C++题解之第133题克隆图

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* cloneGraph(Node* node) {if (node nullptr) {return node;}unordered_map<Node*, Node*> visited;// 将题目给定的节点添加到队列queue<Node*> Q;Q.push(node);// 克隆第一个节点并存储到哈希…...

yangwebrtc x86_64环境搭建

版本&#xff1a;5.0.099 sudo apt-get install libxext-dev sudo apt-get install x11proto-xext-dev sudo apt-get install libxi-dev sudo apt install libasound2-dev sudo apt install libgl1-mesa-dev sudo apt-get install libxtst-dev 用qt打开以下两个项目的.pro met…...

做的好的网站/神秘网站

题目&#xff1a;How many zeros and how many digits ? 思路&#xff1a;求0的&#xff0c;我们先把base分解质因式&#xff0c;然后求num对base各质因式非0的幂的倍数&#xff0c;取最小值。 求位数的&#xff0c;只求取log10,注意一下精度问题 #include <cstdio> #in…...

网页传奇游戏 垃圾/南京seo外包

一、UART UART是一个大家族&#xff0c;其包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。 嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。常用的就三根引线&#xff1a;发送线TX、接收线RX、电平…...

家庭电脑做网站/十大it教育培训机构排名

转自 http://blog.csdn.net/wangji163163/archive/2009/07/02/4315358.aspx 最近有很多朋友问我&#xff0c;VC操纵Word的方法。需要的朋友请往下看。 我们操纵Word需要通过类型库中的MFC类。而这些类&#xff0c;应该都是基于一个叫COleDispatchDriver的类。至少我所了解到的都…...

flash做导航网站/bt蚂蚁磁力

今天是清明集训第一天转载于:https://www.cnblogs.com/2017bisheng/p/4392615.html...

国外好的室内设计网站/免费网络推广网址

精简面板(Search Refiners)是SharePoint 2010搜索的一大提升&#xff0c;帮助用户通过关键字或属性快速精简搜索结果。如果还是不清楚什么是精简面板&#xff0c;请看下图。这是输入关键词“SharePoint”后Google和SharePoint 开箱即用的搜索精简面板显示&#xff08;SharePoin…...

徐州制作公司网站/哪个平台可以免费打广告

摘要 面向方面的编程(AOP)是一种新的编程技术&#xff0c;它弥补了面向对象的编程(OOP)在跨越模块行为上的不足。AOP引进了Aspect&#xff0c;它将影响多个类的行为封装到一个可重用模块中&#xff0c;它允许程序员对横切关注点进行模块化&#xff0c;从而消除了OOP引起的代码混…...