写点什么

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%

  • 2024-10-25
    北京
  • 本文字数:4837 字

    阅读完需:约 16 分钟

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%

作者|腾讯音乐内容信息平台部:张俊、罗雷、李继蓬、代凯


为满足更严苛数据分析的需求,腾讯音乐借助 Apache Doris 替代了 Elasticsearch 集群,统一了内容库数据平台的内容搜索和分析引擎。并基于 Doris 倒排索引和全文检索的能力,支持了复杂的自定义标签计算,实现秒级查询响应需求。此外,实现写入性能提升 4 倍、使用成本节省达 80% 的显著成效。


腾讯音乐娱乐拥有丰富的内容曲库,包括录制音乐、现场表演、音频和视频等多种形式。通过技术和数据赋能,腾讯音乐娱乐不断创新产品,为用户提供更优质的体验,提高用户参与度,同时为音乐人和合作伙伴在制作、发行和销售方面提供更大支持。基于公司丰富的音乐内容资产,腾讯音乐将歌曲库、艺人资讯、专辑信息、厂牌信息等大量数据统一存储,形成音乐内容库数据平台,该平台旨在为应用层提供库存盘点、分群画像、指标分析、标签圈选等内容分析服务,高效为业务赋能。


内容库数据平台的数据架构已经从 1.0 版本演进到了 4.0 版本。之前的文章介绍了分析引擎从 ClickHouse 到 Apache Doris 升级实践本文将重点分享内容搜索引擎从 Elasticsearch 到 Apache Doris 的替换,如何通过一个系统同时满足内容搜索和数据分析的需求,并满足复杂的自定义标签计算的支持。最终,实现存储成本降低 80%,写入性能提升 4 倍的显著效益。


业务需求


从业务角度来看,腾讯音乐有两个场景需要搜索能力的支持,分别是内容库的百科搜索及内容库的标签圈选。


  • 内容库百科搜索:分析师和运营人员需要快速查找歌手、歌曲名称以及其他文本信息。这种检索能力不仅要求高效的全文搜索,还需支持多种查询条件,以便用户能够迅速获取所需数据,提升工作效率。

  • 内容库标签圈选:分析师和运营人员会根据特定的标签和条件,筛选出符合要求的内容。这要求系统能够在亿级数据量的情况下,提供秒级的查询响应,以便快速定位和分析相关数据,支持业务决策和策略优化。



Elasticsearch + Doris 混合架构


在 2.0 版本之前,Doris 暂未推出倒排索引能力,检索能力相对较弱。而 Elasticsearch 在全文检索方面具备优势,能够基于倒排索引快速匹配特定关键词或短语、可对所有字段建立索引,在查询时支持任意组合的过滤条件等。


但是,Elasticsearch 聚合统计分析性能较差,不支持 JOIN 等复杂查询,且存储空间占用较高。这些正是 Apache Doris 所擅长的领域,能够高效处理复杂的统计分析和查询任务,并通过高压缩率优化存储效率。


因此,腾讯音乐构建基于 Elasticsearch 与 Doris 的混合架构,Elasticsearch 负责内容的全文检索和标签圈选,而 Apache Doris 专注于 OLAP 分析。借助 Doris 的 ES catalog 外表查询机制,能够直接查询 Elasticsearch 中数据,实现对外查询接口的统一。



但这套混合架构在应用时,也遇到了一些问题:


  • 存储成本较高:Doris 的引入并没有完全解决存储成本高的问题,Elasticsearch 的存储空间占用仍然显著。

  • 写入性能受限:随着数据量的增长,Elasticsearch 集群的写入压力不断加大,全量写入耗时超过 10 个小时,接近业务可承受极限。

  • 混合架构复杂:Elasticsearch 和 Doris 的混合架构增加了系统和技术栈的维护成本,同时冗余的数据存储也带来了额外费用,两套系统也增加了数据不一致的风险。


基于 Apache Doris 的统一架构方案


因此,腾讯音乐考虑是否可以将搜索引擎统一为 Doris,让其全面负责全文检索、标签圈选以及聚合分析的需求。这样考虑的主要原因是 Apache Doris 自 2.0 版本开始支持倒排索引和全文检索,这使其有能力完全替 Elasticsearch 所负责的部分,获得更好的收益


  • 在全文检索方面,Doris 不仅支持普通的等值和范围(=, !=, >, >=, <, <=)查询加速,还支持文本字段的全文检索,包括中英文分词、多关键词检索(MATCH_ANY,MATCH_ALL)、短语检索(MATCH_PHRASE, MATCH_PHRASE_PREFIX,MATCH_PHRASE_REGEXP)、短语词距(slop)、多字段检索(MULTI_MATCH),其性能相较于传统数据库支持的 LIKE 模糊匹配有数量级的提升。

  • 在倒排索引方面,Doris 倒排索引在数据库内核中实现,语法与 SQL 无缝结合,支持多种条件的任意 AND OR NOT 逻辑组合,满足普通过滤以及全文检索组合的复杂需求。如下方示例,WHERE 筛选条件由 5 部分组成,包括全文检索 title MATCH ‘爱’ OR description MATCH_PHRASE ‘热爱’,日期范围过滤 dt BETWEEN ‘2024-09-10 00:00:00’ AND ‘2024-09-10 23:59:59’,数值范围过滤 rating > 4,字符串等值过滤 country = ‘中国’,这些条件通过统一的 SQL 语法无缝组合起来,筛选完之后又按照 actor 进行分组统计,最后对分组统计的 cnt 排序取最高的 100 个结果。


SELECT actor, count() as cnt FROM table1WHERE dt BETWEEN '2024-09-10 00:00:00' AND '2024-09-10 23:59:59'  AND (title MATCH '爱' OR description MATCH_PHRASE '热爱')  AND rating > 4  AND country = '中国'GROUP BY actorORDER BY cnt DESC LIMIT 100;
复制代码


因此,腾讯音乐将 Doris 升级至 2.0 版,将架构从原先的 Elasticsearch + Doris 转变为统一的 Doris 解决方案:



基于 Doris 的统一架构上线后,所带来的收益也非常可观:


  • 成本显著降低:Doris 替代了 Elasticsearch 集群,同时承载了搜索和分析两类负载,使用成本节省达 80%。比如,某个表单日全量数据在 Elasticsearch 中需要 697.7 GB 存储空间,而在 Doris 中仅需 195.4 GB ,存储空间减少了 72%。



  • 写入和查询性能提升:全量数据导入时间从 10 小时以上缩短至 3 小时以内, 写入性能是 Elasticsearch 的 4 倍。此外,Doris 可以支持复杂的自定义标签计算,使不可能变为可能,显著改善了用户体验。

  • 统一系统架构:架构统一到 Doris 后,内部只需维护一套技术栈,极大降低了维护成本,同时也很好避免了两套系统之间的数据一致性问题,确保了数据质量的可靠性。


在架构统一的过程中,涉及到一些关键设计,接下来将相关方案及经验分享给读者。


01 Doris 倒排索引的使用


在存储结构上采用了维度表与事实表的方案:


  • 维度表:使用 Merge-on-Write Unique 模型,用于百科搜索和标签圈选,通过部分列更新进行维度更新。

  • 事实表:使用 Aggregate 模型,用于存储每日的指标数据。由于数据量较大且每天的数据独立,每天需新建一个分区。


参考 Doris 倒排索引的使用文档(https://doris.apache.org/zh-CN/docs/table-design/index/inverted-index),根据 Elasticsearch Mapping 设计了对应的 Doris 的表结构和索引。其中,Elasticsearch 的 Keyword 类型对应 Doris 的 Varchar/String 类型及不分词的倒排索引(USING INVERTED),ES 的 Text 类型对应 Doris 的  Varchar/String 类型及分词倒排索引(USING INVERTED PROPERTIES(“parser” = “english/chinese/unicode”))。


CREATE TABLE `tag_baike_zipper_track_dim_string` (  `dayno` date NOT NULL COMMENT '日期',  `id` int(11) NOT NULL COMMENT 'id',  `a4` varchar(65000) NULL COMMENT 'song_name',  `a43` varchar(65000) NULL COMMENT 'zyqk_singer_id',  INDEX idx_a4 (`a4`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true") COMMENT '',  INDEX idx_a43 (`a43`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '') ENGINE=OLAPUNIQUE KEY(`dayno`, `id`)COMMENT 'OLAP'PARTITION BY RANGE(`dayno`)(PARTITION p99991230 VALUES [('9999-12-30'), ('9999-12-31')))DISTRIBUTED BY HASH(`id`) BUCKETS autoPROPERTIES (...);
复制代码


使用 Doris 倒排索引的前后对比:


使用前:以下方复杂查询为例,在使用 Doris 倒排索引之前,该查询运行较慢、响应级别为分钟级。


-- like (查询复杂性能低):SELECT  * FROM db_tag_pro.tag_track_pro_3  WHERE dayno='2024-08-01' AND  ( concat('#',a4,'#') like '%#若月亮还没来#%' or concat('#',a43,'#') like '%#1000#%')  
-- explode (执行性能差,经常 ERROR 1105 (HY000)):SELECT * FROM ( SELECT tab1.*,a4_single,a43_single FROM ( SELECT * FROM db_tag_pro.tag_track_pro_3 WHERE dayno='2024-08-01' ) tab1 lateral view explode_split(a4, '#') tmp1 as a4_single lateral view explode_split(a43, '#') tmp2 as a43_single ) tab2 where a4_single='若月亮还没来' or a43_single='1000'
复制代码


使用后:使用 Doris 倒排索引之后,查询过程显著简化,运行速度极大提升,响应时间从分钟级缩短至秒级别


  • 对中文采用 unicode 分词,数值采用 english 分词创建倒排索引。

  • 设置 store_row_column,启用行存,优化 select* 查询所有列。


-- 先通过match从维度表搜索查询到idSELECT  id FROM db_tag_pro.tag_baike_zipper_track_dim_string  WHERE( a4 MATCH_PHRASE '若月亮还没来' OR a43 MATCH_ALL '1000' )  AND  dayno ='2024-08-01'
-- 再通过id主键查询事实表得到明细数据SELECT * FROM db_tag_pro.tag_baike_track_pro WHERE id IN ( 563559286 )
复制代码


不仅如此,原来在 Elasticsearch 中由于语句过长而无法查询的复杂自定义标签,在 Doris 内能够更好的支持,Doris 能够处理更长的 SQL 语句。并且在同一个引擎内,可以通过物化视图和 BITMAP 类型轻松对查询后的中间结果进一步优化,避免了不同引擎之间的跨网络同步。


02 业务间资源隔离


为了确保业务侧使用体验和成本可控,我们采用了 Doris 的资源隔离机制进行业务间的资源管理。


  • 第一层:物理隔离(Resource Group)。将集群划分为两个资源组:Core 和 Common,以服务不同重要场景的需求。Core 组专注于内容搜索和标签圈选的核心需求,而 Common 组则处理其他普通需求。通过在节点层面实施物理隔离,可确保核心业务不受其他业务的影响。

  • 第二层:逻辑隔离(Workload Group)。在每个物理隔离内部,通过 Workload Group 对每个 Resource Group 进行逻辑资源的细分。例如,在普通集群中建立多个 Workload Group,并为用户指定默认的 Workload Group,以防止单个用户占满整个集群的资源。



上述资源隔离机制显著提升了系统的稳定性,告警频率从每天 20 多次降低到每月个位数。这不仅保障了业务的可靠性,还减轻了团队运维管理压力,使他们能够将更多时间投入到系统优化中。


业务无感迁移方案


腾讯音乐自研的 SuperSonic 项目内置了 Headless BI 功能,其核心理念是将数据建模、管理和消费进行解耦。通过这种架构,业务分析师只需在 Headless BI 平台上定义指标和标签,而无需关心底层数据源的具体实现。


在业务迁移过程中,业务团队通过 SuperSonic Headless BI 进行。利用转换工具将 DSL 转换为 Elasticsearch SQL 查询,只需切换已定义指标和标签所对应的数据源即可。由于 Headless BI 屏蔽了底层不同数据存储和分析引擎的差异,业务方能够实现无感知的迁移。



Headless BI 架构不仅实现了数据源的无缝迁移,还大大简化了数据管理和查询的复杂性。SuperSonic 将 Chat BI 与 Headless BI 融合,使用户能够实现统一的数据治理,并通过自然语言进行数据分析。经过腾讯音乐的自主研发和实际应用,SuperSonic 平台现已开源,欢迎感兴趣的同仁使用与共同建设。


_GitHub 地址:_https://github.com/tencentmusic/supersonic


结束语


借助 Doris 替代 Elasticsearch 集群,腾讯音乐统一了搜索和分析引擎。基于倒排索引和全文检索的能力,支持复杂的自定义标签计算,满足秒级响应需求。此外,写入性能提升了 4 倍,存储空间减少了 72%,使用成本节省达 80%


未来,腾讯音乐将与 Apache Doris 深度合作,探索更多特性在场景应用中的可能性,包括引入 3.0 版本的存算分离,以进一步降低成本。


今日好文推荐


太古可口可乐:将经验转化为数据,探索行业专有模型


字节澄清大模型遭攻击,实习生嫁祸背刺同事?IBM老员工被无端解雇后举报董事长;年薪40万美元因滥用25美元餐补被裁!| Q资讯


国产编程语言MoonBit发布原生后端,比Java快15倍,拥抱 RISC-V


37signals“下云”计划完美收官:成本节约比当初估算的还要多,5年狂省千万美元


2024-10-25 12:4310134

评论

发布
暂无评论

中国北京|HICOOL 2023 全球创业大赛

科兴未来News

Hicool 海外 #双创赛事#

转转测试环境治理高效能实践

转转技术团队

架构 测试 后端 灰度发布 全链路灰度

阿里巴巴内网Spring Cloud Alibaba 强势来袭,开创微服务的新时代

架构师之道

Java 微服务 架构师

时序数据库 TDengine 携手北京科技大学设计研究院,助力冶金工业智慧化

TDengine

数据库 tdengine 时序数据库

NFTScan 与 MintKit 达成战略合作伙伴,由 NFTScan 为其提供 NFT API 数据服务

NFT Research

NFT 数据基础设施

如何把照片变成“漫画脸”?一招教会你一键生成氛围感动漫头像

互联网民工阿强

图片 图片处理 动漫 漫画头像 ACGAN-动漫头像

react源码分析:组件的创建和更新

flyzz177

React

手写一个react,看透react运行机制

flyzz177

React

再快一点?Web 3动态内容如何加速?

Java全栈架构师

程序员 程序人生 Web 后端 架构师

隐私计算技术开源的整体现状

京东科技开发者

开源 经验分享 隐私计算 隐私安全

中台KPI怎么设计?

博文视点Broadview

DevEco Studio新特性分享-跨语言调试,让调试更便捷高效

HarmonyOS开发者

HarmonyOS

IOS技术分享| IOS快对讲调度场景实现

anyRTC开发者

音视频 呼叫邀请 快对讲 语音对讲 视频对讲

如何导入本地数据?

Towify

如何用弹出对话框实现登录页非空提示?

Towify

高性能且小巧的脚本语言 LuaJIT

ooooooh灰灰

lua 后端 JIT 网关

深入React源码揭开渲染更新流程的面纱

flyzz177

React

极盾科技CEO丁杨:让数据安全回归场景、业务和价值

极盾科技

数据安全

语音社交App系统源码中语音厅App搭建之开宝箱游戏机制说明以及技术文档

山东布谷科技胡月

语音直播源码 语音社交软件 语音直播app 语音厅平台搭建 语音聊天APP源码

AI将产生创富的第5次浪潮

felix

机器学习 模型开发

从react源码看hooks的原理

flyzz177

React

机器学习服务活体检测算法荣获CFCA权威安全认证

HarmonyOS SDK

HMS Core

RocketMQ Compaction Topic的设计与实现

Apache RocketMQ

RocketMQ 消息队列

融云获 2022 中国技术先锋年度评选「中国技术品牌影响力企业」奖

融云 RongCloud

深度分析React源码中的合成事件

flyzz177

React

软件测试 | 简历中应该如何描述才能体现出软技能的实力 ?

霍格沃兹测试开发学社

研运至简,创新无限!嘉为品牌VI全新升级

嘉为蓝鲸

自动化运维 嘉为蓝鲸 品牌升级

小游戏引擎选型注意事项

FinFish

游戏 小游戏 小游戏引擎

Jupyter Notebook入门指南

京东科技开发者

前端 服务端 Server 多编程语言 企业号 1 月 PK 榜

灵活高效又美丽,谈谈我们的产品体验升级思路

嘉为蓝鲸

自动化运维 嘉为蓝鲸 IT服务管理中心

react的useState源码分析

flyzz177

React

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%_数据湖仓_SelectDB_InfoQ精选文章