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,但是都没有得到令人满意的答案。本文抛砖引玉,如果读者想到更好的方法,欢迎一起讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/681374.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建 MFC DLL-使用DEF文件

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除 利用“MFC动态链接库”项目模板可以创建MFC DLL。DLL文件与可执行文件非常相似,不同点在于DLL包含有导出表(Export Table)。导出表包含DLL中每个导出函数的名字…

实时库存同步与并发控制:确保在线扭蛋机商品库存的实时准确性

随着电商的飞速发展,在线扭蛋机作为一种新兴的销售模式,受到了广大消费者的喜爱。然而,如何在大量用户同时购买时,确保库存信息的实时性和准确性,成为了摆在商家面前的一大挑战。本文将探讨如何设计一个高效且准确的库…

鸿蒙轻内核M核源码分析系列四 中断Hwi

在鸿蒙轻内核源码分析系列前几篇文章中,剖析了重要的数据结构。本文,我们讲述一下中断,会给读者介绍中断的概念,鸿蒙轻内核的中断模块的源代码。本文中所涉及的源码,以OpenHarmony LiteOS-M内核为例。 1、中断概念介绍…

连锁酒店水电监测管理系统

1.前言: 连锁酒店水电监测管理系统是当代酒店业中不可或缺智能化专用工具,主要是通过实时监控系统和数据分析,完成了对酒店电力能源所使用的精益化管理,减少了经营成本,提高了服务水平,并且也响应了绿色环…

centos7安装 hadoop集群

目录 准备集群搭建步骤1. 环境准备三台服务器IP关闭三台服务器的防火墙修改三台服务器的hostname文件修改三台服务器的hosts映射配置三台服务器之间的免密登录三台时间同步设置 2. hadoop安装资源划分3. 开始搭建hadoop集群192.168.83.144 即 hadoop1上的修改解压安装包添加环境…

R可视化:可发表的热图

当使用pheatmap包在R语言中实现不同组间的基因表达热图时,我们通常遵循以下步骤: 步骤 1: 加载所需的库首先,我们需要加载pheatmap包以及可能需要的其他包,如dplyr或tidyverse,用于数据预处理。 步骤 2: 准备数据我们需要一个基因表达矩阵,其中行代表基因,列代表样本,每…

非递归实现快排排序及归并排序(尾篇)

1.快速排序(双指针实现) 2.非递归实现快排 3.递归实现归并排序 4.非递归实现归并排序 5.总代码 1.快速排序(双指针实现) 俩有个指针一前一后的排放着,cur先走并且去找比kye对应值小的数组值,一旦找到后…

odoo qweb template小结

QWeb QWeb是一个基于XML的模板引擎,可用于生成HTML片段和页面。它使用XML格式来定义模板。QWeb通过在模板中添加特定的标记,来指示模板中的数据和逻辑部分。使用QWeb,你可以创建各种不同的模板,例如列表视图,表单视图和报告等。QWeb支持标准的HTML标记和控制结构,如if语…

千云物流 -openGemini生成环境使用

部署架构 安装部署 ## 创建storeclass和namespacekubectl apply -f opengemini-sc.yaml## 创建存储kubectl apply -f opengemini-stroepv.yaml #创建存储的pv&pvckubectl apply -f opengemini-metapv.yaml #创meta的pv&pvc## 创建网络服务kubectl apply -f opengemin…

jenkins应用2-freestyle-job

1.jenkins应用 1.jenkins构建的流程 1.使用git参数化构建,用标签区分版本 2.git 拉取gitlab远程仓库代码 3.maven打包项目 4.sonarqube经行代码质量检测 5.自定义制作镜像发送到远程仓库harbor 6.在远程服务器上拉取代码启动容器 这个是构建的整个过程和步骤…

StartAI:AI扩图功能,让设计更高效

在数字设计领域,图像的清晰度和细节至关重要。StartAI作为领先的AI设计工具,不断推出创新功能,以满足设计师们对高质量图像处理的需求。最新推出的扩图功能,结合了“创成式填充”技术和“PS插件”的便捷,为设计师们带来…

华为云投入巨资支持开发者,推动云服务与SaaS领域快速发展

近日,广州市迎来了一场科技界的盛会——华为云开发者日HDC.Cloud Day广州站。此次活动不仅是一场技术的盛宴,更是一个思维的碰撞和灵感的源泉,为众多开发者提供了深入学习和实践最新科技的平台。在这里,华为云展示了其在昇腾AI云服…

Verilog实战学习到RiscV - 3 : ICEStick 评估板点灯

收到 ICESTICK 评估板后还没好好玩。先来点个灯,正好把之前介绍过的工具链串起来用一下。 代码 Verilog代码只有一个顶层模块top.v,定义如下: module top(output wire D1,output wire D2,output wire D3,output wire D4,output wire D5);a…

QNX 7.0.0开发总结

1 QNX编译 1.1 基本概念 QNX可以直接使用Linux Makefile编译库和二进制,在Makefile文件中指定CCaarch64-unknown-nto-qnx7.0.0-g,或者CCx86_64-pc-nto-qnx7.0.0-g,保存退出后,运行source /qnx_sdk_path/qnxsdp-env.sh,…

LangChain框架介绍

LangChain 的核心组件 模型 I/O 封装 LLMs:大语言模型Chat Models:一般基于 LLMs,但按对话结构重新封装PromptTemple:提示词模板OutputParser:解析输出 数据连接封装 Document Loaders:各种格式文件的加载…

软件测试——白盒测试

目录 学习视频来源:1.01什么是白盒测试(Av809778070,P1)_哔哩哔哩_bilibili 1.语句覆盖 2.判定覆盖 3.条件覆盖 4.判定条件覆盖 5.条件组合覆盖 6.路径覆盖 7.基本路径覆盖 学习视频来源:1.01什么是白盒测试(Av809778070,P1)_哔哩哔哩_bilibili …

Linux C语言:控制语句(if switch)

一、控制语句(if) 1、if-单分支 一个if语句由一个布尔表达式后跟一个或多个语句组成。 语法: if (boolean_expression) { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行。 如…

小猪APP分发:让APP封装变得如此简单

你是否曾经在开发完一款APP后,为了封装、分发而头疼不已?别担心,小猪APP分发来拯救你了!这款神器不仅能让你的工作变得更加高效,还能让你的APP在各大平台上顺利分发。 小猪APP封装www.ppzhu.net APP封装的挑战 开发一…

数据误删?别怕!COS防误删和误删恢复攻略请查收

在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来,腾讯云对象存储服务(COS)一直致力于数据安全的探索和实践,以保障数据的安全性和完整性。对象存储COS准备了一份“防误删”和“误删恢复”攻略给大…

【遂愿赠书 - 2期】:618火热来袭,网络安全书单推荐

文章目录 一、网络安全书单背景二、网络安全与编程实践书单2.1 🏰《内网渗透实战攻略》2.2 🛡️《Kali Linux高级渗透测试(原书第4版)》2.3 🎖️《CTF那些事儿》2.4 🚀《权限提升技术:攻防实战与…