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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件IOoooo

1.1 文件路径 文件路径分为两种: 1、绝对路径:以C:、D:等盘符开头的,就是我们所说的绝对路径,根据它可以直接找到文件的具体位置。 2、相对路径:需要先指定一个目录作为基准目录,从基准目录出发&#xf…

SpringSecurity入门(四)

18、权限管理/授权 18.1、针对url配置 配置SecurityConfig package com.wanqi.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.bu…

(免费领源码)基于 node.js#vue#mysql的网上游戏商城35112-计算机毕业设计项目选题推荐

摘 要 本论文主要论述了如何使用node.js语言开发一个基于vue的网上游戏商城,本系统将严格按照软件开发流程进行各个阶段的工作,本系统采用的数据库是Mysql,使用node.js的koa技术技术构建的一个管理系统,实现了本系统的全部功能。在…

云计算-期末复习题-选择/判断/填空/简答(1)

目录 填空题/简答题 单选题 多选题 判断题 云计算期末复习部分练习题,下一章会补全。祝大家好好复习,顺利通过课程。 填空题/简答题 >保障云基本安全的对策包括()、()和() &…

Linux:桌面系统中的文件后缀和类型

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的文件后缀与Windows系统有些不同,因为其似乎没有很重要,一个文件是否可执行对后缀没有要求。但是,后缀依然可以用于表示文件…

机器学习笔记:label smoothing

在传统的分类任务中,我们通常使用硬标签(hard labels) 即如果一个样本属于某个类别,其对应的标签就是一个全0的向量,除了表示这个类别的位置为1。例如,在一个3类分类任务中,某个样本的标签可能是…

实用软件分享---简单菜谱 0.3版本 几千种美食(安卓)

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

【Python】 装饰器,可不只是装饰作用!

Python 是一种高级编程语言,以其清晰的语法和代码可读性而著称。在 Python 中,“at” 符号()通常被称为装饰器(Decorator)的语法符号。装饰器是一种设计模式,用于修改或增强函数、方法或类的行为…

Spring Cloud Gateway详解

一、前言Spring Cloud Gateway的作用 路由转发: Spring Cloud Gateway作为微服务架构中的网关服务,充当所有请求的入口。它可以根据请求的路径、Host、Header、请求参数等多种条件进行路由,将请求转发到相应的微服务实例。路由信息由ID、目的…

2024蓝桥杯初赛决赛pwn题全解

蓝桥杯初赛决赛pwn题解 初赛第一题第二题 决赛getting_startedbabyheap 初赛 第一题 有system函数,并且能在bss上读入字符 而且存在栈溢出,只要过掉check函数即可 check函数中,主要是对system常规获取权限的参数,进行了过滤&…

git版本控制工具常用命令

一、本地仓库管理 push 向远程推送代码 pulll 拉取代码 二、远程仓库管理 三、分支操作 本地主分支master 远程主分支main head指向当前分支 查看:git branch 创建分支: git branch 名字 切换分支:git checkout 名字 合并分支:git…

VS2019创建c++动态链接库dll与调用方法

VS2019创建c动态链接库dll与调用方法 1.点击文件-》新建-》项目,输入dll,选择具有导出项的(DLL)动态链接库 2.输入一个文件名:dll2 头文件.h 3.添加加减法函数: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的…

爱普生SMD3225贴片晶振升级版TSX-3225

爱普生有一款外形尺寸3.2*2.5mm的无源贴片晶振,型号TSX-3225,也是非常直观的能从型号分辨其封装尺寸大小的,被广泛应用于便携式的无线传输设备,同时,这也是一款非常成熟的产品,毕竟SMD3225封装是目前市场主…

部署LVS-DR模式(附带详细实验)

目录 一.数据包流向分析 二.DR模式特点 三.ARP问题及解决办法 四.实验部署 1.配置负载调度器(192.168.80.105) 1.1.安装并启用ipvsadm 1.2.配置虚拟IP地址(VIP:192.168.80.100) 1.3.调整 proc 响应参数 1.4.配…

springboot 在线心理咨询管理系统-计算机毕业设计源码82552

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设在线心理咨询管理系统…

Elasticsearch index 设置 false,为什么还可以被检索到?

在 Elasticsearch 中,mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问,为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题,并引入列式存储的概念,帮助大家更好地理解 Elasticsearch 的存储和查…

IO模型和多路转接

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出! 文章目录 1.IO 概要1.1.IO 低效原因1.2.IO 常见模型1.2.1.阻塞 IO1.2.2.非阻…

shell脚本简单命令

shell脚本 脚本就是可运行代码的集合,脚本语言(计算机语言)脚本的特点:从上到下,按行执行。 python 脚本语言 格式更严谨 严格的执行锁进。也是从上到下按行执行。 shell脚本就是在shell环境(/bin/bash&…

Word忘记保存?请使用Word隐藏备份文件

大家用Word写材料时,如果忘记保存,可以使用Word隐藏备份文件找回未保存的文件。(仅供参考) Windows7、8、10、11系统的设置如下: 执行上述操作,可以在word文件菜单中信息项的自动保存中找到了。上述内容…

Qt for Android 申请摄像头权限

步骤 1. 添加用户权限 方式1: AndroidManifest.xml 中新增&#xff08;不添加后面申请选项时不弹窗&#xff09; 或者再Qt Creator中直接添加 方式2: .pro 中引用multimedia 模块&#xff0c;编译时配置自动添加 <uses-permission android:name"android.permissi…