暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

NebulaGraph | 燃烧吧,“图”的小宇宙

落风潭 2023-01-06
322

这两年跟踪了一些技术数据库就是其中之一

学习期间产出过两篇文章,篇提及了TigerGraph,另一篇则是关于Neo4j,对当下原生图和分布式均有涉及。

目前,各大云厂商都已经在图数据库市场上做了布局,蚂蚁发布了TuGraph,腾讯则是TGDB。

数据库这个市场越来越诡异,也越来越混乱。

不过,今天潭主打算分享另一个“”产品,NebulaGraph。

为什么要聊NebulaGraph

前些天,潭主听分享了他们的TGDB,感觉又是一通吹。

这边TGDB话音未落,那边微信里就有人跑来跟潭主研Nebula。

知道公司有团队在用这个产品,所以潭主自然不能错过这次NebulaGraph的切磋。

Nebula的中文意思是星云,不由想起了《圣斗士星矢》中瞬的绝技——星云锁链(Nebula Chain)。

接下来,让我们一起燃烧小宇宙吧。

什么是NebualGraph

NebulaGraph是一款开源、分布式、易扩展的原生图数据库,官方说其能够承载千亿个点和万亿条边的超大规模图,并且提供毫秒级查询。

下图是潭主查的最新的图数据库的排名,从国产和专业Graph的角度看,排名还可以。

之前,潭主用最简单的Neo4j Desktop版本帮同事处理过一些关于医疗知识图谱的事,通过实战对Neo4j的Cepher语法有了一定的经验,相比传统SQL还是有些不太一样。

这次学习NebulaGraph,除了产品架构,最大的收获就是增加了对GQL语法的了解。


NebulaGraph的数据模型

通俗讲,图数据库可以看成是由若干个顶点和边组成的图形,用来表示事物之间复杂的关系。

虽说图数据库都是基于图论的实现,产品在概念上也大同小异,但在技术实现细节上还是有很大的差异。

这是潭主看过Nebula之后的第一感觉,至少和Neo4j在使用体验上差别很大。

NebulaGraph用到的6种数据模型:

图空间(Space):类似MySQL的数据库,不同图空间的数据相互隔离,可以设定不同的存储副本数、分片。
  • 点(Vertex):用来保存实体对象,用VID(Vertex ID)标识。
  • 标签(Tag)可以理解成关于点的表结构(Table Schema),由一组事先预定义的属性构成。
  • 边(Edge):边用来连接点,表示两个点之间的关系或行为。
  • 边类型(Edge Type):相对于Vertex的Tag,Edge Type可以理解成边的表模式,也由一组事先定义的属性构成。
  • 属性(Property):以Key-Value形式表示的信息。
关于Nebula概念的特点总结:
  • VID在同一图空间中具有唯一性(类似唯一索引),VID是int64或者fixed_string(N)的类型,需要在创建图空间时进行设定。

  • 点的VID必须由用户自行指定,VID通常被LSM-Tree索引并缓存在内存中,提升效率的同时,也会面临Compaction的问题。

  • 一个Vertex可以有多个Tag。

  • 两个点之间可以有多条边,边是有方向的,边的四元组的特性<起点VID,Edge Type,Edge Rank,终点VID>可用于唯一标识一条边, 

  • 一条边只有一个Type,一条边也只有一个Int64类型、默认值为“0”的Rank。

对于基础数据模型,Nebula的很多操作更贴近MySQL,而不是图,这个印象来自于nGQL。

nGQL(NebulaGraph Query Language)是NebulaGraph使用的声明式图查询语言,属于类SQL查询语言,也兼容部分openCypher语法。

重新理解图的路径

图论中还有一个非常重要的概念叫路径,路径是指一个有限或无限的边序列,这些边连接着一系列的点。

之前学习图数据库,因为不涉及应用开发,所以对于路径的概念不够清晰,这次在Nebula的学习过程中,对路径有了新的认知。

Nebula图路径类型分为三类:

  • Walk路径由有限或无限的边序列构成,遍历时点和边可以重复。

  • Trail路径:由有限的边序列构成。遍历时只有点可以重复,边不可以重复。

  • Path径:由有限的边序列构成,遍历时点和边都不可以重复。


在Trail类型中,还有Cycle和Circuit两种特殊的路径类型:

  • Cycle :是封闭的 trail 类型的路径,遍历时边不可以重复,起点和终点重复,并且没有其他点重复。

  • Circuit:也是封闭的 trail 类型的路径,遍历时边不可以重复,除起点和终点重复外,可能存在其他点重复。

不同的路径支持不同的nGQL语句。

GO语句采用的是walk类型路径,而MATCH、FIND PATH和GET SUBGRAPH语句采用的是trail类型路径。

NebulaGraph的架构

NebulaGraph由三种服务构成:Meta、Graph和Storage,属于存算分离的架,跟TiDB的系统架构很像。

  • Meta服务

元数据的存储和管理,类似TiDB中的Placement Driver,对应nebula-metad进程,基于Raft协议组成集群,用于执行Schema操作、存储和管理数据信息分片信息、用户权限等集群管理工作。

  • Graph服务

计算引擎,对应nebula-graphd进程,负责语法语义的解析和执行,无状态、可扩展。对应TiDB中的TiDB模块。

  • Storage服务


存储引擎,对应nebula-storaged进程,对应TiDB中的TiKV,Storage服务自身也分三层。


  • 存储接口层( Interface):定义了一系列和图相关的 API,API请求在这一层被翻译成一组针对分片的K-V操作。

  • 存储共识层(Consensus):通过Raft协议确保数据的一致性和可靠性,

  • 存储引擎层(Engine):使用的RockDB存储K-V。


NebulaGraph的生态体系


NebulaGraph有一众生态工具,如Studio、Dashboard、Explorer、Console、Importer和Exchange,用于实现模式设计、运维监控、数据探查、控制台操作和数据交换 等功能

此外,NebulaGraph也能与Spark、Flink和HBase等产品进行集成。

潭主挑了几个组件试用了一下,对产品有了一个简单直观的感受。

试用NebulaGraph的几点感受

潭主搭了一个Nebula的测试环境,体验了7001的Studio,7002的Explorer和7003的Dashboard。

分享一下测试后的几点感受:

产品组件过于零散,很多工具需要单独安装和部署,略显费劲,不过对了解产品有一定的帮助。

Nebula跟Neo4j在使用上有一定的差别,之前做OMAHA医疗知识图谱的经验在Nebula上大多不适用,只能边学边适应。

Nebula的Import工具,虽然Web界面有一定的便捷性,但感觉不如Neo4j的load命令行来得简单。

过程中也踩了几个坑,不过售前技术支持的同学比较给力,帮潭主答疑解惑,总体而言,本次Nebula的学习实践还是挺有收获的。

在Nebula上还有一些后续测试,之后也还有其他图数据库的PoC,等有了心得再做分享

- END -

感谢阅读。如果觉得写得还不错,就请点个赞或“在看”吧。


  • 公众号所有文章仅代表个人观点,与供职单位无关。


文章转载自落风潭,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论