火山引擎边缘云融合CDN团队负责人孙益星在LiveVideoStack Con 2023上海站围绕融合CDN团队持续建设多云CDN平台的演进过程,结合建设过程中面临的难点和挑战,介绍了融合CDN团队接下来的主要投入方向,分享了火山引擎在多云应用架构下的CDN运维管理解决方案。
孙益星及他所在的融合CDN团队在大规模流量突发的挑战下,经过几年的不断迭代与打磨,使字节多云CDN平台完成了多个模块的整合,形成了一个统一的管理平台。
面向内部业务的多云CDN平台是什么?有什么用?要解决的到底是什么问题呢?
字节跳动有很多流量型的业务,包括抖音、头条、西瓜视频等。为了承载这样的流量,团队使用了各种各样流量加速的产品,包括静态加速、动态加速、域名解析、证书管理以及与各种配套的解决方案,比如源站缓存、回源调度、边缘函数等。
从业务角度出发,如果有一个平台能够直接管理所有加速域名的配置,这将会带来很大便利。只需要把源站储存的信息发送给平台,剩下的配置解析、流量分配、质量管理等都是由平台完成。
于是字节多云CDN平台——即融合CDN平台——应运而生,它向上承接所有业务方的CDN加速场景需求,底层对接不同的公有云服务,包含静态加速、动态加速等。这些服务本身由不同的厂商来提供,业务方在上层不需要关心它所对接的是哪些厂商,也不关心具体功能需求在不同的厂商上应该分别怎么去实现,它要做的事情就是把需求提给平台,然后由平台协调不同厂商的资源,最终再交付给业务。对于业务方来说,这就是一个普通的CDN服务平台,像是一家厂商提供的打包的服务一样,所以业内有个比较通俗的称谓是融合CDN平台。
业务对于这个平台的诉求有以下几点:
总结下来,上层业务对于平台有四个方面的需求:质量、成本、功能以及服务,这个是上层业务对于平台的需求。
从平台的角度考虑,厂商越少,复杂度的可能性就会越低。但由于这是一个融合平台,所以需要从所有字节的业务体系的角度考虑问题。
作为一个融合平台,平台的目标并不是要对接尽可能多的厂商,或者对接尽可能少的厂商。而是如果需要让整个业务达到这样一个理想的状态,多厂商基本是一个唯一的方案。在这个方案里,资源是动态变化的,不存在一种资源在各种场景下都是最好的。而是不同场景下总有一个最合适的,而平台在这里的职责就是向业务方高效的交付那些最合适的资源,并保证这些资源的可靠性,这是这个平台的核心能力。
平台的建设经过了两个阶段:
经过这两个阶段之后,融合CDN团队清晰的认识到:需要有一个统一的设计,把这些需要用到的能力都集中起来。
经过几年的迭代,平台完成了多个模块的整合,形成了一个统一的管理平台。大致分为权限管理、资源管理、质量管理、统计监控、厂商管理、运营分析几个模块。
平台建设中遇到了哪些挑战呢?
使用多个CDN厂商的情况在行业内是一种普遍的现象。融合CDN团队一开始对于对接多厂商的认识是打通API,向上统一封装。但是在真正实践时,融合CDN团队发现事情的复杂度比预期要高很多。
首先,行业里面基本没有公认的规范。作为一个融合平台,需要理解不同厂商的不同规范,逐个对接,避免业务踩坑。要在不同的厂商汇总的数据中,及时准确的发现地区性的质量波动并定位原因等。
其次,当资源选择变多了之后,如何保证融合CDN团队的选择是最优的变成了一个被大家关注的问题。
最后还有一个重要的问题:就是我去解决这些问题的时候,应该投入多少,怎么来评估产出,团队的价值如何量化。
我们从配置和数据两个基础的问题开始讨论,再展开到上层的方案,介绍我们质量和成本的运营,最后讨论平台团队价值的问题。
行业内配置的差异非常大。厂商之间没有规范,对接成本高。厂商的开放接口并不能覆盖全部的能力,接口操作风险高,一次变更全网下发。有些功能还必须去和厂商的后台沟通才能加入。
解决这个问题分为三个方面:
所有厂商所有的功能集合尽可能开放到一个规范里面,一次性实现完整的规范。即便人力开销会增大,但会变成一个相对来说较为固定的投入,不会像以前那样一直在反复的调整。
首先要求所有的配置变更必须有一个统一的入口。任何操作必须在内部的平台实现,不能在厂商操作。入口收敛之后,所有的配置只有有权限的人才能够发起变更,需要有熟悉业务的人来审批,审批之后由SRE来触发实际下发的流程。配置在下发完成之后,在接口层面会检查对应的配置是不是符合预期结果,进行一次重新的配置读取,厂商也会给到相应的反馈。配置下发完成之后,也会做一些调度层面的准备,例如新建域名或者删除域名。
最后在交付之前,会进行一次完整的回归测试。这些测试需要是配置项级别的,比如修改源站,融合CDN团队要确认回源相关的响应里面有没有新源站的信息,如果是修改访问控制规则,需要确认对应条件的访问是不是真的被拦截了或是被放行了。这些回归做完之后,意味着这次变更从用户侧的访问效果应该是真的达成预期了,最后才会通知业务方这个变更完成。
最后还有一个接口的测试框架,与前面提到的回归测试区别在于:上述的测试是面向配置结果,而这个测试框架是面向整个配置接口。因为接口转换的实现很重要,并且很容易出问题,导致这些问题的原因可能是代码的bug,或者厂商API层面的一些变更导致不兼容的问题、环境的变化产生的影响等,这些问题如果没有一个很好的测试框架,就只能等它出现问题的时候才能发现。在过去的一两年,经过测试框架的积累,火山引擎边缘云完成了大约2000多个case的建设,每次API上线都会跑一个完整的测试,每天有定时的巡查保证厂商测试的功能是符合预期的。这样大量的测试积累,也帮助我们发现了很多问题。
下面再说一个比较基础的能力:数据。
数据产生的源头分别来自于服务端和客户端。服务端从access log开始由厂商转换成两种数据出口,离线日志和实时统计的接口,前者延迟一般是小时计甚至天级别的,后者可能可以做到分钟级。平时看到的带宽请求数状态码都是从服务端的数据源产生的。客户端则是我们自己的业务上报客户端的访问质量数据,同时加上自身的拨测任务巡检,采集一些更详细的链路质量信息。
为了做统一的聚合分析,这些数据被统一存储到数据中台的统一数仓里。整体来看很容易可以理解要做什么,但是跟传统的大数据系统相比,多云平台的工程实现有出现一些额外的问题。
整个建设分为三个阶段:
右侧是整体的模式图。底层是统一的数据中台,负责数据的采集、计算、存储、对外提供查询的接口,上层包括监控、运营、策略等不同模块,面向不同的用户提供不同的功能。
介绍完配置和数据这两个基础的能力,下面向上讲一些业务方更关心的横向的能力,首先是质量保障。
作为一个融合平台,业务方如果有感觉到质量出现问题,一般是出现了故障。平台要做的事情就是把质量的标准提高,尽可能避免对业务产生影响。很多问题对上层没有影响,但是在内部已经走了一个完整的故障处理流程,包括问题的检测发现、通知告警、诊断定位、预案恢复。对于一些比较明显的问题,不管有没有对业务造成影响,融合CDN团队都会做内部的复盘和改进。
在这个流程中,融合CDN团队要面对各种各样的问题,比如如何保证检测到的告警的有效性、缩短定位的时长、提升我们无人工干预自动恢复的比例,以及后面的复盘定级需要怎么做。
这个过程是:
最基础的能力是监控的数据源,相较于刚才的多源数据采集,还定制了厂商侧的告警上报、实时错误日志推送等能力,也会结合业务侧的SDK打点、拨测数据、以及自有节点的一些质量数据。这些统一到数仓里,构建了一个比较实时的质量库。
往右就是数据的检测告警,数据会根据不同的维度聚合,比如域名的、业务的、AB测试的都可能有不同的告警规则。这些规则可以是例如状态码异常比例、播放错误率比例这类静态的规则,也可以是根据时序数据的特征和历史趋势动态判断告警阈值应该是多少。我们对于周期性的和非周期的时序数据都可以支持动态阈值的告警。
当告警触发后,会进入根因分析流程,判断这个告警产生的真实原因是什么。比如当业务方客户端错误率上升时,需要判断对应的是哪个域名,这个域名是放在哪个厂商上,对应的各个维度的监控是否正常。这些判断会涉及到时序数据异常检测、不同数据的相关性分析等等。基本上我们常见的异常都会有完整的根因分析逻辑,直到排查出最终的问题,比如到底是厂商侧的问题还是我们源站的问题还是地区性的网络问题。
这样最终在告警发送时,已经带着完整的诊断结果通知我们的SRE。比如会告诉你,当前的现象是客户端错误率上升,原因是源站问题,对应中间的检查结果是怎样的。这时候我们可以直接通知业务方处理自己的源站问题了。
如果是厂商的问题,例如地区性的节点不可用,除了会通知厂商之外,我们还会自动去执行一些预案。最常见的就是切流,把对应地区的调度权重从问题厂商上调走,同时保持对厂商对应地区的主动探测,当厂商的流量正常时再切回来。最后这个质量问题的影响时长、故障定级等等会在质量系统中有明确的体现,厂商侧也可以根据我们反馈的信息进行检查和改进。
这样最终整套的系统就实现了闭环,质量数据的检测会触发告警和根因,自动的根因分析和预案执行能够自动的改善质量数据。
过去几年融合CDN团队一直在改善闭环里的执行效率和准确性,让更多的问题能够被自动预案来覆盖。目前的告警准确性,就是那些波动异常经过智能阈值判断,以及降噪处理后,被确认真的是异常的占了98%以上,80%以上的告警会带着准确的根因分析信息一同提供给SRE和技术支持的同事。
成本运营在过去几年一直是一个令人非常头疼的问题。因为由于数据的敏感性,融合CDN团队最初做了很多的限制,导致相关的技术只能局限在一个很小的范围内讨论。但是这个团队要解决的工程问题还是非常复杂的,需要充分的投入。比如每个月一到月初就要花大量的时间去校验厂商的账单数据是不是准确,还有像成本分摊、波动归因等方面都存在很大的挑战。解决办法一种是让业务方熟悉我们的成本逻辑,自己去分析,另一种方式是从平台层面提供统一的能力来帮助业务。
首先需要明确的是数据因为和钱相关,确实是很敏感的,因为涉及到商务的保密问题等,但是钱可以拆分成两部分:一部分是单价,一部分是用量。单价只有有权限的人才能可见,所以融合CDN团队额外做了一套系统,把价格隔离起来管理。用量信息则没有那么敏感,大部分业务方都会接触用量信息。将单价隔离开以后,平台的负责人就可以深度的参与到用量的优化之中。这些用量,比如边缘带宽、存储、专线会分别对应到不同的分摊算法中去,让每一种资源的用量都有一个固定的逻辑分摊到最小的成本单元上,一般就是域名。域名在总的用量上面占多大比例是可以明确的,成本单元有自己的组织归属,包括叶子结点和跟结点的归属都可以映射过去。
对于业务方来说,可以直观的看到每月的带宽上涨到底是哪些业务甚至是域名导致的问题,这个就是我们近期面向业务方开放的成本分析能力。
在排查问题的时候,每一层的数据都是可校验的。所有域名的总用量加和,一定等于分摊前的总用量加和。每个资源的总用量,乘以对应的单价,一定等于对应的资源花掉的钱。做数据校验的时候,只需要一层层的校验就好了。
刚才说了我们作为一个多云管理的平台,资源是来自于底层的厂商,流量来自于上层的业务,平台做的事情只是把这个资源更好的交付给业务,协助我们的业务使用好这些资源。
在这个过程中我们投入了接口开发、QA、数据工程、运营分析、调度系统、质量监控、权限管理还有前台、文档等等,但是向上还是要落实到业务层面可以感知到的收益上,就是我的质量是不是有保障,还有我的成本是不是在持续的优化。
所以一直以来衡量融合CDN团队产出的指标一直都是一些相对固定的维度,质量、成本、效率、稳定性。
最近一年来整套的系统设计才逐渐完整,把线上问题收敛稳定下来。到现在为止依然要投入很多的人力去维护我们配置接口的迭代、数据的保障、以及平台化的功能建设。另一方面,正是因为有了业务体量的支撑,我们团队的投入价值才能最大化。
过去一段时间里,融合CDN团队也跟火山引擎的客户和开发者做了一些技术上的交流,去介绍融合CDN团队是怎么管理多云的。一个经常提出来的问题是,我有什么简单的办法实现你这套系统,我可以不要那么复杂的前台界面、审批流程。但是那些关键的能力,比如质量管理、成本分析,我们怎么样才能用最小的投入做起来。
所以在去年融合CDN团队对系统又重新做了一次改造,把底层的关键能力,数据系统配置系统调度系统还有中间的一些核心解决方案,逐步的开放成我们的产品能力,放到火山引擎上面提供出来。这个就是我们的多云CDN产品。
多云CDN底层还是对接不同资源厂商,包含不同服务类型。但中间层正在经历一个深度的改造,从右到左不断地将我们的核心能力孵化为开放的产品;从左到右,以上云的形式不断地将我们已有系统的实现以更加规范的设计和概念定义去做重构,让一些原本比较模糊的内部概念能够以一个内外部用户能理解的方式去运行。
在这套系统之上,现有的融合平台会变得越来越薄,未来可能只会保留一些跟内部业务深度耦合的部分,比如流程的审批、内部业务的预案等。业务方还是使用我们融合平台的界面,但是这个平台的底层未来会和火山引擎的客户一样是我们这个多云产品的用户,通过它提供的开放接口能力去管理各自的资源。
多云CDN产品上线时就已经完成了基本的资源管理能力。平台现在支持已经完成接口规范化改造的国内外厂商。在接口能力上配置的统一查询功能已经完成,也支持了像域名创建、证书更新这样的能力,更完整的配置变更流程正在做产品化的改造。在资源管理的基础上,业务组织、权限、统计聚合的能力也完成了,一些拓展的功能,比如在TOS文件变更的时候同时刷新多个厂商的CDN,我们称之为联动刷新的能力,有了多云的平台就比较容易实现,目前正在被实际使用。
在数据的能力上,统计的API和日志的API在第一阶段都已经支持。刚刚完成了数据采集的能力,可以直接帮助用户从API采集数据然后存下来,在这个数据能力之上,用户可以做不同厂商数据的统一聚合,或者灵活的对比不同厂商的数据。未来我们还会开放自定义报表的能力,帮助我们的客户分析全局的业务数据。
在监控能力上,有了刚才说的数据采集的能力,加上我们的拨测能力,以及未来会开放的客户数据上传的通道,我们把内部的智能告警、根因分析、自动容灾的预案也都放到了产品上,未来会结合我们自己的质量库帮助我们的客户更好的分析业务质量、提升服务的可靠性。
近期,成本管理能力已经上线。总的来说就是将成本运营能力开放,结合数据采集能力和账单分析能力,帮助客户准确的分析账单构成、业务成本构成和波动的原因。未来还会结合不同的计费模型,帮助业务方更好的分析成本,组成对应的优化方案。
上述就是整个多云CDN产品的演进过程。融合CDN团队期望和厂商、开发者一起,为火山引擎的用户,实现一个规范、统一、安全、高效、智能的多云流量管理平台。