赞
踩
对于有内在联系的事务, 关系型数据库通常会提取实体之间的关系, 将关系单独存储到表或列中,而实体的类型和属性存储在其他列甚至其他表中,这使得数据管理费时费力。如下图中的顾客表、订单表、商品表…此时:
基于此, 图数据库诞生。图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上。
而NebulaGraph 作为一个典型的图数据库,可以将丰富的关系通过边及其类型和属性自然地呈现。
例如雷先生是M公司的CEO, 投资了B公司和C公司, 同时还是D公司的董事会成员, 这些关系都可以直接存放在Nebula Graph中, 构成一个最简单的图模型。
关于Nebula Graph的应用场景有 :
图空间(Space)
:
点(Vertex)
:
边(Edge)
:
标签(Tag)
:
边类型(Edge type)
:
属性(Property)
:
路径即一些边的序列。分为walk、trail、path三种:(图示如下,注意nebula中都是有向边)
walk类的路径,遍历时点和边都可以重复。由此dutor走到Simon家可以:
trail类型的路径遍历时只有点可以重复,边不可重复。此时dutor走到Simon家只能:
trail类型路径中,有两种特殊路径:cycle和circuit,二者的起点和终点一样:
不同的是:cycle只有起点和终点重复,而circuit还存在其他点:
对应在例子中,cycle路径为A–>B–>C–>F–>A
而circuit为:A–>B–>C–>D–>E–>C–>F–>A,两次经过C点
最后:MATCH、FIND PATH和GET SUBGRAPH语句采用的是trail类型路径
path类型的路径遍历时,点和边都不可以重复。此时dutor走到Simon家只能:
如果点是陆地,边是桥,那:
路径长度的有限无限即边的数量有限或者无限。
在一个图空间中,一个点由点的 ID 唯一标识,即 VID 或 Vertex ID。(vertex翻译:顶点)。
定长字符串FIXED_STRING(<N>)或INT64
。一个图空间只能选用其中一种 VID 类型。
VID 相当于一个实体的唯一标号,例如一个人的身份证号。Tag 相当于实体所拥有的类型,例如"滴滴司机"和"老板"。不同的 Tag 又相应定义了两组不同的属性,例如"驾照号、驾龄、接单量、接单小号"和"工号、薪水、债务额度、商务电话"
。
对同一个VID同时INSERT同一个TAG(均无IF NOT EXISTS参数),先写入的TAG被覆盖
对同一个VID同时INSERT,但是两个不同的TAG,则互不影响
VID 的数据类型必须在创建图空间CREATE SPACE时通过参数vid_type定义,且一旦定义无法修改
VID 必须在插入点时设置,且一旦设置无法修改
NebulaGraph 由三种服务构成:Graph 服务、Meta 服务和 Storage 服务,是一种存储与计算分离
的架构。其中:
Meta 服务是由 nebula-metad 进程提供:
架构如下:
nebula-metad 进程中:
Meta服务的功能:
Graph 服务主要负责处理查询请求,包括解析查询语句、校验语句、生成执行计划以及按照执行计划执行四个大步骤。
查询请求到达Graph服务后,依次经过以下模块:
NebulaGraph中,元数据的存储在Meta服务,而具体数据的存储在Storage服务。Storage服务架构:
图存储的主要数据是点和边,NebulaGraph 将点或者边的信息存储为 key
,同时将点或边的属性信息存储在 value
中
点存储:
相比 NebulaGraph 2.x 版本,3.x 版本在开启无 Tag 的点配置后,每个点多了一个不含 TagID 字段并且无 value 的 key
边存储:
以两个点和一条边为例,起点 SrcVertex 通过边 EdgeA 连接目的点 DstVertex,形成路径(SrcVertex)-[EdgeA]->(DstVertex):
两个点和一条边以6个键值对的形式保存在两个分片Partition X和Partition Y中:
符号为正,代表边方向为出
)、Rank(0)、VID(Dst,即点 DstVertex 的 ID)和 PlaceHolder。SerializedValue 即 Value,是序列化的边属性符号为负,代表边方向为入
分布式存储系统通常通过维护多个副本来进行容错,提高系统的可用性。要实现此目标,就必须要解决分布式存储系统的最核心问题:维护多个副本的一致性。
Raft协议的每个副本都会处于三种状态之一:Leader、Follower、Candidate
读写流程:
对于客户端的每个写入请求,Leader 会将该写入以 Raft-wal 的方式,将该条同步给其他 Follower,并只有在“超过半数”副本都成功收到 Raft-wal 后,才会返回客户端该写入成功。对于客户端的每个读取请求,都直接访问 Leader,而 Follower 并不参与读请求服务。
故障场景:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。