Nebula Graph 是一个高性能的分布式开源图数据库,本文为你们介绍 Nebula Graph 的总体架构。git
一个完整的 Nebula 部署集群包含三个服务,即 Query Service,Storage Service 和 Meta Service。每一个服务都有其各自的可执行二进制文件,这些二进制文件既能够部署在同一组节点上,也能够部署在不一样的节点上。github
上图为 Nebula Graph 的架构图,其右侧为 Meta Service 集群,它采用 leader / follower 架构。Leader 由集群中全部的 Meta Service 节点选出,而后对外提供服务。Followers 处于待命状态并从 leader 复制更新的数据。一旦 leader 节点 down 掉,会再选举其中一个 follower 成为新的 leader。数据库
Meta Service 不只负责存储和提供图数据的 meta 信息,如 schema、partition 信息等,还同时负责指挥数据迁移及 leader 的变动等运维操做。微信
在架构图中 Meta Service 的左侧,为 Nebula Graph 的主要服务,Nebula 采用存储与计算分离的架构,虚线以上为计算,如下为存储。架构
存储计算分离有诸多优点,最直接的优点就是,计算层和存储层能够根据各自的状况弹性扩容、缩容。负载均衡
存储计算分离还带来的另外一个优点:使水平扩展成为可能。框架
此外,存储计算分离使得 Storage Service 能够为多种类型的个计算层或者计算引擎提供服务。当前 Query Service 是一个高优先级的计算层,而各类迭代计算框架会是另一个计算层。运维
如今咱们来看下计算层,每一个计算节点都运行着一个无状态的查询计算引擎,而节点彼此间无任何通讯关系。计算节点仅从 Meta Service 读取 meta 信息,以及和 Storage Service 进行交互。这样设计使得计算层集群更容易使用 K8s 管理或部署在云上。分布式
计算层的负载均衡有两种形式,最多见的方式是在计算层上加一个负载均衡(balance),第二种方法是将计算层全部节点的 IP 地址配置在客户端中,这样客户端能够随机选取计算节点进行链接。函数
每一个查询计算引擎都能接收客户端的请求,解析查询语句,生成抽象语法树(AST)并将 AST 传递给执行计划器和优化器,最后再交由执行器执行。
Storage Service 采用 shared-nothing 的分布式架构设计,每一个存储节点都有多个本地 KV 存储实例做为物理存储。Nebula 采用多数派协议 Raft 来保证这些 KV 存储之间的一致性(因为 Raft 比 Paxo 更简洁,咱们选用了 Raft )。在 KVStore 之上是图语义层,用于将图操做转换为下层 KV 操做。
图数据(点和边)是经过 Hash 的方式存储在不一样 Partition 中。这里用的 Hash 函数实现很直接,即 vertex_id 取余 Partition 数。在 Nebula Graph 中,Partition 表示一个虚拟的数据集,这些 Partition 分布在全部的存储节点,分布信息存储在 Meta Service 中(所以全部的存储节点和计算节点都能获取到这个分布信息)。
Nebula Graph GitHub 地址:github.com/vesoft-inc/… ,加入 Nebula Graph 交流群,请联系 Nebula Graph 官方小助手微信号:NebulaGraphbot
Nebula Graph:一个开源的分布式图数据库。
GitHub:github.com/vesoft-inc/…