1. HTTPDNS 服务为何要做边缘云原生改造
外部驱动:随着抖音用户越来越多,HTTPDNS 的接入流量也从曾经的百万上涨到了千万级 QPS ,抖音集团业务希望 HTTPDNS 服务可以在缩减成本的基础上,降低解析时延,以此来提高业务收益;
内部痛点:服务部署在中心云,整体架构稳定的同时也限制了性能的优化空间,受限于在中心云机房的部署的,资源、带宽的价格都是固定的,在流量不变的情况下,很难进一步压缩成本、提升性能。业内通常会选择使用 Anycast 来优化网络接入的质量和性能,但国内 Anycast 存在类似于 pop 点吸流不准以及运营商之间 BGP 路由不能完全打通的问题,性能不及预期。
资源受限:首先,千万级流量的 QPS 需要海量的计算资源,边缘计算自身拥有将服务部署在离用户近的位置、分布广泛、节点多的优势,同时也存在每个节点的容量较小、资源受限的问题,一方面体现在流量需求和资源分布不均的情况,另一方面边缘侧基础设施相对云中心仍在完善中;
稳定性欠缺:其次,随着部署的节点越来越多,比如最早是三个 region 机房,当整体边缘下沉以后,大概会有近百个节点,这种情况会导致整个系统的运维复杂度上升,后期面临版本升级、不定期机房割接和裁撤等情况时,整个系统的可靠性会下降。
收益难评估:最后,由于要从中心云迁移到边缘云,整个架构上需要对云原生的组件重新做适配。相关的可观测能力,包括监控告警、日志分析、运维自动化能力都需要重新建设,整个项目周期比较长,架构改造比较大,对于需要投入很多资源和人力来做的这种项目,如果在前期不能很好地评估风险和收益,那么最终可能会导致项目失败。
2.HTTPDNS 服务边缘云原生改造时面临的挑战
实现最优部署难:HTTPDNS 支撑起千万级 QPS 、亿级连接,用户分布在全国各个地域,当资源和流量不对等的时候,需要进行边缘节点的选点和资源部署的规划,基于业务现状,实现最优部署比较困难。
交付速度慢:改造过程中会面临少量热点区域边缘计算客户需求大,资源紧张资源情况,影响整体交付速度。
运维复杂度提升:随着部署的边缘节点越来越多,分布式系统控制面需要重构,这个过程中会带来运维复杂度提升,此外,由于使用公网做控制面管控,系统的安全风险会变高,还需要重建可观测系统;
精准流量调度难:边缘计算节点的容量从数万到百万 QPS 不等,面对多数量节点、复杂流量分布,以及运营商跨省限流,使得实现精准流量调度难度上升。
在服务特性方面,HTTPDNS 为用户提供域名解析服务,支持将解析缓存到本地,按照 TTL 间隔更新,这种服务形态天然具备了无状态、可缓存的优势,基于这个优势,可以将无状态的部分优先下沉到边缘,释放无状态这部分的就近接入能力。
在配置编排方面,随着边缘云操作系统的完善,资源编排能力越来越强,同时高可靠的云边通道,也为 HTTPDNS 构建统一的分布式控制面,提供了通信可靠的保障。
在现有架构的优势方面,在中心机房部署服务时对云组件产生了强依赖,使用容器进行部署,将架构进行了模块化、解耦和分层,在模块之间的跨服务通信上,优化了通信协议的支持、质量保障,这些会为云原生技术改造带来架构上的优势。
3.千万 QPS 服务工程实践
3.1敏捷式交付
第一阶段,主要是对最小概念模型加以验证。我们开设了客户端的 AB 实验,真实地采集抖音相关用户在体验侧的性能数据,判断是否有优化。在贵州地区进行的 AB 实验数据证明,首先,将缓存先下沉的模式没有问题,其次,整体的性能、成本上的收益符合预期。在此结论上,我们才能放心地推进项目。
第二阶段,主要是在西南地区,通过构建一个区域内的小集群来验证区域内的自动化容灾能力,目标是想在边缘节点之间,通过流量调度实现区域自治。
第三阶段,主要是进一步优化多级容灾方案,以及深度融合边缘云组件。举例来说,我们做到了无损升级,当我们通过容器发布新版本时,使用 K8s 的底层组件感知到这个事件,容器会和上游的 LB 进行路由联动,提前拆除路由转发路径,卸载用户流量,实现了整个升级过程的无损。
最后,当边缘云原生改造完成之后,我们既有中心机房提供简单地、可靠的 Anycast 的接入能力,又有边缘机房提供离用户很近的、低成本的 IP 接入能力,同时,我们需要进一步打磨统一的资源管控能力和统一的流量接入调度能力。
3.2演进式架构
第一阶段,简单的单体模式。比如,早期我们的流量只有百万级的 QPS ,但是抖音业务发展特别快,为了满足业务快速增长的需求,我们选择了比较简单的架构模式,短平快地交付产品来满足业务发展。
第二阶段,随着业务发展,我们对系统进行了架构分层、内部解耦的模块化改造。经过多轮改造,我们将系统分为了协议、缓存、接入、递归四个层次,这四个层次有的无状态,有的有状态,比如缓存层能够做到完全无状态,接入层能感知到任意一个用户的请求,从中获取用户的设备类型、地理位置、请求的内容等,递归层聚焦在 DNS 服务基础上,把 DNS 解析做得更好,同时,我们将有状态和无状态的层次分离出来。
第三、第四阶段,是推进边缘云原生改造工程实践过程中做的事情,先将已经分离的无状态的服务层下沉到边缘,优先发挥性能和成本的优势,最后形成云边共存的架构,进一步打磨流量调度和资源统一管理的能力。
3.3核心问题一:流量和资源的冲突
3.4核心问题二:性能与稳定性的冲突
3.5解决方案路径
前期,为了满足边缘部署的快速接入、项目的快速推进,我们选择了人工的方式,通过文档来规划每一个节点的资源和它需要服务地域的流量之间的关系,但随着节点从几个变成近百个,人工规划就变得不实际了,因此我们选择平台化的方式来处理。
现在,引入了火山引擎 GTM ,帮助完成统一的资源和流量接入的调度,通过它实现了现阶段的流量调度需求的管理。
未来,由于 HTTPDNS 服务拥有大流量规模,实现边缘云原生改造的过程中,涉及到的节点非常多,积累的调度经验也可以沉淀出来,因此未来我们打算做基于强化学习,通过拨测以及真实流量作为训练环境,把经验和在边缘分布式调度上的策略进行积累,以模型的形式提供给客户。
3.6智能调度:平衡容量、性能和可靠性
3.7云边段全链路流量调度
3.8软件和系统架构优化
3.9新问题及解决方案
4.总结与展望
4.1项目整体收益
在成本上,实现了 35% 的成本优化。左边的图是项目周期内成本单价的曲线,在实验阶段,成本确实有所下降,验证是符合预期的,才开始灰度上线直至最终完成。
在性能上,实现了 20% 性能提升。右边的图是通过 920 多个拨测节点,对比原来的中心架构、只使用边缘部署的架构,以及既使用智能调度又使用边缘部署的混合架构,三种架构的 AB 实验的测试数据,其中黄橘色,也就是混合架构的数据性能最好,比原架构领先了大概 20% ,目前性能处于国内 TOP 梯队。
4.2成本收益归因
4.3通过云调度 GTM 获得的收益
4.4工程角度的思考
首先是优先级。整个改造过程中,第一优先级是稳定性,第二优先级是成本,第三优先级是性能,因为性能天然就有保障,但是稳定性可能会丢失,成本不一定,具体取决于边缘的用法。
其次是方案排序。在边缘部署的方案设计、流量接入调度的设计以及需不需要做深度的边缘云原生改造的讨论上,我们确定了优先进行部署,在部署的基础上才能进一步实现流量调度。
4.5未来持续演进方向
首先是安全 DNS ,保障全链路的安全解析,可以为用户提供免费、高性能、安全的公共 DNS 服务;
其次是进一步实现边缘接入精细调度,深度打磨云边端全链路调度系统。实现设备级的精细接入控制,把机房流量误差控制到 1% ,以及通过云端联动实现预警式故障流量主动迁移;
最后是海外递归服务下沉。海外的 Anycast 性能相对较好,但海外用户比较喜欢用公共 DNS ,8.8.8.8 在全球的流量占比大概是 40% ,未来希望在海外通过边缘下沉的方式解决 Anycast 在南美洲、中亚地区等覆盖不足的问题,进一步提升产品服务能力和用户体验。