图数据库 Nebula Graph 的数据模型和系统架构设计
Nebula Graph:一个开源的分布式图数据库。作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的服务可用性和数据安全性。
本篇主要介绍 Nebula Graph 的数据模型和系统架构设计。
有向属性图 DirectedPropertyGraph
Nebula Graph 采用易理解的有向属性图来建模,也就是说,在逻辑上,图由两种图元素构成:顶点和边。
有向属性图
顶点 Vertex
在 Nebula Graph 中顶点由标签 tag
和对应 tag
的属性组构成, tag
代表顶点的类型,属性组代表 tag
拥有的一种或多种属性。一个顶点必须至少有一种类型,即标签,也可以有多种类型。每种标签有一组相对应的属性,我们称之为 schema
。
如上图所示,有两种 tag
顶点:player 和 team。player 的 schema
有三种属性 ID
(vid),Name
(sting)和 Age
(int);team 的 schema
有两种属性 ID
(vid)和 Name
(string)。
和 Mysql 一样,Nebula Graph 是一种强 schema 的数据库,属性的名称和数据类型都是在数据写入前确定的。
边 Edge
在 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)。
Tips:需要说明的是,起点1 和终点2 之间,可以同时存在多条相同或者不同类型的边。
图分割 GraphPartition
由于超大规模关系网络的节点数量高达百亿到千亿,而边的数量更会高达万亿,即使仅存储点和边两者也远大于一般服务器的容量。因此需要有方法将图元素切割,并存储在不同逻辑分片 partition
上。Nebula Graph 采用边分割的方式,默认的分片策略为哈希散列,partition 数量为静态设置并不可更改。
图分割示意图
数据模型 DataModel
在 Nebula Graph 中,每个顶点被建模为一个 key-value
,根据其 vertexID(或简称 vid)哈希散列后,存储到对应的 partition 上。
key-value 示意图
一条逻辑意义上的边,在 Nebula Graph 中将会被建模为两个独立的 key-value
,分别称为 out-key
和 in-key
。out-key 与这条边所对应的起点存储在同一个 partition 上,in-key 与这条边所对应的终点存储在同一个 partition 上。
Out-key & In-key 示意图
关于数据模型的详细设计会在后续的系列文章中介绍。
系统架构 Architecture
Nebula Graph 包括四个主要的功能模块,分别是存储层、元数据服务、计算层和客户端。
Nebula Graph 架构图
存储层 Storage
在 Nebula Graph 中存储层对应进程是 nebula-storaged
,其核心为基于 Raft(用来管理日志复制的一致性算法) 协议的分布式 Key-valueStorage
。
目前支持的主要存储引擎为「Rocksdb」和「HBase」。
Raft 协议通过 leader/follower
的方式,来保持数据之间的一致性。Nebula Storage 主要增加了以下功能和优化:
- Parallel Raft:允许多台机器上的相同 partiton-id 组成一个
Raft group
。通过多组 Raft group 实现并发操作。 - Write Path & batch:Raft 协议的多机器间同步依赖于日志 id 顺序性,这样的吞吐量
throughput
较低。通过批量和乱序提交的方式可以实现更高的吞吐量。 - Learner:基于异步复制的 learner。当集群中增加新的机器时,可以将其先标记为 learner,并异步从
leader/follower
拉取数据。当该 learner 追上 leader 后,再标记为 follower,参与 Raft 协议。 - Load-balance:对于部分访问压力较大的机器,将其所服务的 partition 迁移到较冷的机器上,以实现更好的负载均衡。
KV 存储架构图
元数据服务层 Metaservice
Metaservice 对应的进程是 nebula-metad
,其主要的功能有:
- 用户管理:Nebula Graph 的用户体系包括
Goduser
,Admin
,User
,Guest
四种。每种用户的操作权限不一。 - 集群配置管理:支持上线、下线新的服务器。
- 图空间管理:增持增加、删除图空间,修改图空间配置(Raft副本数)
- Schema 管理:Nebula Graph 为强 schema 设计。
- 通过 Metaservice 记录 Tag 和 Edge 的属性的各字段的类型。支持的类型有:整型 int, 双精度类型 double, 时间数据类型 timestamp, 列表类型 list等;
- 多版本管理,支持增加、修改和删除 schema,并记录其版本号
- TTL 管理,通过标识到期回收
time-to-live
字段,支持数据的自动删除和空间回收
MetaService 层为有状态的服务,其状态持久化方法与 Storage 层一样通过 KVStore
方式存储。
元数据服务架构图
计算层 Query Engine & Query Language(nGQL)
计算层对应的进程是 nebula-graphd
,它由完全对等无状态无关联的计算节点组成,计算节点之间相互无通信。
Query Engine 层的主要功能,是解析客户端发送 nGQL 文本,通过词法解析 Lexer
和语法解析 Parser
生成执行计划,并通过优化后将执行计划交由执行引擎,执行引擎通过 MetaService 获取图点和边的 schema,并通过存储引擎层获取点和边的数据。
Query Engine 层的主要优化有:
- 异步和并发执行:由于 IO 和网络均为长时延操作,需采用异步及并发操作。此外,为避免单个长 query 影响后续 query,Query Engine 为每个 query 设置单独的资源池以保证服务质量 QoS。
- 计算下沉:为避免存储层将过多数据回传到计算层占用宝贵的带宽,条件过滤
where
等算子会随查询条件一同下发到存储层节点。 - 执行计划优化:虽然在关系数据库 SQL 中执行计划优化已经经历了长时间的发展,但业界对图查询语言的优化研究较少。Nebula Graph 对图查询的执行计划优化进行了一定的探索,包括执行计划缓存和上下文无关语句并发执行。
计算层架构图
客户端 API & Console
Nebula Graph 提供 C++、Java、Golang 三种语言的客户端,与服务器之间的通信方式为 RPC,采用的通信协议为 Facebook-Thrift。用户也可通过 Linux 上 console 实现对 Nebula Graph 操作。Web 访问方式目前在开发过程中。
图数据库 Nebula Graph 的数据模型和系统架构设计的更多相关文章
- 分布式图数据库 Nebula Graph 中的集群快照实践
1 概述 1.1 需求背景 图数据库 Nebula Graph 在生产环境中将拥有庞大的数据量和高频率的业务处理,在实际的运行中将不可避免的发生人为的.硬件或业务处理错误的问题,某些严重错误将导致集群 ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...
- 图数据库 Nebula Graph TTL 特性
导读 身处在现在这个大数据时代,我们处理的数据量需以 TB.PB, 甚至 EB 来计算,怎么处理庞大的数据集是从事数据库领域人员的共同问题.解决这个问题的核心在于,数据库中存储的数据是否都是有效的.有 ...
- 初识分布式图数据库 Nebula Graph 2.0 Query Engine
摘要:本文主要介绍 Query 层的整体结构,并通过一条 nGQL 语句来介绍其通过 Query 层的四个主要模块的流程. 一.概述 分布式图数据库 Nebula Graph 2.0 版本相比 1.0 ...
- 图数据库 Nebula Graph 的安装部署
Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,还能够实现服务高可 ...
- 图数据库 Nebula Graph 是什么
图数据库(英语:Graph Database)是一个使用图结构进行语义查询的数据库.该系统的关键概念是图,形式上是点 (Node 或者 Vertex) 和边 (Edge 或者 Relationship ...
- GraphX 在图数据库 Nebula Graph 的图计算实践
不同来源的异构数据间存在着千丝万缕的关联,这种数据之间隐藏的关联关系和网络结构特性对于数据分析至关重要,图计算就是以图作为数据模型来表达问题并予以解决的过程. 一.背景 随着网络信息技术的飞速发展,数 ...
- 图数据库 Nebula Graph 在 Boss 直聘的应用
本文首发于 Nebula Graph 官方博客:https://nebula-graph.com.cn/posts/nebula-graph-risk-control-boss-zhipin/ 摘要: ...
- COSCon'19 | 如何设计新一代的图数据库 Nebula
11 月 2 号 - 11 月 3 号,以"大爱无疆,开源无界"为主题的 2019 中国开源年会(COSCon'19)正式启动,大会以开源治理.国际接轨.社区发展和开源项目为切入点 ...
随机推荐
- 2017-10271weblogic漏洞exp测试及补丁测试
靶机:weblogic12.1.3.0 战斗机:kali 导弹:burpsuite 1.首先开启kali某端口监听 2.向靶机发送exp 3.查看kali监听 打码保平安~~ 4.打上补丁 5.验证补 ...
- C语言 结构体字节对齐问题
摘选自这位大神的博客 方法一: 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐. 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员, ...
- Android生成随机数
此方法通过把当前时刻长整型数传给Random对象,让它产生的值随着时间而变化. String s = ""; Random ran =new Random(System.curre ...
- linux初学者-进程篇
linux初学者-进程篇 不管是windows还是linux,都有进程,那么什么是进程呢?进程就是cpu未完成的工作.下面会介绍一些关于系统中进程的查看以及管理的方法. 1.命令 1.1.命令使用 查 ...
- jProfiler远程连接Linux监控jvm、tomcat运行状态
第一步.下载软件 官网地址:https://www.ej-technologies.com/download/jprofiler/files , Mac客户端 GUI界面 Linux服务端 第二步.安 ...
- 图像相似度中的Hash算法
度量两张图片的相似度有许多算法,本文讲介绍工程领域中最常用的图片相似度算法之一--Hash算法.Hash算法准确的说有三种,分别为平均哈希算法(aHash).感知哈希算法你(pHash) ...
- husky+ prettier + commitlint 提交前代码检查和提交信息规范
一.安装相关的包 npm install -D husky npm install -D lint-staged // lint钩子 npm install -D prettiernpm instal ...
- 基于V2EX API的nodejs组件.
今天又学习到了新的知(zi)识(shi),来给自己做个笔录,也算在这酷热的天气里给自己写了一篇降温的‘膏药’,话就讲这么多了 ,start off...... 首先 ,依赖选择: /**设置为严格模式 ...
- GGPLOT2-plotly |让你的火山图“活”过来
火山图(Volcano Plot)常用于展示基因表达差异的分布,横坐标常为Fold change(倍数),越偏离中心差异倍数越大;纵坐标为P值(P值),值越大差异越显着.原因得名也许的英文因为查询查询 ...
- python:函数可以返回值--编写脚本计算24 + 34 / 100 - 1023
1.脚本 def add(a,b): return (a+b)def div(a,b,c): return (a/b-c)x = div(34,100,1023)y = add(24,x) ...