Nebula Graph 架构(一)
Nebula Graph 由三种服务构成:Graph 服务、Meta 服务和 Storage 服务,是一种存储与计算分离的架构。
Meta 服务
在 Nebula Graph 架构中,Meta 服务是由 nebula-metad 进程提供的,负责数据管理,例如 Schema 操作、集群管 理和用户权限管理等。
leader 和 follower 的数据通过 Raft 协议保持一致,因此 leader 故障和选举新 leader 不会导致数据不一致。
功能点:
管理用户账号
Meta 服务中存储了用户的账号和权限信息,当客户端通过账号发送请求给Meta 服务,Meta 服务会检查账号信息,以及该账号是否有对应的请求权限。
管理分片
Meta 服务负责存储和管理分片的位置信息,并且保证分片的负载均衡。
管理图空间
Nebula Graph 支持多个图空间,不同图空间内的数据是安全隔离的。Meta 服务存储所有图空间的元数据(非完整数据),并跟踪数据的变更,例如增加或删除图空间。
管理 Schema 信息
Nebula Graph 是强类型图数据库,它的 Schema 包括 Tag、Edge type、Tag 属性和 Edge type 属性。
Meta 服务中存储了 Schema 信息,同时还负责 Schema 的添加、修改和删除,并记录它们的版本。
管理基于TTL的数据回收
Meta 服务提供基于 TTL(Time To Live) 的自动数据回收和空间回收。
管理作业
Meta 服务中的作业管理模块负责作业的创建、排队、查询和删除。
Graph服务和Storage服务
Nebula Graph 采用计算存储分离架构。Graph 服务负责处理计算请求,Storage 服务负责存储数据。它们由不同的进程提供,Graph 服务是由 nebula-graphd 进程提供,Storage 服务是由 nebula-storaged 进程提供。
Graph服务
Graph 服务主要负责处理查询请求,包括解析查询语句、校验语句、生成执行计划以及按照执行计划执行四个大步骤。
Parser
Parser 模块收到请求后,通过 Flex(词法分析工具)和 Bison(语法分析工具)生成的词法语法解析器,将语句转换为抽象语法树(AST),在语法解析阶段会拦截不符合语法规则的语句。
Validator
Validator 模块对生成的 AST 进行语义校验,
1、校验元数据信息
2、校验上下文引用信息
3、校验类型推断
4、校验 * 代表的信息
5、校验输入输出
Planner
如果配置文件 nebula-graphd.conf 中 enable_optimizer 设置为 false,Planner 模块不会优化 Validator 模块生成的执行计划,而是直接交给 Executor 模块执行。
如果配置文件 nebula-graphd.conf中enable_optimizer 设置为 true,Planner 模块会对 Validator 模块生成的执行计划进行优化。如下图所示。
优化过程
Planner 模块目前的优化方式是 RBO(rule-based optimization),即预定义优化规则,然后对 Validator 模块生成的默认执行计划进行优化。新的优化规则 CBO(cost-based optimization)正在开发中。优化代码存储在仓库 nebula-graph 的目录 src/optimizer/ 内。
如上图所示,探索到节点 Filter 时,发现依赖的节点是 GetNeighbor,匹配预先定义的规则,就会将 Filter 融入到 GetNeighbor 中,然后移除节点 Filter,继续匹配下一个规则。在执行阶段,当算子 GetNeighbor 调用 Storage 服务的接口获取一个点的邻边时,Storage 服务内部会直接将不符合条件的边过滤掉,这样可以极大地减少传输的数据量,该优化称为过滤下推。
Executor
Executor 模块包含调度器(Scheduler)和执行器(Executor),通过调度器调度执行计划,让执行器根据执行计划生成对应的执行算子,从叶子节点开始执行,直到根节点结束。如下图所示。
代码结构:
Storage 服务
存储包含两个部分,一个是Meta相关的存储,称为Meta服务,在前文已有介绍。
另一个是具体数据相关的存储,称为Storage服务
Storage interface层
Storage服务的上层,定义了一系列和图相关的API。API请求会在这一层被翻译成一组针对分片的KV操作,例如:
getNeighbors:查询一批点的出边或者入边,返回边以及对应的属性,并且支持条件过滤。
insert vertex/edge:插入一条点或者边及其属性。
getProps:获取一个点或者一条边的属性。
正是这一层的存在,使得Storage服务变成了真正的图存储,否则Storage服务只是一个KV存储服务。
Consensus层
Storage服务的中间层,实现了Multi Group Raft,保证强一致性和高可用性。
Store Engine层
Storage服务的底层,是一个单机版本地存储引擎,提供对本地数据的get、put、scan等操作。相关接口存储在KVStore.h和KVEngine.h*文件,用户可以根据业务需求定制开发相关的本地存储插件。
数据存储格式
图存储的主要数据是点和边,Nebula Graph将点和边的信息存储为key,同时将点和边的属性信息存储在value中,以便更高效地使用属性过滤。
相关文章