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

    文章

    113

    浏览量

    12204
  • 架构
    +关注

    关注

    1

    文章

    532

    浏览量

    26514
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智能变电站方案:构建高效安全电力

    文章由山东华科信息技术有限公司提供在高速铁路网络快速扩张的背景下,作为人流物流枢纽,对电力供应的稳定性与智能化提出更高要求。智能变电站方案通过数字化升级与系统集成,成为保障
    的头像 发表于 12-01 13:05 145次阅读
    <b class='flag-5'>高</b>铁<b class='flag-5'>站</b>智能变电站方案:构建高效安全电力

    Arm Unlocked 2025深圳圆满落幕

    继上海、首尔之后,Arm Unlocked 2025 AI 技术峰会深圳圆满落幕。在面对持续增长的人工智能 (AI) 算力需求,Arm 正持续推进“平台优先”战略,在高性能、高能效及可扩展性的底层计算
    的头像 发表于 11-04 18:01 1210次阅读

    校园科普气象:技术赋能下的自然探索课堂

    校园科普气象:技术赋能下的自然探索课堂 柏峰【BF-XQX】在素质教育深化推进的背景下,校园科普气象正成为连接课堂理论与自然实践的重要桥梁。它以模块化的技术架构、可视化的交互设计和
    的头像 发表于 10-22 10:05 185次阅读
    校园科普气象<b class='flag-5'>站</b>:技术赋能下的自然探索课堂

    光伏自动气象技术架构与发电效率保障应用

    光伏自动气象技术架构与发电效率保障应用 柏峰【BF-GFQX】光伏自动气象以“精准辐照感知、发电效率评估、运维智能辅助”为核心技术特征,融合光伏专用气象监测与发电性能分析功能,成为光伏电站高效运营的关键技术装备。
    的头像 发表于 10-15 17:29 1615次阅读
    光伏自动气象<b class='flag-5'>站</b>技术<b class='flag-5'>架构</b>与发电效率保障应用

    分布式光伏环境监测站的技术架构与应用实践

    分布式光伏环境监测站的技术架构与应用实践 柏峰【BF-GFQX】一、系统技术架构解析 分布式光伏环境监测站采用“感知层-传输层-应用层”三层架构设计,实现环境数据的全链路智能化处理。
    的头像 发表于 10-13 10:05 279次阅读
    分布式光伏环境监测站的技术<b class='flag-5'>架构</b>与应用<b class='flag-5'>实践</b>

    企业级HDFS可用与YARN资源调度方案

    作为一名在大数据运维领域摸爬滚打8年的老兵,我见过太多因为基础架构不够健壮而导致的生产事故。今天,我想和大家分享一套经过实战检验的 HDFS 可用与 YARN 资源调度方案,这套方案帮助我们团队将平台
    的头像 发表于 09-08 17:15 575次阅读

    华纳云:海外服务器负载均衡与可用架构设计

    在现代互联网应用中,海外服务器承担着跨境业务、并发请求和实时数据传输的关键角色。单台服务器难以支撑大量并发请求,一旦发生故障,可能导致服务中断和业务损失。因此,合理设计负载均衡与可用架构
    的头像 发表于 08-28 18:32 493次阅读

    香港服务器部署Windows集群服务的网络拓扑设计与实现-可用架构方案

    ,重点讲解网络拓扑设计的3种典型模型及其适用场景,并提供香港本地化部署的实操建议。如何在遵守《网络安全法》要求前提下实现多节点集群的可用性?冗余网络配置如何平衡成本与效能?本文将为您揭晓具体实施路径。 香港机房选址对网络架构
    的头像 发表于 08-26 17:16 631次阅读

    光伏实验气象的技术架构与应用实践

    光伏实验气象的技术架构与应用实践 柏峰【BF-GFQX】在光伏产业快速发展与新能源科研不断深入的背景下,光伏实验气象作为获取精准气象数据与光伏性能参数的核心设备,其技术先进性直接决
    的头像 发表于 08-19 08:57 1924次阅读
    光伏实验气象<b class='flag-5'>站</b>的技术<b class='flag-5'>架构</b>与应用<b class='flag-5'>实践</b>

    深入剖析RabbitMQ可用架构设计

    在微服务架构中,消息队列故障导致的系统不可用率高达27%!如何构建一个真正可靠的消息中间件架构?本文将深入剖析RabbitMQ可用设计的核
    的头像 发表于 08-18 11:19 722次阅读

    QNAP 正式推出 NAS 双机架构可用性解决方案,打造不中断的储存环境

    , HA) 解决方案,让企业透过稳定可靠的 NAS 双机备援架构,确保业务关键资料与服务不中断。QNAP 可用性解决方案在 Beta 版本期间获得市场高度肯定,正式版的推出更进一步提供
    的头像 发表于 07-28 09:26 418次阅读

    介绍三种常见的MySQL可用方案

    在生产环境中,为了确保数据库系统的连续可用性、降低故障恢复时间以及实现业务的无缝切换,可用(High Availability, HA)方案至关重要。本文将详细介绍三种常见的 MySQL
    的头像 发表于 05-28 17:16 1023次阅读

    MYSQL集群可用和数据监控平台实现方案

    该项目共分为2个子项目,由MYSQL集群可用和数据监控平台两部分组成。
    的头像 发表于 05-28 10:10 1100次阅读
    MYSQL集群<b class='flag-5'>高</b><b class='flag-5'>可用</b>和数据监控平台实现方案

    阿里国际“八先过海”计划助力B2B商家出海

    近日,阿里国际正式推出了旨在扶持新商家出海的“八先过海”计划,该计划涵盖了八大举措,全方位助力商家抢占B2B出海先机,延续出海红利。 据了解,“八先过海”计划从多个维度出发,包括加大对新市场的投入
    的头像 发表于 02-19 09:21 840次阅读

    TMS320C3x通用应用用户指南

    电子发烧友网站提供《TMS320C3x通用应用用户指南.pdf》资料免费下载
    发表于 12-24 16:18 1次下载
    TMS320C3x通用应<b class='flag-5'>用用</b>户指南