乐趣区

关于后端:图数据库在百度汉语中的应用

导读 :随着各行业的疾速倒退,数据间的关联性越来越高,然而传统数据库很难解决档次深、品种多的关系运算,由此图数据库应运而生。而本文则是介绍了图数据库在百度汉语中品种多样的场景下的利用。

全文 3909 字,预计浏览工夫 6 分钟。

一、前言

百度汉语业务蕴含字、词、新诗、成语、歇后语等 10 多种分类,共波及实体数据 1 千多万条,尽管波及的数据量级不大,但每个实体类型的属性繁多。比方一首新诗就蕴含内容、诗体、释意、作者、诗名、赏析、背景、标签等几十种属性,同时产品上须要反对“静夜思的作者是那个朝代的人”这样多种关联条件的查问。面对以上状况,如果采纳传统的关系型数据库,比方 Mysql,就须要给每种分类数据建一张表,并且为每个查问属性建设索引条件,这样在面对一些简单的查问场景,须要一次性关联多张表能力取到后果,这显著不合乎个别在线的业务的做法;另外除了满足个别的要求,百度汉语还需反对阿拉丁卡片疾速召回的标准,响应后果做到 200ms 以内,反对峰值单机过千 QPS 的申请量;综上,面对这种档次深、关系品种多的海量简单数据关系上,图数据库应运而生。

二、图数据库选型

2.1 图数据库介绍

图数据库(graph database,GDB)是一个应用图构造进行语义查问的数据库,它应用节点、边和属性来示意和存储数据。该零碎的要害概念是图,它间接将存储中的数据项,与数据节点和节点间示意关系的边的汇合相关联。这些关系容许间接将存储区中的数据链接在一起,并且在许多状况下,能够通过一个操作进行检索。图数据库将数据之间的关系作为优先级。查问图数据库中的关系很快,因为它们永恒存储在数据库自身中。能够应用图数据库直观地显示关系,使其对于高度互连的数据十分有用。

图一为 db-engines 网站各类数据库的趋势图,能够看出从 2014 年开始,图数据库始终处于领先地位。

图二 是不同品种数据库系统数量,能够看出,常见的关系型数据库、kv 型数据库占比最高,除此之外,图数据库占比也十分大。

2.2  图数据库选型

依据上图也能够看出,目前支流的图数据库至多有 32 种,业务方须要依据本人的业务个性进行抉择,对于百度汉语这种业务来说,咱们次要思考了以下几点:

1)开源我的项目 

2)我的项目成熟可扩大 

3)部署运维成本低,稳定性高 

4)文档丰盛,最好社区沉闷 

5)反对批量数据导入和导出能力

目前应用最宽泛的是 neo4j,历史悠久,经得住工夫的考验长期处于图数据库畛域的龙头位置。然而很可怜,neo4j 有两个大的硬伤:1. 开源社区版本只反对单机,不反对分布式;2. 应用了商业不敌对的 GPL V3 协定。

对于百度汉语来说,因部门调整、业务调整等须要,须要转移底层的存储引擎。因而,思考到业务中的简单在于查问场景的多样,而不是档次多,而且在数据大部分为静态数据的状况下,因而应用的是百度开源的 HugeGraph 图数据库(链接:https://HugeGraph.github.io/H…)。

这里能够提到的是,HugeGraph 自身提供了多种存储引擎以供应用(Memory、Cassandra、ScyllaDB、RocksDB、Mysql 等),在百度汉语中,相比于其余 kv 存储引擎,Rocksdb 对咱们来说理解比拟多一点,数据以文件的模式保留在文件夹内,不便挪动拷贝,而且对 SSD 的反对、吞吐量更好,因而咱们应用的是 Rocksdb。此外 HugeGraph 对数据的保护反对更好,自身提供了 RESTful Api 和大批量数据干涉的 loader 工具,轻松反对亿级数据的导入。

而且 HugeGraph 反对 Apache TinkerPop3 的图形遍历查询语言 Gremlin。SQL 是关系型数据库查询语言,而 Gremlin 是一种通用的图数据库查询语言,Gremlin 可用于创立图的实体(Vertex 和 Edge)、批改实体外部属性、删除实体,也可执行图的查问操作。Gremlin 可用于创立图的实体(Vertex 和 Edge)、批改实体外部属性、删除实体,更次要的是可用于执行图的查问及剖析操作。

三、百度汉语图数据库建设

3.1 汉语服务部署

HugeGraph 的部署非常简略,百度汉语外部应用对立的虚拟化技术加 PaaS 平台间接部署。对于汉语类这种高读极低写的应用场景,为了保障业务的低耗时与高可用,咱们并没有采纳分布式的部署形式,而是间接采纳多主的的形式进行部署,每份实例上存储全量的数据,这样能够在同机房的图数据库中疾速获取数据;当然这种部署形式最大的毛病是可能存在数据不统一,为了解决这一问题,百度汉语采纳数据对立干涉平台来保障整个集群数据的一致性。

对于汉语搜寻这种场景,对内容召回的耗时有着极高的要求,为了防止一些长尾耗时,咱们没有将 HugeGraph 的接口间接对外裸露,而且在下层增加一层 Nginx 转发服务,次要有以下两个作用:1)灵便管制业务的超时工夫,防止下层业务未被动断开的造成影响 2)应用 nginx proxy\_cache 来缓存数据,减速后果的返回。因为汉语类检索的实体内容并不多,在数据库层应用缓存,能够间接返回 30% 左右的热点数据。各个服务器之间通过 Afs 云盘实现数据文件共享。

3.2 汉语干涉平台

下面介绍了百度汉语应用 HugeGraph 的部署形式: 采纳横向冗余的形式进行部署,这就对数据更新时,多个集群数据一致性进步了要求。汉语类的的一些数据谬误、网络新词呈现时,都须要手动更新原数据,百度汉语为了反对疾速的数据干涉,为搭建了数据对立干涉平台,此平台能够对线上数据的实时干涉,同时为了可能将数据进行离线剖析,数据同台还须要反对批量数据的导入和导出。

目前干涉平台反对实时数据干涉、批量数据干涉和数据导出三种基本功能。在服务层,干涉平台会记录每次的操作内容,会定期检查干涉的后果是否合乎预期,同时对于历史的操作可能进行数据回溯。为了保障 HugeGraph 集群的同时更新胜利的“事务性”,这里减少了 N 次重试的机制,当重试依然失败时,会被动触发报警进行人工干预。

在集群未部署前,须要咱们先把数据筹备好,因为百度汉语应用的是 RocksDb 引擎,所以咱们把筹备好的数据打包之后上传到 Afs 云盘上,当 HugeGraph 服务开始部署时,从 Afs 中拉取数据包,依照咱们配置好的目录加载数据,启动 HugeGraph 服务。

当服务器异样的时候,须要进行迁徙,咱们采纳的是把以后异样服务器的数据打包,上传到 Afs 云盘,更新备份,并且新开掘一台新的服务器,再次从 Afs 拉取数据包,在此期间在干涉平台中标记服务异样,再此期间,组织数据的干涉,从而保证数据的一致性。分钟级别的定时备份和服务器迁徙时的更新备份曾经满足汉语中的备份须要。在数据可视化上,干涉平台提供了 JSON 化视图模式和 HugeGraph-Studio Web 图形化两种能力,不便经营同学疾速定位数据的属性信息。

例如在百度汉语中,一首诗的存储相似如下:

其中 4 种不同的顶点类型,别离代表着诗、诗名、作者、诗句 4 种重要的属性,彼此之间有边进行关联着。

3.3 业务查问

应用 HugeGraph 图数据库尽管能够对字、诗词等内容的多维关系查问,然而对于搜寻开篇所说的搜寻场景,用户输出的 query 个别是含糊的语意,比方“《静夜思》的作者是哪个朝代的”,须要将此类 query 转换成图数据库可能了解的 Gremlin 语法,

即:

shici.traversal().V().hasLabel('poem_name').hasId('p_name- 静夜思').outE('name_poem').inV().hasLabel('poem').outE('type_poem_author').inV().path();

用户的查问前差万别,这里须要引入 DA 解析模块(数据词典),可能对用户输出的 query 解析成 Gremlin 语法,DA 的基本原理就是依据历史数据演绎的 query 进行分类模版化,将用户的 query 解析到特定的模版变量中进行替换填充,从而组成一句残缺的 Gremlin 语句。


四、总结和瞻望

家喻户晓,没有任何一个软件敢说本人是完满的,或多或少都会有各自的偏重,HugeGraph 在现有存储系统之上新增了通用的图语义解释层,图语义层提供了图遍历的能力,然而受到存储层或者架构限度,多跳遍历的性能较差,很难满足 OLTP 场景下对低延时的要求。在进行倒排索引等检索场景时须要业务进行插件扩大,同时它的存储类型比拟繁多。然而瑕不掩瑜,HugeGraph 自身的性能加上 lucene 引擎曾经满足了百度汉语的查问场景。接下来咱们要做的就是持续对图数据库的理解以及优化,在保障本身稳固的状况下,更加深刻的开掘图数据库的价值,更好的对用户进行服务。

参考资料:

数据库趋势图:https://db-engines.com/en/ran…\_categories

HugeGraph 官网:https://hugegraph.github.io/h…

招聘信息:

百度教育业务承载百度汉语类搜寻、教育相干流量以及多款翻新 APP;内容生产侧,采纳图数据库、Nosql 等多种存储引擎,生产上亿教育资源,为公司继续提供优质内容。内容生产侧反对千万级流量,数十种业务场景,领有多端多技术类型。欢送前后端、数据、IOS/Android 客户端的小伙伴退出!

简历投递邮箱:geektalk@baidu.com(投递备注【百度教育】)

举荐浏览:

|短视频 go 研发框架实际

|千亿级模型在离线一致性保障计划详解

|从 lowcode 看下一代前端利用框架

———- END ———-

百度 Geek 说

百度官网技术公众号上线啦!

技术干货 · 行业资讯 · 线上沙龙 · 行业大会

招聘信息 · 内推信息 · 技术书籍 · 百度周边

欢送各位同学关注

退出移动版