为满足更严苛数据分析的需求,腾讯音乐借助 Apache Doris 替代了 Elasticsearch 集群,统一了内容库数据平台的内容搜索和分析引擎。并基于 Doris 倒排索引和全文检索的能力,支持了复杂的自定义标签计算,实现秒级查询响应需求。此外,实现写入性能提升 4 倍、使用成本节省达 80% 的显著成效。
作者|腾讯音乐内容信息平台部
内容库数据平台的数据架构已经从 1.0 版本演进到了 4.0 版本。之前的文章介绍了分析引擎 从 ClickHouse 到 Apache Doris 升级实践。本文将重点分享内容搜索引擎从 Elasticsearch 到 Apache Doris 的替换,如何通过一个系统同时满足内容搜索和数据分析的需求,并满足复杂的自定义标签计算的支持。最终,实现存储成本降低 80%,写入性能提升 4 倍的显著效益。
业务需求
内容库百科搜索:分析师和运营人员需要快速查找歌手、歌曲名称以及其他文本信息。这种检索能力不仅要求高效的全文搜索,还需支持多种查询条件,以便用户能够迅速获取所需数据,提升工作效率。 内容库标签圈选:分析师和运营人员会根据特定的标签和条件,筛选出符合要求的内容。这要求系统能够在亿级数据量的情况下,提供秒级的查询响应,以便快速定位和分析相关数据,支持业务决策和策略优化。
Elasticsearch + Doris 混合架构
存储成本较高:Doris 的引入并没有完全解决存储成本高的问题,Elasticsearch 的存储空间占用仍然显著。 写入性能受限:随着数据量的增长,Elasticsearch 集群的写入压力不断加大,全量写入耗时超过 10 个小时,接近业务可承受极限。 混合架构复杂:Elasticsearch 和 Doris 的混合架构增加了系统和技术栈的维护成本,同时冗余的数据存储也带来了额外费用,两套系统也增加了数据不一致的风险。
基于 Apache Doris 的统一架构方案
在全文检索方面,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 table1
WHERE 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 actor
ORDER BY cnt DESC LIMIT 100;
成本显著降低: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 模型,用于存储每日的指标数据。由于数据量较大且每天的数据独立,每天需新建一个分区。
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=OLAP
UNIQUE KEY(`dayno`, `id`)
COMMENT 'OLAP'
PARTITION BY RANGE(`dayno`)
(PARTITION p99991230 VALUES [('9999-12-30'), ('9999-12-31')))
DISTRIBUTED BY HASH(`id`) BUCKETS auto
PROPERTIES (
...
);
使用 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'
对中文采用 unicode
分词,数值采用english
分词创建倒排索引。设置 store_row_column
,启用行存,优化select*
查询所有列。
-- 先通过match从维度表搜索查询到id
SELECT 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 )
02 业务间资源隔离
第一层:物理隔离(Resource Group)。将集群划分为两个资源组:Core 和 Common,以服务不同重要场景的需求。Core 组专注于内容搜索和标签圈选的核心需求,而 Common 组则处理其他普通需求。通过在节点层面实施物理隔离,可确保核心业务不受其他业务的影响。 第二层:逻辑隔离(Workload Group)。在每个物理隔离内部,通过 Workload Group 对每个 Resource Group 进行逻辑资源的细分。例如,在普通集群中建立多个 Workload Group,并为用户指定默认的 Workload Group,以防止单个用户占满整个集群的资源。
业务无感迁移方案
结束语
更多标杆企业信赖
作为基于 Apache Doris 的商业化公司,飞轮科技秉承着 “开源技术创新”和“实时数仓服务”双轮驱动的战略,在投入资源大力参与 Apache Doris 社区研发和推广的同时,基于 Apache Doris 内核打造了聚焦于企业大数据实时分析需求的企业级产品 SelectDB ,面向新一代需求打造世界领先的实时分析能力。自 2022 年成立以来,获得 IDG 资本、红杉中国、襄禾资本等顶级 VC 的近 10 亿元融资,创下了近年来开源基础软件领域的新纪录。