0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

B站高可用用架构实践

佳佳 来源:jf_36786605 作者:jf_36786605 2024-06-06 10:37 次阅读

流量洪峰下做好高服务质量的架构是件具备挑战的事情,本文详细阐述了从Google SRE的系统方法论以及实际业务的应对过程中出发,一些体系化的可用性设计。对我们了解系统的全貌、上下游的联防有更进一步的帮助。
一、负载均衡
负载均衡具体分成两个方向,一个是前端负载均衡,另一个是数据中心内部的负载均衡。

前端负载均衡方面,一般而言用户流量访问层面主要依据DNS,希望做到最小化用户请求延迟。将用户流量最优地分布在多个网络链路上、多个数据中心、多台服务器上,通过动态CDN的方案达到最小延迟。

用户流量会先流入BFE的前端接入层,第一层的BFE实际上起到一个路由的作用,尽可能选择跟接入节点比较近的一个机房,用来加速用户请求。然后通过API网关转发到下游的服务层,可能是内部的一些微服务或者业务的聚合层等,最终构成一个完整的流量模式。
基于此,前端服务器的负载均衡主要考虑几个逻辑:

第一,尽量选择最近节点;
第二,基于带宽策略调度选择API进入机房;
第三,基于可用服务容量平衡流量。

数据中心内部的负载均衡方面,理想情况下最忙和最不忙的节点所消耗的CPU相差幅度较小。但如果负载均衡没做好,情况可能相差甚远。由此可能导致资源调度、编排的困难,无法合理分配容器资源。

因此,数据中心内部负载均衡主要考虑:

均衡流量分发;
可靠识别异常节点;
scale-out,增加同质节点以扩容;
减少错误,提高可用性。

我们此前通过同质节点来扩容就发现,内网服务出现CPU占用率过高的异常,通过排查发现背后RPC点到点通信间的 health check 成本过高,产生了一些问题。另外一方面,底层的服务如果只有单套集群,当出现抖动的时候故障面会比较大,因此需要引入多集群来解决问题。

通过实现 client 到 backend 的子集连接,我们做到了将后端平均分配给客户端,同时可以处理节点变更,持续不断均衡连接,避免大幅变动。多集群下,则需要考虑集群迁移的运维成本,同时集群之间业务的数据存在较小的交集。


回到CPU忙时、闲时占用率过大的问题,我们会发现这背后跟负载均衡算法有关。

第一个问题,对于每一个qps,实际上就是每一个query、查询、API请求,它们的成本是不同的。节点与节点之间差异非常大,即便你做了均衡的流量分发,但是从负载的角度来看,实际上还是不均匀的。

第二个问题,存在物理机环境上的差异。因为我们通常都是分年采购服务器,新买的服务器通常主频CPU会更强一些,所以服务器本质上很难做到强同质。


基于此,参考JSQ(最闲轮训)负载均衡算法带来的问题,发现缺乏的是服务端全局视图,因此我们的目标需要综合考虑负载和可用性。我们参考了《The power of two choices in randomized load balancing》的思路,使用the choice-of-2算法,随机选取的两个节点进行打分,选择更优的节点:

选择backend:CPU,client:health、inflight、latency作为指标,使用一个简单的线性方程进行打分;
对新启动的节点使用常量惩罚值(penalty),以及使用探针方式最小化放量,进行预热;
打分比较低的节点,避免进入“永久黑名单”而无法恢复,使用统计衰减的方式,让节点指标逐渐恢复到初始状态(即默认值)。
通过优化负载均衡算法以后,我们做到了比较好的收益。

二、限流
避免过载,是负载均衡的一个重要目标。随着压力增加,无论负载均衡策略如何高效,系统某个部分总会过载。我们优先考虑优雅降级,返回低质量的结果,提供有损服务。在最差的情况,妥善的限流来保证服务本身稳定。


限流这块,我们认为主要关注以下几点:

一是针对qps的限制,带来请求成本不同、静态阈值难以配置的问题;
二是根据API的重要性,按照优先级丢弃;
三是给每个用户设置限制,全局过载发生时候,针对某些“异常”进行控制非常关键;
四是拒绝请求也需要成本;
五是每个服务都配置限流带来的运维成本。

在限流策略上,我们首先采用的是分布式限流。我们通过实现一个quota-server,用于给backend针对每个client进行控制,即backend需要请求quota-server获取quota。

这样做的好处是减少请求Server的频次,获取完以后直接本地消费。算法层面使用最大最小公平算法,解决某个大消耗者导致的饥饿。


在客户端侧,当出现某个用户超过资源配额时,后端任务会快速拒绝请求,返回“配额不足”的错误,有可能后端忙着不停发送拒绝请求,导致过载和依赖的资源出现大量错误,处于对下游的保护两种状况,我们选择在client侧直接进行流量,而不发送到网络层。

我们在Google SRE里学到了一个有意思的公式,max(0, (requests- K*accepts) / (requests + 1))。通过这种公式,我们可以让client直接发送请求,一旦超过限制,按照概率进行截流。


在过载保护方面,核心思路就是在服务过载时,丢弃一定的流量,保证系统临近过载时的峰值流量,以求自保护。常见的做法有基于CPU、内存使用量来进行流量丢弃;使用队列进行管理;可控延迟算法:CoDel 等。

简单来说,当我们的CPU达到80%的时候,这个时候可以认为它接近过载,如果这个时候的吞吐达到100,瞬时值的请求是110,我就可以丢掉这10个流量,这种情况下服务就可以进行自保护,我们基于这样的思路最终实现了一个过载保护的算法。


我们使用CPU的滑动均值(CPU > 800 )作为启发阈值,一旦触发就进入到过载保护阶段。算法为:(MaxPass * AvgRT) < InFlight。其中MaxPass、AvgRT都为触发前的滑动时间窗口的统计值。

限流效果生效后,CPU会在临界值(800)附近抖动,如果不使用冷却时间,那么一个短时间的CPU下降就可能导致大量请求被放行,严重时会打满CPU。在冷却时间后,重新判断阈值(CPU > 800 ),是否持续进入过载保护。

三、重试

流量的走向,一般会从BFE到SLB然后经过API网关再到BFF、微服务最后到数据库,这个过程要经过非常多层。在我们的日常工作中,当请求返回错误,对于backend部分节点过载的情况下,我们应该怎么做?

首先我们需要限制重试的次数,以及基于重试分布的策略;
其次,我们只应该在失败层进行重试,当重试仍然失败时,我们需要全局约定错误码,避免级联重试;
此外,我们需要使用随机化、指数型递增的充实周期,这里可以参考Exponential Backoff和Jitter;
最后,我们需要设定重试速率指标,用于诊断故障。

而在客户端侧,则需要做限速。因为用户总是会频繁尝试去访问一个不可达的服务,因此客户端需要限制请求频次,可以通过接口级别的error_details,挂载到每个API返回的响应里。

四、超时

我们之前讲过,大部分的故障都是因为超时控制不合理导致的。首当其冲的是高并发下的高延迟服务,导致client堆积,引发线程阻塞,此时上游流量不断涌入,最终引发故障。所以,从本质上理解超时它实际就是一种Fail Fast的策略,就是让我们的请求尽可能消耗,类似这种堆积的请求基本上就是丢弃掉或者消耗掉。

另一个方面,当上游超时已经返回给用户后,下游可能还在执行,这就会引发资源浪费的问题。

再一个问题,当我们对下游服务进行调优时,到底如何配置超时,默认值策略应该如何设定?生产环境下经常会遇到手抖或者错误配置导致配置失败、出现故障的问题。所以我们最好是在框架层面做一些防御性的编程,让它尽可能让取在一个合理的区间内。

进程内的超时控制,关键要看一个请求在每个阶段(网络请求)开始前,检查是否还有足够的剩余来处理请求。另外,在进程内可能会有一些逻辑计算,我们通常认为这种时间比较少,所以一般不做控制。


现在很多RPC框架都在做跨进程超时控制,为什么要做这个?跨进程超时控制同样可以参考进程内的超时控制思路,通过RPC的源数据传递,把它带到下游服务,然后利用配额继续传递,最终使得上下游链路不超过一秒。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RPC
    RPC
    +关注

    关注

    0

    文章

    102

    浏览量

    11456
  • 架构
    +关注

    关注

    1

    文章

    493

    浏览量

    25325
收藏 人收藏

    评论

    相关推荐

    esp32当modbus-rtu slave从通讯,主收不到从的响应报文是哪里的问题?

    有朋友测试过esp32当 modbus slave从(我拿的esp32当从,用的是RTU模式)吗? 我用modbus poll软件测试下来,主这边一直收不到从的modbus响应
    发表于 06-17 07:39

    华为云 FunctionGraph 构建高可用系统的实践

    每年,网上都会报道 XXX 系统异常不可用,给客户带来巨大的经济损失。云服务的客户基数更大,一旦出现问题,都将给客户和服务自身带来极大影响。本文将基于华为云 FunctionGraph 自身的实践
    的头像 发表于 05-09 23:14 251次阅读
    华为云 FunctionGraph 构建高<b class='flag-5'>可用</b>系统的<b class='flag-5'>实践</b>

    【大语言模型:原理与工程实践】探索《大语言模型原理与工程实践

    处理中预训练架构Transformer,以及这些技术在现实世界中的如何应用。通过具体案例的分析,作者展示了大语言模型在解决实际问题中的强大能力,同时也指出了当前技术面临的挑战和局限性。书中对大语言模型
    发表于 04-30 15:35

    华为云多模数据库 GeminiDB 架构与应用实践直播问答实录

    余汶龙通过直播(链接见文末)的方式,分享了《华为云多模数据库 GeminiDB 的技术架构及应用实践》,对 GeminiDB 的技术特性、架构优势等进行了全方位解读。整场直播干货满满,让观众们直呼过瘾,并且积极提问,展开了深入交
    的头像 发表于 04-08 18:25 973次阅读

    华为云原生多模数据库 GeminiDB 架构与应用实践

    近日,2023 全球分布式云大会·深圳站顺利召开,华为云 NoSQL 数据库研发总监余汶龙在会上发表了题为《华为云原生多模数据库 GeminiDB 架构与应用实践》的精彩演讲。 余汶龙提出在智能
    的头像 发表于 04-08 18:23 973次阅读
    华为云原生多模数据库 GeminiDB <b class='flag-5'>架构</b>与应用<b class='flag-5'>实践</b>

    OpenHarmony Meetup 2023北京圆满举办

    图形架构、基于 RISC-V 架构的 OpenHarmony 应用实践、面向互联和智能的交互技术变迁、基于 OpenHarmony 的移动政务生态共建、OSWare 矿鸿发行版赋能矿山工业智能化等内容
    发表于 11-29 09:51

    如何构建弹性、高可用的微服务?

    基于微服务的应用程序可实现战略性数字转型和云迁移计划,对于开发团队来说,这种架构十分重要。那么,如何来构建弹性、高可用的微服务呢?RedisEnterprise给出了一个完美的方案
    的头像 发表于 11-26 08:06 301次阅读
    如何构建弹性、高<b class='flag-5'>可用</b>的微服务?

    MAC地址注册管理最佳实践:安全性、可用性和灵活性

    MAC地址注册管理是在网络环境中确保设备身份验证和访问控制的重要步骤。本文将介绍MAC地址注册管理的最佳实践,旨在提高安全性、可用性和灵活性,以满足现代网络的需求。随着网络规模和复杂性的不断增加
    的头像 发表于 11-21 14:57 320次阅读
    MAC地址注册管理最佳<b class='flag-5'>实践</b>:安全性、<b class='flag-5'>可用</b>性和灵活性

    云上多活高可用架构,助力企业实现业务无缝切换与持续稳定运行

    云上多活高可用架构,以实现业务的无缝切换和持续稳定运行。2023年云栖大会现场阿里云高级专家丁杰现场分享了《云上多活高可用架构的趋势和实践
    的头像 发表于 11-08 14:12 469次阅读
    云上多活高<b class='flag-5'>可用</b><b class='flag-5'>架构</b>,助力企业实现业务无缝切换与持续稳定运行

    lightech mbus主完整指令库

    lightech mbus主完整指令库
    发表于 10-09 06:20

    商城库存系统中心架构设计与实践案例

    本文探讨的vivo官方商城库存架构设计,从整个vivo大电商库存架构来看,vivo官方商城库存系统涉及销售层内部架构以及销售层与调度层的交互。
    发表于 08-30 10:59 1001次阅读
    商城库存系统中心<b class='flag-5'>架构</b>设计与<b class='flag-5'>实践</b>案例

    通过高可用性强制实施精简的IT基础架构模型

    电子发烧友网站提供《通过高可用性强制实施精简的IT基础架构模型.pdf》资料免费下载
    发表于 08-22 15:53 0次下载
    通过高<b class='flag-5'>可用</b>性强制实施精简的IT基础<b class='flag-5'>架构</b>模型

    Emulex OneCapture实用用户指南

    电子发烧友网站提供《Emulex OneCapture实用用户指南.pdf》资料免费下载
    发表于 08-04 15:18 0次下载
    Emulex OneCapture实<b class='flag-5'>用用</b>户指南

    Arm架构的扩展详解

    架构,根据发布时间使用最新的扩展。 本指南解释了Arm架构的扩展,并提供了如何阅读的指导并利用它们。 在本指南的最后,您可以检查您的知识。您将学习以下内容: •用于标识扩展的命名方案。 •哪些功能在不同的扩展中可用。 •如何确定
    发表于 08-02 06:08

    浅谈多机房部署的灾备架构模式

    互联网常见的高可用手段。比如服务冗余部署、异步化设计、负载均衡、服务限流降级熔断、架构拆分、服务治理、分布式存储等等,今天主要是一起聊下,多机房部署的灾备架构模式,来确保服务的高可用
    的头像 发表于 07-11 11:31 1442次阅读
    浅谈多机房部署的灾备<b class='flag-5'>架构</b>模式