流量洪峰下要做好高服务质量的架构是一件具备挑战的事情,本文详细阐述了从 Google SRE 的系统方法论以及实际业务的应对过程中出发,一些体系化的可用性设计。对我们了解系统的全貌、上下游的联防有更进一步的帮助。
负载均衡具体分成两个方向,一个是前端负载均衡,另一个是数据中心内部的负载均衡。
前端负载均衡方面,一般而言用户流量访问层面主要依据 DNS,希望做到最小化用户请求延迟。
将用户流量最优地分布在多个网络链路上、多个数据中心、多台服务器上,通过动态 CDN 的方案达到最小延迟。
以上图为例,用户流量会先流入 BFE 的前端接入层,第一层的 BFE 实际上起到一个路由的作用,尽可能选择跟接入节点比较近的一个机房,用来加速用户请求。
然后通过 API 网关转发到下游的服务层,可能是内部的一些微服务或者业务的聚合层等,最终构成一个完整的流量模式。
基于此,前端服务器的负载均衡主要考虑几个逻辑:
数据中心内部的负载均衡方面,理想情况下会像上图右边显示那样,最忙和最不忙的节点所消耗的 CPU 相差幅度较小。
但如果负载均衡没做好,情况可能就像上图左边一样相差甚远。由此可能导致资源调度、编排的困难,无法合理分配容器资源。
因此,数据中心内部负载均衡主要考虑:
我们此前通过同质节点来扩容就发现,内网服务出现 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 算法,随机选取的两个节点进行打分,选择更优的节点:
通过优化负载均衡算法以后,我们做到了比较好的收益。
避免过载,是负载均衡的一个重要目标。随着压力增加,无论负载均衡策略如何高效,系统某个部分总会过载。
我们优先考虑优雅降级,返回低质量的结果,提供有损服务。在最差的情况,妥善的限流来保证服务本身稳定。
限流这块,我们认为主要关注以下几点:
在限流策略上,我们首先采用的是分布式限流。我们通过实现一个 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 到 LB(负载均衡)然后经过 API 网关再到 BFF、微服务最后到数据库,这个过程要经过非常多层。
在我们的日常工作中,当请求返回错误,对于 Backend 部分节点过载的情况下,我们应该怎么做?
而在客户端侧,则需要做限速。因为用户总是会频繁尝试去访问一个不可达的服务,因此客户端需要限制请求频次,可以通过接口级别的 error_details,挂载到每个 API 返回的响应里。
我们之前讲过,大部分的故障都是因为超时控制不合理导致的。首当其冲的是高并发下的高延迟服务,导致 Client 堆积,引发线程阻塞,此时上游流量不断涌入,最终引发故障。
所以,从本质上理解超时它实际就是一种 Fail Fast 的策略,就是让我们的请求尽可能消耗,类似这种堆积的请求基本上就是丢弃掉或者消耗掉。
另一个方面,当上游超时已经返回给用户后,下游可能还在执行,这就会引发资源浪费的问题。
再一个问题,当我们对下游服务进行调优时,到底如何配置超时,默认值策略应该如何设定?
生产环境下经常会遇到手抖或者错误配置导致配置失败、出现故障的问题。所以我们最好是在框架层面做一些防御性的编程,让它尽可能让取在一个合理的区间内。
进程内的超时控制,关键要看一个请求在每个阶段(网络请求)开始前,检查是否还有足够的剩余来处理请求。
另外,在进程内可能会有一些逻辑计算,我们通常认为这种时间比较少,所以一般不做控制。
现在很多 RPC 框架都在做跨进程超时控制,为什么要做这个?跨进程超时控制同样可以参考进程内的超时控制思路,通过 RPC 的源数据传递,把它带到下游服务,然后利用配额继续传递,最终使得上下游链路不超过一秒。
结合我们上面讲到的四个方面,应对连锁故障,我们有以下几大关键点需要考虑。
第一,我们需要尽可能避免过载。因为节点一个接一个挂了的话,最终服务会雪崩,有可能机群都会跟着宕掉,所以我们才提到要做自保护。
第二,我们通过一些手段去做限流。它可以让某一个 Client 对服务出现高流量并发请求时进行管控,这样的话服务也不容易死。
另外,当我们无法正常服务的时候,还可以做有损服务,牺牲掉一些非核心服务去保证关键服务,做到优雅降级。
第三,在重试策略上,在微服务内尽可能做退避,尽可能要考虑到重试放大的流量倍数对下游的冲击。
另外还要考虑在移动端用户用不了某个功能的情况下,通常会频繁刷新页面,这样产生的流量冲击,我们在移动端也要进行配合来做流控。
第四,超时控制强调两个点,进程内的超时和跨进程的传递。最终它的超时链路是由最上层的一个节点决定的,只要这一点做到了,我觉得大概率是不太可能出现连锁故障的。
第五,变更管理。我们通常情况下发布都是因为一些变更导致的,所以说我们在变更管理上还是要加强,变更流程中出现的破坏性行为应该要进行惩罚,尽管是对事不对人,但是还是要进行惩罚以引起重视。
第六,极限压测和故障演练。在做压测的时候,可能压到报错就停了。我建议最好是在报错的情况下,仍然要继续加压,看你的服务到底是一个什么表现?它能不能在过载的情况下提供服务?
在上了过载保护算法以后,继续加压,积极拒绝,然后结合熔断的话,可以产生一个立体的保护效果。
经常做故障演练可以产生一个品控手册,每个人都可以学习,经常演练不容易慌乱,当在生产环境中真的出现问题时也可以快速投入解决。
第七,考虑扩容、重启、消除有害流量。
如上图所示的参考,就是对以上几个策略的经典补充,也是解决各种服务问题的玄学。
作者:毛剑 简介:bilibili 技术总监,腾讯云最具价值专家(TVP)。负责 bilibili 数据平台部,拥有近十年的服务端研发经验。擅长高性能、高可用的服务端研发,熟悉 Go、Java、C 等语言。在 B 站参与了,从巨石架构到微服务的完整转型,包含微服务治理、微服务可用性设计,微服务数据一致性设计,微服务中间件,微服务监控,微服务日志收集,微服务负载均衡,和微服务 RPC 框架开发等。开源业内比较有影响力的项目:https://github.com/Terry-Mao/goim,分布式 IM 长连接广播服务;https://github.com/Terry-Mao/bfs,分布式小文件存储。
本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/BVptfrZJKQTFNOfAxxvX1Q
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。