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

[大厂实践] 无停机迁移大规模关键流量(下)

在系统升级、迁移的过程中,如何验证系统逻辑、性能正确无误,是一个很大的挑战。这一系列介绍了Netflix通过重放流量测试解决这一挑战的实践。原文: Migrating Critical Traffic At Scale with No Downtime — Part 2

想象一下,你被心爱的Netflix电视剧的最新一集迷住了,享受着不间断的高清流媒体体验。在这些完美的娱乐时刻背后是一个复杂的机制,依赖许多咬合紧密的齿轮和谐工作。但当这台机器需要改造时,会发生什么呢?这就是大规模系统迁移发挥作用的地方。之前的文章介绍了重放流量测试,这是我们工具包中的关键工具,让我们以精确、可靠的方式实现迁移。

重放流量测试为我们提供了可验证的基础,但是随着迁移过程的展开,需要仔细控制迁移流程。该流程不仅需要将风险最小化,而且还需要能够促进对迁移影响的持续评估。这篇文章将深入研究Netflix利用的技术是如何将变化引入到生产中的。

金丝雀组(Sticky Canaries)

金丝雀[1]部署是一种以受控和有限的方式验证对后端生产服务更改的有效机制,可以降低由于更改而出现的不可预见后果的风险。此过程包括为更新后的服务创建两个新集群,基线集群是生产环境中运行的当前版本,金丝雀集群是服务的新版本。一小部分生产流量被重定向到这两个新集群,从而允许我们监控新版本性能,并将其与当前版本进行比较。通过收集和分析一段时间内服务的关键性能指标,可以评估新更改的影响,并确定是否满足可用性、延迟和性能需求。

某些产品功能需要通过客户设备和一组后端服务之间的请求生命周期来驱动。例如,Netflix的视频播放功能包括从一个服务请求流的URL、调用CDN下载流数据、从一个单独的服务获取解密流的许可,以及向另一个服务发送指示播放成功开始的遥测信息。如果只在被更新的服务上跟踪度量,可能无法识别更广泛的端到端系统功能中的偏差。

金丝雀组(Sticky Canary)[2]是对传统金丝雀流程的改进,从而解决这个问题。在这种变体中,金丝雀框架创建唯一的客户设备池,在实验期间将此池的流量一致路由到金丝雀和基线集群。除了测量服务级别指标,金丝雀框架还能跟踪整个金丝雀池中更广泛的系统操作和客户指标,从而检测整个请求生命周期流的回归数据。

Sticky Canary
Sticky Canary

需要注意的是,对于金丝雀组,池中的设备在整个实验过程中被持续路由到金丝雀,这可能导致在客户设备上重试时持续存在错误行为。因此,金丝雀框架被设计为监控操作和客户KPI指标,以检测持续产生的偏差,并在必要时终止金丝雀实验。

金丝雀和金丝雀组是系统迁移过程中有价值的工具。与重放测试相比,金丝雀将验证范围扩展到服务级别之外,能够在该功能的请求生命周期中验证更广泛的端到端系统功能,使我们确信迁移不会对客户体验造成任何影响。金丝雀还提供了在不同负载条件下测量系统性能的机会,使我们能够识别和解决任何性能瓶颈,并帮助我们进一步微调和配置系统,确保能够顺利无缝集成新的更改。

A/B测试

A/B测试是一种被广泛认可的通过受控实验验证假设的方法。其做法是将一部分用户分成两个或两个以上的组,每个组采用不同方法,然后通过特定度量来评估结果,以确定假设是否有效。业内经常使用该技术来评估与产品演变和用户交互相关的假设,也被Netflix广泛用于测试产品行为和客户体验的变化[3]

A/B测试对于评估后端系统的重大更改也很有价值。我们可以在设备端或后端代码中确定A/B测试范围,并有选择的调用新的代码路径和服务。在迁移上下文中,A/B测试让我们能够只为较小比例的用户启用新路径,从而限制暴露迁移系统,达到控制新变更引起意外风险的目的。对于涉及到设备契约变更的架构更新来说,A/B测试也是一项关键的迁移技术。

金丝雀实验通常在几小时到几天的范围内进行。然而在某些情况下,迁移相关的实验可能需要跨越数周或数月,以获得对特定体验质量(QoE,Quality of Experience)影响的更准确理解。此外,对特定业务关键性能指标(KPI,Key Performance Indicator)的深入分析可能需要更长时间的实验。例如,设想一个旨在提高播放质量的迁移场景,期望改进能够吸引更多客户点击播放按钮。基于相当大的样本量评估相关指标,是对假设获取可靠、自信评估至关重要的步骤。A/B框架建立信任过程的有效工具。

除了更长持续时间,A/B测试框架还提供了其他附属功能。比如支持基于地理、设备平台和设备版本等维度的测试分配控制,同时还允许跨维度分析迁移度量,从而确保更改不会对特定客户群产生不成比例的影响。A/B测试还提供了适应性,允许实验过程中调整分配比例。

我们不会对每个后端迁移都用A/B测试。相反,我们将其用于预期更改会显著影响设备QoE或业务KPI的迁移场景。例如前面提到过的,如果变更预期会改善客户QoE指标,我们就用A/B测试来验证假设。

流量分发(Dialing Traffic)

在完成验证的各个阶段(如重放测试、金丝雀组和A/B测试)之后,我们可以自信断言,预期更改不会显著影响SLA(服务级别协议,service-level-agreement)、设备级别QoE或业务KPI。然而,必须确保最终推出的变更不会被未注意到的意外的问题破坏客户体验。为此,我们实现了流量分发,作为降低在生产中启用更改相关的风险的最后一步。

分发器是一种软件架构,用以控制系统内的流量。通过分布函数对入站请求进行采样,并确定应该路由到新路径还是保留在现有路径上。决策过程包括评估分布函数的输出是否在预定义的目标百分比范围内,抽样基于与请求相关联的固定参数一致的完成。目标百分比通过全局范围的动态属性来控制,可以实时更新。

分发器
分发器

实际采样参数的选择取决于具体迁移要求。分发器通过选择一个变量参数(如时间戳或随机数),对所有请求进行随机抽样。或者,在系统路径相对于客户设备必须保持恒定的场景中,基于某个恒定的设备属性(如deviceId)作为采样参数。分发器可以在多个位置实现,例如设备应用代码、相关服务器组件,甚至是边缘API网关,这是管理复杂系统迁移的通用工具。

流量基于离散抽样比例分发到新系统。在每一步中,相关方都会得到通知,并监控关键指标,包括服务、设备、运营和业务指标。如果在迁移过程中发现意外问题或注意到指标朝着不希望的方向发展,分发器使我们能够快速将流量回滚到旧路径并解决问题。

如果涉及到多数据中心流量,还可以在数据中心级别限定分发范围。我们可以从单个数据中心的流量分发开始,以便更容易的跨数据中心比较关键指标,从而更容易观察到指标中的任何偏差。离散抽样的持续时间也可以调整,长时间运行分发步骤增加了暴露问题的可能性,这些问题可能只影响一小部分成员或设备,由于影响面太小而很难被捕获或者执行影子流量分析。我们可以通过逐步分发和监控的组合来完成将所有生产流量迁移到新系统的最后一步。

迁移持久化存储

有状态API的迁移具有特殊挑战,需要不同的策略。虽然可以用本系列前一部分中讨论的重放测试技术,但其他措施也是有必要的。

这种替代迁移策略已被证明对满足某些标准的系统是有效的。具体来说,我们的数据模型是简单、自包含、不可变的,互相之间没有耦合,因此不需要严格的一致性保证,也不使用数据库事务。我们采用基于ETL的双写策略,大致遵循以下步骤:

  • 通过ETL进程完成初始加载: 从源数据存储中提取数据,转换为新模型,并通过脱机作业将数据写入新数据存储,基于自定义查询来验证迁移记录的完整性。
  • 通过双写进行持续迁移: 通过双活/双写策略来迁移大量数据。作为一种安全机制,我们使用分发器(前面讨论过)来控制写入新数据存储的比例。为了在两个存储中保持状态均等,我们将实体的所有状态更改请求都写到两个存储中,实现方式是通过选择与实体生命周期保持一致的采样参数来实现。随着对系统的信心不断增强,同时仔细监控系统的整体健康状况,我们会逐步加大对新系统的使用。分发器还充当开关,在必要时关闭对新数据存储的所有写操作。
  • 持续验证: 当读取一条记录时,服务从两个数据存储中读取,如果在两个存储中都找到新记录,则验证新记录的功能正确性。可以根据特定用例的延迟需求选择是在请求路径上还是离线执行比较。在实时比较的情况下,当记录匹配时,可以返回新数据存储中的记录。这个过程让我们对迁移的功能正确性建立信心。
  • 迁移完整性评估: 为了验证记录完整性,使用冷存储服务定期从两个数据存储获取数据转储,并比较其完整性。数据缺失的部分用ETL过程填充。
  • 切换和清理: 一旦验证了数据的正确性和完整性,就禁用双写和双读,清理所有客户端代码,并且读/写只发生在新数据存储中。
迁移有状态系统
迁移有状态系统
清理

在迁移之后,清理任何与迁移相关的代码和配置对于确保系统平稳高效运行至关重要,并且避免增加技术债务和复杂性。一旦迁移完成并经过验证,所有与迁移相关的代码,如流量分发、A/B测试和重放流量集成,都可以从系统中安全的删除。其中包括清理配置更改、恢复到原始设置以及禁用迁移期间添加的任何临时组件。此外,记录整个迁移过程并保存遇到的任何问题及其解决方案的记录也很重要。通过执行彻底的清理和文档编制过程,可以从迁移中吸取经验教训,从而更有效的执行未来的迁移。

最后的思考

我们已经利用文中概述的一系列技术在Netflix平台上进行了大量大、中、小型迁移。我们的努力在很大程度上是成功的,几乎没有遇到停机或重大问题。在整个过程中,我们获得了宝贵见解并改进了技术。应该注意的是,并非所有提出的技术都是普遍适用的,因为每个迁移都有自己独特的环境。确定适当的验证、测试和风险降低策略需要仔细考虑几个因素,包括变更的性质、对客户体验的潜在影响、工程实现和产品优先级。最终,我们的目标是实现无中断或停机的无缝迁移。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

参考资料

[1]

Automated canary analysis at Netflix with Kayenta: https://netflixtechblog.com/automated-canary-analysis-at-netflix-with-kayenta-3260bc7acc69

[2]

Sticky Canary: https://www.infoq.com/presentations/sticky-canaries

[3]

A/B testing and beyond improving the Netflix stream experience and data: https://netflixtechblog.com/a-b-testing-and-beyond-improving-the-netflix-streaming-experience-with-experimentation-and-data-5b0ae9295bdf

- END -

本文由 mdnice 多平台发布

相关文章:

[大厂实践] 无停机迁移大规模关键流量(下)

在系统升级、迁移的过程中,如何验证系统逻辑、性能正确无误,是一个很大的挑战。这一系列介绍了Netflix通过重放流量测试解决这一挑战的实践。原文: Migrating Critical Traffic At Scale with No Downtime — Part 2 想象一下,你被心爱的Netf…...

VMware Workstation虚拟机CentOS 7.9 配置固定ip的步骤

VMware Workstation虚拟机CentOS7.9配置固定ip的步骤 编辑虚拟机 打开VMware Workstation。 选择要配置的虚拟机,但不要启动它。 点击“编辑虚拟机设置”(Edit virtual machine settings)。 选择“网络适配器”(Network Adapter&…...

构建自己的私人GPT

创作不易,请大家多鼓励支持。 在现实生活中,很多人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的私人GPT变得非常重要。 一、本地部署…...

EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示

EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示 一 mainwindow.c 文件函数:1.1 自定义PDO配置1.2 主站初始化二 motrorcontrol.c 文件三 allvalue.h 文件该文档修改记录:总结一 mainwindow.c 文件函数: 1.1 自定义PDO配置 int IO_setup(uint16 slave) {int...

线程安全、共享变量的可见性

Java中的线程安全问题 谈到线程安全问题,我们先说说什么是共享资源。所谓共享资源,就是说该资源被多个线程所持有或者说多个线程都可以去访问该资源。 线程安全问题是指当多个线程同时读写一个共享资源并且没有任何同步措施时,导致出现脏数…...

电动汽车BMS PCB制板的技术分析与可制造性设计

随着电动汽车行业的迅猛发展,各大厂商纷纷投入巨资进行技术研发和创新。电动汽车的核心之一在于其电池管理系统(Battery Management System, BMS),而BMS的心脏则是其印刷电路板(PCB)。通过这篇文章探讨电动…...

Android 车联网——多屏多用户(十五)

前面几篇文章介绍了多用户和多屏相关的 Manager 和 Service。上一篇文章最后虽然车内乘员都根据配置有自己的对应屏幕,但默认情况下,所有车内乘员依然使用的是当前主用户(司机用户),这一篇我们继续放下看一下用户的创建与分配。 一、用户创建分配 1、创建用户 对于创建用…...

uwsgitop 使用

背景:Django项目 uwsgi,uwsgi.ini 在工程下。 使用: 下载安装uwsgitop [roothost ~]# tar -zxvf uwsgitop-0.11.tar.gz [rootuwsgitop-0.11 ~]# cd uwsgitop-0.11/ [rootuwsgitop-0.11 ~]# python setup.py install [rootuwsgitop-0.11 …...

深信服技术认证“SCSA-S”划重点:文件包含漏洞

为帮助大家更加系统化地学习网络安全知识,以及更高效地通过深信服安全服务认证工程师考核,深信服特别推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…...

Color Control

设计一个优秀的用户界面是一项艰巨的任务。特别是如果你想改变UI的颜色,调整所有元素可能需要花费大量时间。Color Control可以帮助你!在检查器中以可视化的方式将你的项目颜色定义为资源。Color Control为你提供了组件,当你编辑它们时,它们会自动更新你的UI元素。 颜色控制…...

端口开放问题

端口开放问题 所遇问题 在宿主主机上可以ping通虚拟机ip192.168.27.129,但无法在宿主主机上访问http://192.168.27.129:8080navavcat 16连接mysql时,2002 - Can’t connect to server on ‘192.168.27.129’(100601) 原因 以上两个问题&a…...

KNN 回归

K 近邻回归(K-Nearest Neighbors Regression)是一种基于实例的回归算法,用于预测连续数值型的输出变量。它的基本思想是通过找到与给定测试样本最近的 K 个训练样本,并使用它们的输出值来预测测试样本的输出。它与 K 最近邻分类类…...

Kali Linux——获取root权限

目录 一、设置root密码 【操作命令】 【操作实例】 二、临时获取root权限 【操作命令】 【操作实例】 三、提升用户到root 1、获取root权限 2、进入/etc/passwd 3、查看root账号ID 4、找到需要修改的用户 5、输入i,进入编辑模式 6、把用户的ID改成跟r…...

听GPT 讲Rust源代码--compiler(28)

File: rust/compiler/rustc_codegen_llvm/src/llvm/mod.rs 文件rust/compiler/rustc_codegen_llvm/src/llvm/mod.rs是Rust编译器的LLVM代码生成模块的一个文件。该文件定义了一些用于与LLVM交互的结构体、枚举和常量。 此文件的主要作用是: 定义编译器和LLVM之间的接…...

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC 一、概述二、JDBC 连接器的工作原理三、使用复杂的 Debezium 变更事件四、至少一次交付五、多项任务六、数据和列类型映射七、主键处理八、删除模式九、幂等写入十、Schema evolution十一、引用和区分大…...

爬虫网易易盾滑块案例:某乎

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、滑块初步分析 js运行 atob(‘aHR0cHM6Ly93d3cuemhpaHUuY29tL3NpZ25pbg’) 拿到网址,浏览器打开网站&#xff0…...

机器学习笔记 - 偏最小二乘回归 (PLSR)

一、偏最小二乘回归:简介 PLS 方法构成了一个非常大的方法族。虽然回归方法可能是最流行的 PLS 技术,但它绝不是唯一的一种。即使在 PLSR 中,也有多种不同的算法可以获得解决方案。PLS 回归主要由斯堪的纳维亚化学计量学家 Svante Wold 和 Harald Martens 在 20 世纪 80 年代…...

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念,能够说出网页的构成以及网页相关名词的含义 熟悉Web标准,能够归纳Web标准的构成。 了解浏览器,能够说出各主流浏览器的特点。 了解HTML5技术,能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…...

dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib

更新Xcode14后低版本iPhone调试报错 dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib Referenced from: /var/containers/Bundle/Application/…/….app/… Reason: image not found 这是缺少libswiftCoreGraphics库 直接导入libswiftCoreGraphics库即…...

React Hooks中useState的介绍,并封装为useSetState函数的使用

useState 允许我们定义状态变量,并确保当这些状态变量的值发生变化时,页面会重新渲染。 useState 返回值 const [state, setState] useState(initialState);useState 返回一个长度为 2 的数组。通常,我们这样定义状态变量: co…...

5 个最适合SEI 网络空投交易等操作的钱包(Bitget Wallet,Coin98等)

大家好!Sei 网络比 SOL 快 5 倍,手续费低,还能防止前台交易。好了,我不会占用大家太多时间,让我们直奔主题吧。 Sei 官方:推特(twitter.com/SeiNetwork) 如上图所示,目前…...

.net8 AOT编绎-跨平台调用C#类库的新方法-函数导出

VB.NET AOT无法编绎DLL,微软的无能,正是你的机会 .net8 AOT编绎-跨平台调用C#类库的新方法-函数导出 1,C#命令行创建工程:dotnet new classlib -o CSharpDllExport 2,编写一个静态方法,并且为它打上UnmanagedCallersO…...

第三十八周周报:文献阅读 +BILSTM+GRU+Seq2seq

目录 摘要 Abstract 文献阅读:耦合时间和非时间序列模型模拟城市洪涝区洪水深度 现有问题 提出方法 创新点 XGBoost和LSTM耦合模型 XGBoost算法 ​编辑 LSTM(长短期记忆网络) 耦合模型 研究实验 数据集 评估指标 研究目的 洪…...

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展,web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求,许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西,…...

Linux下QT生成的(.o)、(.a)、(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)之间的区别

记录一下遇到的问题:Linux系统下Qt编译第三方动态库会生成多个.so文件,不了解的小伙伴可能很疑惑: (1)Linux 下 QT 生成的(.o)、(.a)和(.so)三个文…...

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于正负1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 笔者的一些话(写在最前面): 这是一篇小文,是我写的关于求解矩阵行列式的一篇文章中的一部分。之所以把这一段专门提溜出来,是因为这一段相对于原文是可以完全独立的,也是因为我…...

Redisson 源码解析 - 分布式锁实现过程

一、Redisson 分布式锁源码解析 Redisson是架设在Redis基础上的一个Java驻内存数据网格。在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常…...

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 开发板详情与规格

本文主要参考: BQ3588C_开发板详情-开源鸿蒙技术交流-Bearkey-开源社区 BQ3588C_开发板规格-开源鸿蒙技术交流-Bearkey-开源社区 厦门贝启科技有限公司-Bearkey-官网 1. 开发板详情 RK3588 核心板是一款由贝启科技自主研发的基于瑞芯微 RK3588 AI 芯片的智能核心…...

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏,例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) ,QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…...

实验笔记之——服务器链接

最近需要做NeRF相关的开发,需要用到GPU,本博文记录本人配置服务器远程链接的过程,本博文仅供本人学习记录用~ 连上服务器 首先先确保环境是HKU的网络环境(HKU AnyConnect也可)。伙伴已经帮忙创建好用户(第一次登录会提示重新设置密码)。用cmd ssh链接ssh -p 60001 <u…...

深圳做网站推广的公司/东莞seo建站公司哪家好

系统环境 --CentOS release 7python版本--Python 3.5.4背景&#xff1a;在企业环境中&#xff0c;安装ansible的服务器往往不能访问互联网&#xff0c;简单的下载ansible源码安装&#xff0c;会碰到缺少各种依赖包的问题&#xff0c;因此&#xff0c;推荐制作yum源&#xff0c;…...

网站的购物车怎么做/关键词优化排名网站

问题 想要在select语句中完成Spring配置值与查询的结果进行拼接。 解决 application.yml download:prefix: http://xxxx/get/ mybatis:mapper-locations: classpath:/mapper/*.xmlconfiguration-properties:dowPush: ${download.prefix}Mapper.xml <select>select C…...

做独立网站给你的启发是什么/东莞seo优化排名

“小乔啊,咱们网站要做一个往下扒拉一下,就刷新的效果”,BOSS 说 ”老板,这个应该叫滚动加载,你得学习一下技术名词啊“ ”明天咱们公司要向社会输送1个人才,我看你行“ 本篇博客是 爬虫训练场项目第18课,专栏清单查阅地址 pachong.vip 文章目录 调用滚动加载 - infinit…...

网络安全知识/郑州专业seo哪家好

在2021世界人工智能大会中&#xff0c;达观数据与浦东青联联合举办了“未来办公 文本赋能”智能语义分析应用论坛&#xff0c;多位专家学者围绕人工智能算法、语义分析、智能办公机器人应用等话题展开了一场精彩的交流盛宴。 复旦大学教授、博士生导师 复旦大学计算机科学技术…...

怎么做有趣的微视频网站/百度广告联盟价格

事务 1. 事务的几个概念 &#xff08;1&#xff09;脏读&#xff1a;对于两个事务t1,t2。t1先读取了已经被t2更新但是没有被提交的字段&#xff0c;那么在t2提交之后&#xff0c;数据就会发生改变。 &#xff08;2&#xff09;不可重复读&#xff1a;对于两个事务t1,t2。t1读…...

网站被入侵后需做的检测 1/网络平台推广具体是怎么推广

摘要&#xff1a;这个教程将指导你如何获取数据到你的表单并将这些数据提交。 Author: Shea FrederickTranslater: pplboy Published: May 22, 2007Translater Date:May 30.2007这个教程使用了在getting started tutorial教程中使用过的 雇员信息编辑表单。如果你仍然不熟悉如何…...