揭秘字节跳动内部流量调度与容灾实践【上】

摘要: 在字节跳动,平衡超大规模流量的稳定性、性能与成本,是一系列产品共同面临的挑战,其中, Trafficroute GTM 起到了不可忽视的作用。Trafficroute GTM 承载了字节跳动亿级流量、覆盖了大规模场景,是一款基于 DNS 的流量路由服务,我们将通过两期文章,揭秘字节跳动如何通过 Trafficroute GTM 巧妙应对以上挑战,实现高效流量管理!

本文为上期,主要介绍基于TrafficRoute GTM 的 GEO-基础路由模式进行自定义流量编排,主要内容为:

  • TrafficRoute GTM介绍

  • TrafficRoute GTM的GEO-基础路由模式的能力

  • 通过流量编排实现同城多活、多CDN调度、CDN回源调度等经典架构及业务在稳定性、性能、成本等方面的收益

下期预告:下期我们将介绍TrafficRoute GTM 的Perf-智能路由模式,怎么通过它实现流量智能调度,敬请期待。

面临超大规模流量时,平衡好稳定性、性能、成本,能确保用户在访问服务时获得流畅、快速且可靠的体验,这对于提高用户满意度和粘性至关重要。TrafficRoute GTM 为业务提供基于 DNS 的全球流量负载均衡 、智能调度、自动 容灾服务,可以帮助业务提升连续性、实现资源优化、获取更多竞争优势。

1.火山引擎 Trafficroute GTM 简介

火山引擎 Trafficroute GTM 是基于 DNS 的流量路由服务。它依托全球1100+分布式探测节点,构建出强大的网络质量感知能力,实现了对 "端-边-云" 全链路流量的质量感知,从而能根据APP应用的实时的访问质量、节点负载和健康状况作出动态的流量调度。

此外,Trafficroute GTM 还提供灵活的调度策略,其中GEO-基础路由功能丰富,包括负载均衡、会话粘性和故障转移等多种特性。而Perf-智能路由则在基础路由的基础上,进一步提供性能优先和负载反馈等智能调度能力,以满足更高层次的调度需求。

一图看懂 TrafficRoute GTM

在字节跳动内部业务中,通过对Trafficroute GTM 能力的合理运用,落地了同城多活、多云混合等经典架构,也落地了边缘下沉,边缘计算x中心云等大规模分布式场景的最佳实践。

2.GEO-基础路由,实现流量自定义编排

TrafficRoute GTM 的 GEO-基础路由赋予用户灵活的流量管理能力,用户可根据具体业务需求,如负载均衡、就近接入、多活/灾备等,自定义路由调度策略,通过资源(地址池) 编排 、健康检查编排、路由(调度)规则 编排等能力,打造个性化的流量调度与容灾解决方案。

2.1地址资源编排:地址按需分类

资源是指流量访问的终点,包括公有云的 EIP 、CDN 的 CNAME 或边缘接入点等。TrafficRoute GTM 支持用户按照业务场景对资源(地址)进行自定义分类、组合和编排,编排形成的地址池可被路由规则引用,进而打造个性化的流量调度与容灾解决方案。

2.2健康检查编排:全链路监测能力

健康检查是实现自动容灾的必要条件,TrafficRoute GTM 具备覆盖全球范围的 L3/L4/L7 健康检查功能,用户可以配置不同灵敏度的全链路监测能力,以此为自动容灾提供精准的决策支持,最终实现最快分钟级自动容灾。

2.3路由规则编排:流量调度和容灾

通过精心配置 TrafficRoute GTM 的路由(调度)规则,可以精确控制流量的来源与去向,同时在发生故障时,确保流量能够按照预设的容灾方案进行故障转移。

3.字节跳动流量编排内部实践

在字节跳动内部业务中,通过 TrafficRoute GTM 的自定义流量编排实现了同城多活、异地灾备、全球多CDN调度、CDN回源调度等经典架构,帮助内部业务:

  • 在稳定性上,将MTTR降低至分钟级,实现最快1分钟故障发现,3-5分钟90%+流量收敛(由于流量收敛时长受客户端分布、localDNS行为、是否使用长连接等多种因素影响,3-5分钟90%+为参考值)
  • 在性能上,通过编排,将客户流量调度至各自访问体验最佳节点上,实现访问时延降低15%+
  • 在成本上,通过编排,将流量优先调度至单位成本更低的资源上,实现带宽成本降低10%+

3.1同城多活,异地灾备,确保业务稳定与连续

在字节跳动业务中,同城多活与异地灾备架构是确保超大规模业务全天候稳定运行的核心策略之一。借助 GTM 的 GEO-基础路由模式,我们成功构建了AZ 间流量 负载均衡 、 Region 间异地灾备、客户端 GEO & ISP 就近访问、分钟级自动 容灾 4大能力, 以这 4 大能力为保障,实现了流量负载均衡、客户端就近接入、分钟级自动容灾等,确保了业务的稳定性和连续性。

同城多活 & 异地灾备

AZ 间流量 负载均衡

通过编排路由规则的地址池权重 ,使得华北移动的客户端按照60% vs 40%比例在RegionA的AZ之间实现了负载均衡

同时,通过打开 *会话粘性开关(TOB版本待发布),使得特定的华北移动客户端始终访问同一个EIP,实现会话保持功能。

Region间异地灾备

通过编排路由规则的生效地址池集合 vs 其他地址池集合,实现了当Region A整体故障,流量切到Region B,实现异地容灾能力。

客户端 GEO & ISP 就近访问

通过编排路由规则的线路 & 生效地址池集合 ,实现了根据客户端地理位置运营商来就近访问服务的能力,从而确保时延最低、性能最优、体验最佳。

分钟级自动 容灾

通过编排健康检查规则,实现了最快1分钟 故障感知&容灾切换,3-5分钟 90%+流量收敛的能力;且可感知全链路的故障,覆盖客户端->运营商网络->机房入口->后端服务。

以下是字节跳动内部自动容灾实践案例,某个面向企业级客户的边缘云与中心云混合部署业务,在凌晨3点47分遭遇了某机房故障,GTM在3点48分迅速检测到这一故障,并自动启动了容灾机制。到了4点左右,中心机房已成功收敛了90%的流量。随后,在4点02分,GTM系统监测到故障已恢复,随即自动将流量回切至边缘机房。

3.2全球多CDN调度,始终选用"最优" 加速厂商

字节跳动的业务,会在全球应用包括火山引擎 CDN 在内的多家 CDN 厂商,来实现资源加速。然而,不同 CDN 厂商的服务能力存在差异,即便是同一厂商,在不同地区或不同时间段的表现也有所不同。因此,确保在全球各个地区始终选用"最优" CDN 厂商,成为了一项重要需求。

借助 TrafficRoute GTM 的流量编排,业务方能够根据不同区域的需求,灵活选择"资源覆盖更广"或"加速性能更好"的 CDN 厂商进行内容加速,同时可在多个厂商之间权衡成本效益(基于P95带宽计费)。同时, TrafficRoute GTM 确保了不同区域的流量能够"就近接入"选定的 CDN 厂商,以保障接入性能。在国内,针对不同运营商采用了定制化的路由策略,避免了 ISP 间的"跨网"问题,确保网络流畅。

为了应对流量管理中的潜在故障,每个流量部分都配置了多个地址池(即多个厂商),以实现故障时的自动流量切换。在故障探测方面, TrafficRoute GTM 采用了智能推荐的分布式综合探测方法,确保探测点与流量来源处于同一区域,减少误判风险,并具备分钟级的故障感知和流量迁移能力。

此外,故障转移(Failover)算法遵循"快速迁移,慢速恢复"的原则,结合历史流量质量监测和防抖动算法,以优化策略执行,确保服务的连续性和稳定性。

3.3 CDN回源调度,保障源站可用性

字节跳动内部业务中,每时每刻都有超大规模的视频、图文、API等流量经过 CDN/DSA 加速回到源站,因此源站的可用性至关重要。

为确保源站的可用性,我们通过 GTM 将源站接入点(一般是若干EIP)封装成回源 域名 ,回源域名被加载到 CDN 厂商的回源配置当中。由于回源域名由 GTM 托管,因此其具备了流量 负载均衡 、全链路健康检查、分钟级自动 容灾 等能力,保证了 CDN 厂商至源站这一回源链路的高可用性。这一容灾策略与 CDN 厂商回源机制本身包含的容灾策略相融合,可构建更加健壮的回源链路,进一步确保链路的高可用性。

在确保源站的可用性的过程中,通过 GTM 实现了两大能力,一是源站负载均衡,二是源站自动容灾。通过在GTM回源域名上配置源站的权重,可以实现将CDN回源流量在不同站点之间进行分配,保障了源站负载均衡;GTM通过周期性http健康检查,实时感知源站运行状态,无论是部分节点异常还是源站整体故障,GTM都能在1分钟内感知并完成容灾切换,实现了源站自动容灾。

以下是字节跳动内部CDN回源切流实践案例,通过GTM在14点08分将源站的telecom线路权重调整为0,14点12分左右源站telecom线路流量切空,14点42分左右通过GTM复原源站的telecom线路权重,14点45分左右源站telecom线路实现流量100%收敛。

END

通过搭建同城多活、异地灾备;全球 CDN 调度;CDN 回源调度等经典架构,Trafficroute GTM 帮助字节跳动内部业务经受了超大规模流量考验,确保始终为用户提供稳定的服务。

相关推荐
m0_748236582 小时前
解决Spring Boot中Druid连接池“discard long time none received connection“警告
spring boot·后端·oracle
Q_27437851092 小时前
基于Spring Boot的车间调度管理系统
java·spring boot·后端
Pandaconda4 小时前
【新人系列】Python 入门(二十七):Python 库
开发语言·笔记·后端·python·面试··python库
青灯文案14 小时前
Spring 中的 BeanFactory 和 ApplicationContext 详解
java·后端·spring
索然无味io4 小时前
PHP基础--流程控制
前端·笔记·后端·学习·web安全·网络安全·php
Pandaconda4 小时前
【Golang 面试题】每日 3 题(三十六)
开发语言·经验分享·笔记·后端·面试·golang·go
uzong5 小时前
碍于面子,偷偷学了 JAX-RS 规范
java·后端·架构
SomeB1oody5 小时前
【Rust自学】13.6. 迭代器 Pt.2:消耗和产生迭代器的方法
开发语言·后端·rust
Hello.Reader5 小时前
Rust 数据类型详解
开发语言·后端·rust
逸风尊者6 小时前
开发易忽视的问题:一个线程两次调用start()方法
java·后端·面试