Nebula Graph:一个开源的分布式图数据库。做为惟一可以存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不只可以在高并发场景下知足毫秒级的低时延查询要求,还可以实现服务高可用且保障数据安全性。
本篇主要介绍 Nebula Graph 的数据模型和系统架构设计。git
Nebula Graph 采用易理解的有向属性图来建模,也就是说,在逻辑上,图由两种图元素构成:顶点和边。github
在 Nebula Graph 中顶点由标签 tag
和对应 tag
的属性组构成, tag
表明顶点的类型,属性组表明 tag
拥有的一种或多种属性。一个顶点必须至少有一种类型,即标签,也能够有多种类型。每种标签有一组相对应的属性,咱们称之为 schema
。算法
如上图所示,有两种 tag
顶点:player 和 team。player 的 schema
有三种属性 ID
(vid),Name
(sting)和 Age
(int);team 的 schema
有两种属性 ID
(vid)和 Name
(string)。sql
和 Mysql 同样,Nebula Graph 是一种强 schema 的数据库,属性的名称和数据类型都是在数据写入前肯定的。数据库
在 Nebula Graph 中边由类型和边属性构成,而 Nebula Graph 中边均是有向边,有向边代表一个顶点( 起点 src
)指向另外一个顶点( 终点 dst
)的关联关系。此外,在 Nebula Graph 中咱们将边类型称为 edgetype
,每一条边只有一种edgetype
,每种 edgetype
相应定义了这种边上属性的 schema
。缓存
回到上面的图例,图中有两种类型的边,一种为 player 指向 player 的 like 关系,属性为 likeness (double);另外一种为 player 指向 team 的 serve 关系,两个属性分别为 start_year (int) 和 end_year (int)。安全
须要说明的是,起点1 和终点2 之间,能够同时存在多条相同或者不一样类型的边。
因为超大规模关系网络的节点数量高达百亿到千亿,而边的数量更会高达万亿,即便仅存储点和边二者也远大于通常服务器的容量。所以须要有方法将图元素切割,并存储在不一样逻辑分片 partition
上。Nebula Graph 采用边分割的方式,默认的分片策略为哈希散列,partition 数量为静态设置并不可更改。服务器
在 Nebula Graph 中,每一个顶点被建模为一个 key-value
,根据其 vertexID(或简称 vid)哈希散列后,存储到对应的 partition 上。网络
一条逻辑意义上的边,在 Nebula Graph 中将会被建模为两个独立的 key-value
,分别称为 out-key
和 in-key
。out-key 与这条边所对应的起点存储在同一个 partition 上,in-key 与这条边所对应的终点存储在同一个 partition 上。架构
关于数据模型的详细设计会在后续的系列文章中介绍。
Nebula Graph 包括四个主要的功能模块,分别是存储层、元数据服务、计算层和客户端。
在 Nebula Graph 中存储层对应进程是 nebula-storaged
,其核心为基于 Raft(用来管理日志复制的一致性算法) 协议的分布式 Key-valueStorage
。目前支持的主要存储引擎为「Rocksdb」和「HBase」。Raft 协议经过 leader/follower
的方式,来保持数据之间的一致性。Nebula Storage 主要增长了如下功能和优化:
Raft group
。经过多组 Raft group 实现并发操做。throughput
较低。经过批量和乱序提交的方式能够实现更高的吞吐量。leader/follower
拉取数据。当该 learner 追上 leader 后,再标记为 follower,参与 Raft 协议。Metaservice 对应的进程是 nebula-metad
,其主要的功能有:
Goduser
, Admin
, User
, Guest
四种。每种用户的操做权限不一。Schema 管理:Nebula Graph 为强 schema 设计。
time-to-live
字段,支持数据的自动删除和空间回收MetaService 层为有状态的服务,其状态持久化方法与 Storage 层同样经过 KVStore
方式存储。
计算层对应的进程是 nebula-graphd
,它由彻底对等无状态无关联的计算节点组成,计算节点之间相互无通讯。Query Engine 层的主要功能,是解析客户端发送 nGQL 文本,经过词法解析 Lexer
和语法解析 Parser
生成执行计划,并经过优化后将执行计划交由执行引擎,执行引擎经过 MetaService 获取图点和边的 schema,并经过存储引擎层获取点和边的数据。Query Engine 层的主要优化有:
where
等算子会随查询条件一同下发到存储层节点。Nebula Graph 提供 C++、Java、Golang 三种语言的客户端,与服务器之间的通讯方式为 RPC,采用的通讯协议为 Facebook-Thrift。用户也可经过 Linux 上 console 实现对 Nebula Graph 操做。Web 访问方式目前在开发过程当中。
Nebula Graph:一个开源的分布式图数据库。GitHub:https://github.com/vesoft-inc/nebula