如何设计图数据库Nebula Graph的数据模型和系统架构
下面主要介绍Nebula Graph的数据模型和系统架构设计。
DirectedPropertyGraph
Nebula Graph 采用易于理解的有向属性图来建模,也就是说,从逻辑上讲,图是由顶点和边两个图元素组成。
Vertex Vertex
在 Nebula Graph 中,顶点由标签 tag
和 tag 对应的属性
组成 code>组组成,tag
表示顶点的类型,属性组表示tag
拥有的一个或多个属性。顶点必须至少有一种类型,即标签,但也可以有多种类型。每个标签都有一个对应的集合f 属性,我们称之为schema
。
如上图所示,有两个tag
顶点:玩家和队伍。玩家的schema
具有三个属性:ID
(vid)、Name
(sting)和Age
(int); team schema
有两个属性 ID
(vid) 和 Name
(string)。
与Mysql一样,Nebula Graph是一个强模式数据库,属性的名称和数据类型在数据写入之前就确定了。
边
在Nebula Graph中,边由类型和边属性组成,Nebula Graph中的边都是有向边,有向边表示一个顶点(起点 src
)指向另一个顶点(端点dst
)的关联。另外,在 Nebula Graph 中我们将边类型称为 edgetype
。每条边只有一个edgetype
。每个edgetype
都相应地定义了这一点。 架构
边缘属性。
回到上面的图例,图中的边有两种类型,一种是player指向player的like关系,属性是likeness(double);另一种是player指向player的like关系,属性是likeness(double);另一个是球员指向球队的发球关系,两个属性是start_year(int)和end_year(int)。
需要注意的是,起点1和终点2之间可以同时存在多条相同或不同类型的边。
图划分
由于超大规模关系网络的节点数量达到数百亿到数千亿,边数达到万亿,即使只存储积分 Bian 和 Bian 也比普通服务器的容量大得多。因此,需要有一种方法来切割图元素并将它们存储在不同的逻辑片partition
上。 Nebula Graph 采用边划分。默认分片策略是哈希,分区数量是静态设置的,不能改变。
数据模型DataModel
在 Nebula Graph 中,每个顶点都被建模为一个key-value
,根据其顶点 ID (或简称vid)被哈希并存储在相应的分区中。
一条逻辑边在 Nebula Graph 中会被建模为两个独立的key-value
,分别称为 out-key
和键内
。 out-key对应这条边的点存储在同一个分区中,in-key和这条边对应的结束点存储在同一个分区中。
系统架构架构
Nebula Graph包括四个主要功能模块,分别是存储层、元数据服务、计算层和客户端。
存储层Storage
在Nebula Graph中,存储层对应的流程是nebula-storged
,其核心基于Raft(共识算法用于管理日志复制的算法)协议的分布式 Key-valueStorage 。目前支持的主要存储引擎有“Rocksdb”和“HBase”。 Raft协议使用leader/follower
来维护数据之间的一致性。 Nebula Storage主要增加了以下功能和优化:
并行Raft:允许多台机器上相同的partiton-id组成一个Raft组
。通过多个Raft Group实现并发操作。
Write Path & Batch:Raft协议的多台机器之间的同步依赖于日志id的顺序,因此吞吐量throughput
较低。通过批量和无序提交可以实现更高的吞吐量。
Learner:基于异步复制的学习器。当一台新机器添加到集群中时,可以先将其标记为学习者,然后从leader/follower
异步拉取数据。当学习者追上领导者时,就很重要了被视为追随者并参与 Raft 协议。
负载均衡:对于一些访问压力较大的机器,将其服务的分区迁移到温度较低的机器上,以实现更好的负载均衡。
元数据服务层Metaservice
Metaservice对应的进程为nebula-metad
,其主要功能为:
用户管理:Nebula Graph 的用户系统包括 Goduser
、Admin
、User
、Guest
四种类型。每个用户有不同的操作权限。
集群配置管理:支持在线和离线新建服务器。
图空间管理:添加、删除图空间、修改图空间配置(Raft 副本数量)
Schema 管理:Nebula Graph 是为强 Schema 设计的。
通过Metaservice记录Tag和Edge属性各个字段的类型。支持的类型包括:整数类型、双精度类型double、时间数据类型timestamp、list类型列表等;
多版本管理,支持添加、修改、删除schema,并记录其版本号
p>
TTL管理支持自动通过识别过期和回收生存时间
字段来删除数据和空间回收
MetaService 层是一个有状态服务。其状态持久化方式与Storage层相同,通过KVStore
进行存储。
计算层查询引擎&查询语言(nGQL)
计算层对应的流程为nebula-graphd
,它是由完全点对点、无状态、互不相关的计算节点组成,计算节点之间没有通信。 **Query Engine**层的主要功能是解析客户端发送过来的nGQL文本,通过词法解析Lexer
和语法解析Parser
生成执行计划,并优化它的执行on plan交给执行引擎,执行引擎通过MetaService获取图点和边的schema,并通过存储引擎层获取点和边数据。 Query Engine层主要优化有:
异步并发执行:由于IO和网络都是长延时操作,所以要进行操作,就需要异步并发操作。另外,为了防止单个长查询影响后续查询,查询引擎为每个查询设置了单独的资源池,以保证服务质量QoS。焦作市中医胃肠医院:https://www.jianshu.com/p/b8966d1a468e
计算下沉:为了避免存储层向计算层传回过多的数据,占用宝贵的带宽、条件过滤 where
等运算符会与查询条件一起发送到存储层节点。
执行计划优化:A虽然关系数据库SQL中的执行计划优化经历了较长时期的发展,但业界对于图查询语言的优化研究较少。 Nebula Graph 对图查询的执行计划优化做了一些探索,包括执行计划缓存和上下文无关语句的并发执行。
客户端API和控制台
Nebula Graph提供C++、Java、Golang三种语言的客户端。与服务器的通信方式是RPC。 ,采用的通信协议是Facebook-Thrift。用户还可以在Linux上通过控制台操作Nebula Graph。 Web 访问目前正在开发中。
以上内容是如何设计图数据库Nebula Graph的数据模型和系统架构。你学到了知识或技能了吗?如果您想学习更多技能或丰富自己的知识库,请关注行业资讯渠道。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何设计图数据库Nebula Graph的数据模型和系统架构