用户您好!请先登录!

图数据库 Nebula Graph简介

图数据库 Nebula Graph简介

Nebula Graph:一个开源的分布式图数据库。作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,还能够实现服务高可用且保障数据安全性。

简介

Nebula Graph 是开源的第三代分布式图数据库,不仅能够存储万亿个带属性的节点和边,而且还能在高并发场景下满足毫秒级的低时延查询要求。不同于 Gremlin 和 Cypher,Nebula 提供了一种 SQL-LIKE 的查询语言 nGQL,通过三种组合方式(管道、分号和变量)完成对图的 CRUD 的操作。在存储层 Nebula Graph 目前支持 RocksDB 和 HBase 两种方式。

Nebula Graph 整体架构

图数据库 Nebula Graph 的安装部署

Nebula Graph 主要有三个服务进程:

Meta Service

Metaservice 对应的进程是 nebula-metad ,MetaService 层为有状态的服务,其状态持久化方法与 Storage 层一样通过 KVStore 方式存储。其主要的功能有:

  • 用户管理:Nebula Graph 的用户体系包括 Goduser , Admin , User , Guest  四种。每种用户的操作权限不一。
  • 集群配置管理:支持上线、下线新的服务器。
  • 图空间管理:增持增加、删除图空间,修改图空间配置(Raft副本数)
  • Schema 管理:Nebula Graph 为强 schema 设计。
  • 通过 Metaservice 记录 Tag 和 Edge 的属性的各字段的类型。支持的类型有:整型 int, 双精度类型 double, 时间数据类型 timestamp, 列表类型 list等;
  • 多版本管理,支持增加、修改和删除 schema,并记录其版本号
  • TTL 管理,通过标识到期回收 time-to-live 字段,支持数据的自动删除和空间回收

Storage Service

图数据库 Nebula Graph 的安装部署

在 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 迁移到较冷的机器上,以实现更好的负载均衡

Graph Service

Graph Service 位于架构中的计算层,负责同 Console 等 Client 通信,解析 nGQL 的请求并生成执行计划。执行计划经过优化器优化之后,交与执行引擎执行。执行引擎会向 MetaService 请求点边的 Schema 和向存储引擎获取点边的数据。

计算层对应的进程是 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 的最好方式是通过 Docker 容器运行,参照文档拉取镜像,并进入容器:

 $ docker pull vesoft/nebula-graph:latest
 $ docker run --rm -ti vesoft/nebula-graph:latest bash

进入容器之后首先启动 Nebula 的所有 Services,再通过 Console 客户端连接本容器内部的 graphd 服务来执行 nGQL 语句

 $ cd /usr/local/nebula
 $ ./scripts/nebula.service start all
 $ ./bin/nebula -u user -p password
 (user@127.0.0.1) [(none)]> SHOW HOSTS;
 ===============================
 | Ip | Port | Status |
 ===============================
 | 172.17.0.2 | 44500 | online |
 -------------------------------
 Got 1 rows (Time spent: 15621/16775 us)

集群部署

环境准备

Nebula 支持编译安装和通过打包好的 Package 安装。由于 Nebula 依赖较多,简便起见推荐使用安装包安装。

本文准备了 3 台装有 CentOS 7.5 系统的机器,IP 如下所示:

 192.168.8.14 # cluster-14
 192.168.8.15 # cluster-15
 192.168.8.16 # cluster-16

在每台机器上下载对应的安装包:

 $ wget -O nebula-1.0.0-beta.el7-5.x86_64.rpm https://github.com/vesoft-inc/nebula/releases/download/v1.0.0-beta/nebula-1.0.0-beta.el7-5.x86_64.rpm

此外由于 Nebula 的服务之间通信需要开放一些端口,所以可以临时关掉所有机器上的防火墙: (具体使用端口见 /usr/local/nebula/etc/ 下面的配置文件)

 $ systemctl disable firewalld

本文将按如下的方式部署 Nebula 的集群:

 - cluster-14: metad/storaged/graphd
 - cluster-15: metad/storaged
 - cluster-16: metad/storaged
安装

使用 rpm 安装上步准备好的安装包

 $ rpm -ivh nebula-*.rpm

Nebula 默认的安装目录位于 /usr/local/nebula

配置

Nebula 的所有配置文件都位于 /usr/local/nebula/etc 目录下,并且提供了三份默认配置。分别编辑这些配置文件:

第一份配置文件:nebula-metad.conf

metad 通过 raft 协议保证高可用,需要为每个 metad 的 service 都配置该服务部署的机器 ip 和端口。主要涉及 meta_server_addrs 和 local_ip 两个字段,其他使用默认配置。 cluster-14 上的两项配置示例如下所示:

 # Peers
 --meta_server_addrs=192.168.8.14:45500,192.168.8.15:45500,192.168.8.16:45500
 # Local ip
 --local_ip=192.168.8.14
 # Meta daemon listening port
 --port=45500

第二份配置文件:nebula-graphd.conf

graphd 运行时需要从 metad 中获取 schema 数据,所以在配置中必须显示指定集群中 metad 的 ip 地址和端口选项 meta_server_addrs ,其他使用默认配置。 cluster-14 上的 graphd 配置如下:

 # Meta Server Address
 --meta_server_addrs=192.168.8.14:45500,192.168.8.15:45500,192.168.8.16:45500

第三份配置文件:nebula-storaged.conf

storaged 也是使用的 raft 协议保证高可用,在数据迁移时会与 metad 通信,所以需要配置 metad 的地址和端口 meta_server_addrs 和本机地址 local_ip ,其 peers 可以通过 metad 获得。 cluster-14 上的部分配置选项如下:

 # Meta server address
 --meta_server_addrs=192.168.8.14:45500,192.168.8.15:45500,192.168.8.16:45500
 # Local ip
 --local_ip=192.168.8.14
 # Storage daemon listening port
 --port=44500
启动集群

cluster-14

 $ /usr/local/nebula/scripts/nebula.service start all
 [INFO] Starting nebula-metad...
 [INFO] Done
 [INFO] Starting nebula-graphd...
 [INFO] Done
 [INFO] Starting nebula-storaged...
 [INFO] Done

cluster-15/cluster-16

 $ /usr/local/nebula/scripts/nebula.service start metad
 [INFO] Starting nebula-metad...
 [INFO] Done
 $ /usr/local/nebula/scripts/nebula.service start storaged
 [INFO] Starting nebula-storaged...
 [INFO] Done

注:部分用户可能会遇到

 [WARN] The maximum files allowed to open might be too few: 1024

可以自己修改 /etc/security/limits.conf

测试集群

登陆集群中的一台,执行如下命令:

 $ /usr/local/nebula/bin/nebula -u user -p password --addr 192.168.8.14 --port 3699
 (user@192.168.8.14) [(none)]> SHOW HOSTS;
 ==================================
 | Ip | Port | Status |
 ==================================
 | 192.168.8.14 | 44500 | offline |
 ----------------------------------
 Got 1 rows (Time spent: 3511/4024 us)

附录

Nebula Graph:一个开源的分布式图数据库。GitHub:https://github.com/vesoft-inc/nebula

X-Eyes Admin
X-Eyes Admin

要发表评论,您必须先登录