如何为超大型赛事直播构建“万亿级”日志与搜索平台?

2024-08-11 16:05:42 浏览数 (2)

巴黎赛事如火如荼,中国健儿在赛场上屡创佳绩。作为赛事转播的核心平台,国内头部视频媒体不仅提供了赛事直播,还推出了丰富的原创新媒体节目,平台涵盖赛程查询、选手信息、奖牌榜、社区互动等功能,日均承载万亿量级的日志写入与十亿量级的在线搜索,总存储规模达PB级。腾讯云ES基于自研内核优化和专家级服务,成功扛下重任,保障了平台的稳定运行。

万亿级日志分析平台

再大的流量也“打不崩”

针对日志分析场景,腾讯云ES通过自研读写分离、存算分离、Serverless 架构、查询并行化、定向路由等先进技术,实现冷热数据一体化搜索及弹性伸缩能力。其核心能力支撑了腾讯社交、内容、娱乐等众多业务,经历了海量应用的大规模实践考验,同时也服务了业界非常多有影响力的头部企业,帮助客户显著提升日志写入性能和稳定性,并降本30-80%。

1. 稳定高可用(高并发写入)

平台作为赛事最核心的观看入口,写入量达千万级每秒,特别是在「樊振东对战张本智和」、「乒乓球女单决赛」、「乒乓球男单决赛」、「羽毛球男双决赛」等比赛中,写入流量一度突增1倍以上,高并发数据写入对底层服务稳定性提出了极大考验,一个稳定可靠的架构极为重要。腾讯云ES通过服务限流、异常容忍以及分布式线性扩展优化,帮助平台打造了固若金汤的健壮性架构。那么,我们在这个过程中是如何保障整个日志系统的稳定高可用的呢?

在赛事从预热、到开幕式、再到开赛以来,业务的突发增长有时候来的很突然,无法在前期做有效的评估。社区中的很多基于开源ES自建的用户也遇到过类似的问题,由于没有预估到业务突发的增长,并且在业务层没有做好服务降级等机制,导致突发的写入流量打崩了整个集群,使ES服务甚至整个业务长时间不可用。那么,在类似场景中,腾讯云ES是怎样保障突增写入流量下集群的稳定性的呢?

ES的写入流程中,用户的写入请求先到达一个数据节点,即协调节点。然后由该协调节点将请求转发给主分片所在节点进行写入,主分片写入完毕再由主分片转发给从分片写入,最后返回给客户端写入结果。右图是更细节的写入流程,而我们从堆栈中看到的写入请求堆积的位置就是在红色框中的接入层,节点挂掉的根因是协调节点的接入层内存被打爆。

针对这种高并发场景,我们的优化方案是服务限流。除了要控制并发请求数量,还要精准地控制内存资源,因为内存资源不足是主要的矛盾。此外,限流方案要具备通用性,能作用于各个层级实现全链限流。在很多数据库使用场景中,会采用从业务端或者独立的proxy层配置相关的业务规则的限流方案,通过资源预估等方式进行限流。这种方式适应能力弱,运维成本高,而且业务端很难准确预估资源消耗。

ES原生版本本身有限流策略,是基于请求数的漏桶策略,通过队列加线程池的方式实现。线程池大小决定了处理并发度,处理不完放到队列,队列放不下则拒绝请求。但是单纯地基于请求数的限流不能控制资源使用量,而且只作用于分片级子请求的传输层,对于接入层无法起到有效的保护作用。原生版本也有内存熔断策略,但是在协调节点接入层并没有做限制。

我们的优化方案是基于内存资源的漏桶策略。我们将节点JVM内存作为漏桶的资源,当内存资源足够的时候,请求可以正常处理;当内存使用量到达一定阈值的时候,分区间阶梯式平滑限流。例如上图中浅黄色的区间限制写入,深黄色的区间限制查询,底部红色部分作为预留buffer,预留给处理中的请求、merge等操作,以保证节点内存的安全性。

限流方案中的一个挑战是如何实现平滑限流。单一的阈值限流很容易出现请求抖动,例如请求一上来把内存打上去马上触发限流,而放开一点点请求又会涌进来把内存打上去。我们的方案是设置高低限流阈值区间,在这个区间中,基于余弦变换实现请求数和内存资源之间的平滑限流。当内存资源足够的时候,请求通过率为100%;当内存到达限流区间逐步上升时,请求通过率随之逐步下降;当内存使用量下降时,请求通过率也会逐步上升,不会一把放开。通过实际测试,平滑的区间限流能在高压力下保持稳定的写入性能。

2. 写入性能优化

赛事的热度持续上涨,且在某些时段,出现突然的增长,例如在「樊振东对战张本智和」的比赛中,写入流量一度突增50%,接近1300万/秒的写入。在千万级TPS写入的考验下,腾讯云ES通过自研能力成功实现高并发写入,轻松应对高并发写入流量。

定向路由策略:

在具体介绍定向路由前,先分析日志场景的特点以及开源 ES 的劣势。日志场景一般写多读少,在大规模写入与存储的场景下,容易出现一些 100 节点的 ES 集群。为了均衡各个节点的写入压力,一个索引会设置上百个主分片,均匀分布在各个节点上,这种设置在一些异常场景中,容易出现写入拒绝并且 CPU 资源难以被有效利用。

主要原因如下:

● 分片数量较多,容易出现长尾子请求,拖慢整个Bulk请求,继而使得写入队列打满。

● 拆分过多的子请求,导致磁盘IO次数过多,无法提升写入吞吐,无法充分利用CPU。

● 节点间交互次数过多,消耗系统资源。

通过分析ES的写入流程,我们可以了解到一次Bulk批量写入会把请求均分到所有的分片,个别的分片或节点卡顿就会拖慢整个Bulk请求,继而写入队列被打满,从而出现写入拒绝。此外,拆分过多的子请求,会导致写入吞吐量上不去,CPU也没有被充分利用。还有一点是,主分片写完之后再写副本分片,会导致节点之间的交互次数过多,消耗了系统资源。

腾讯云 ES 自研了 Bulk Routing 定向路由策略,即为每个 Bulk 请求增加一个随机的 routing 值,只路由到一个分片进行写入。最终达到的优化效果是:

● 相比开源 ES 提升写入速度在 20% 以上。

● 显著降低写入拒绝率。

● 同等写入速度下 CPU 使用率更低,CPU 资源可以被有效利用。

3. 读写分离架构

读写分离是一种常见的数据库架构优化策略,可用于提高数据库系统的性能和可扩展性。

原生ES 的写入方案,存在以下几个问题:

● 默认情况下将数据写入到ES是通过ES的bulk接口,ES需要在协调节点解析数据、将数据划分到各个分片、请求转发、解析文档、主分片转发请求给副本等工作。这样做的缺点是网络交互太多、每个分片吞吐量太低,导致写入差强人意。

● 数据写入、存储、查询都在同一个节点上,对于写多读少的日志分析场景,难以实现快速扩容。

腾讯云 ES 的读写分离方案,通过在协调节点提前基于 Lucene API 内存构建好 Segment,然后转发给具体索引分片,分片收到内存 Segment 后定时追加到 Lucene 中,最终实现数据写入。

基于协调节点构建 Segment,由于数据不直接落盘,整个写入服务相当于无状态。通过融合自研物理复制、内存 Merge、自研 Merge policy 等亮点技术,腾讯云 ES 读写分离方案相比开源 ES,可提升写入吞吐性能 5-20 倍。

“十亿级”直播搜索平台

查的更快更稳

1.稳定高可用(高并发大查询)

热门赛事,如乒乓球、游泳、跳水、羽毛球等,相比一些较为冷门的比赛,往往观看人数会有不同量级的增加。留言、互动等功能,在中国选手夺冠后,更是会出现流量突增的情况。例如「乒乓球男单决赛」这场比赛,光预约人数就达到将近 100 万,在线观看人数超过 3000 万。赛程、选手、奖牌榜、节目库、社区留言、互动等模块的在线搜索业务,对于性能、稳定性的要求极高。

那么,腾讯云 ES 是如何保障的呢?这里不得不提到自研的熔断限流、步长限流、滑动窗口聚合能力。

● 熔断限流:针对高并发大查询场景,自研熔断机制能在高负载时自动切断部分低优先级或高资源消耗的查询请求,确保核心查询请求的优先处理,保障整体服务的稳定性。

● 步长限流:通过动态调整请求步长,根据当前系统负载自动调整查询请求的步长,以实现资源的最优利用,确保在高负载情况下的查询效率和响应速度。

● 滑动窗口聚合:在查询聚合过程中,引入滑动窗口机制,能够更好地分摊计算压力,避免因某一时刻的高并发查询造成系统负载过重,从而提升整体的查询性能。

2.查询性能优化

在内核层面,腾讯云ES针对在线检索场景的特点做了更多优化,比如分片架构优化、查询并行化、lucene查询缓存锁改造等,整体帮助搜索场景查询性能提升3-10倍:

● 自适应副本策略:ES 分布式系统网络调用多,如果遇到跨地区/AZ调用或者慢节点分片副本调用,就会导致查询延迟高。腾讯云ES通过改进的本地自适应副本选择策略,其核心原理是:通过计算协调节点跟数据分片副本的查询平均响应时间、查询队列、查询成功率,不断地调整选择延迟最低的副本进行查询,来大幅降低搜索的延迟,并保障负载均衡。

● 查询裁剪:ES查询模型是将查询请求拆分成分片级的子请求转发给各个分片并行执行,最后在协调节点合并各个分片的结果,在每个分片内部有多个segment。腾讯云ES通过对列存、数值索引、Terms 等维度对 segment 进行提前裁剪跟合并收敛,减少随机IO,优化查询性能。

● 查询并行化:通过极致压榨空闲CPU资源,将ES的单个分片级请求拆分成多个子请求并行处理该分片下的segment或者docs,根据docs或者segment切分,每个线程只处理一部分docs或者segment,在数据节点合并每个线程的结果后再返回给协调节点,协调节点合并各个分片的结果返回给客户端,从而达到性能倍数级的提升。

● 查询缓存优化:通过 CBO 策略,避免了查询 Cache 操作导致查询耗时 10 倍的毛刺,并通过最小粒度的读写锁提升了LRU 缓存性能2倍 ,并提交到官方Elasticsearch、Lucene 社区,得到社区的认可跟点赞。

在此次巴黎赛事中,国内头部视频媒体凭借腾讯云 ES 的强大技术支持,成功应对了万亿级日志分析与十亿级直播搜索的挑战。通过服务限流、定向路由、读写分离等自研技术优化,保障了直播平台的高稳定性和高性能;通过熔断限流、步长限流、滑动窗口聚合等机制,确保了高并发大查询场景下的查询效率和响应速度;通过分片架构优化、查询并行化、lucene查询缓存锁改造等手段,显著提升了查询性能。

目前,腾讯云ES作为云端全托管海量数据检索分析服务,拥有高性能自研内核,是亚太地区对ES开源社区贡献最多的第三方团队,技术 PR 达 200 ,支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。

在实时检索、日志分析、向量检索、RAG等场景均有较多的优化与实践,被广泛应用于电商、零售、汽车、出行、金融、游戏等行业,帮助客户实现业务价值提升。面向 AI 时代,腾讯云 ES 也不断探索,推出了一站式向量检索与 RAG 方案,助力业务基于RAG能力实现智能化转型。

未来,腾讯云ES仍将不断迭代,面向市场与用户需求,不断打磨技术和产品,持续输出稳定可靠的云端检索分析服务。

0 人点赞