Skip to main content

EasyCore 介绍

EasyCore 是一个图数据库,具备一致性、高可用、内存占用小等特点。接下来,一步步解开EasyCore的面纱。

架构

architecture

EasyCore是一个单体的架构,数据完整的存储在一个机器上,采用Raft协议将数据复制到多台机器,通过多副本的机制确保数据的安全和可靠。Client通过grpc协议与EasyCore进行通信,提供了图APIClient操作图数据库。

采用这种架构的好处是:

  • 组件单一,降低部署和维护的门槛,理论上可以秒级启动一个图数据库
  • 采用Rust开发,整个系统的内存占用低

存储

既然要把数据存储到磁盘,那就需要一个存储引擎。存储引擎的作用是把数据落盘,有组织有格式的存储在磁盘上。

自研一个存储引擎的工作量很大,而且目前开源有不少优秀的存储引擎,因此我们选用了开源的RocksDB作为存储引擎。

RocksDBFacebook开源的一个Key-Value存储引擎,采用LSM Tree来组织文件,根据Key顺序存储在磁盘上,采用顺序写来替换随机写,极大的提升了写的性能。RocksDB对外提供的API只有简单的Get Put Delete Scan操作。

EasyCore存储的是图相关的结构化数据,RocksDB接收Key-Value数据,因此需要做一层编码转换Struct Data -> Key-Value

基于Key有序的特性,我们使用以下原则来组织EasyCore的数据:

  • 每个模型分配一个tid,模型的SchematidKey进行存储,即tid -> Object Schema
  • 实例tid_instanceId -> Instance

基于以上原则,也就是每类数据的Key都会包含一个命名空间的前缀,因此能快速查到模型下的实例。

Graph

EasyCore是一个图数据库,需要具备图查询的能力,也就是能够根据一些点、一些边,查询出其所连接的点。

EasyCore内部,实时维护了一个图结构,添加实例时,会往Graph中存储顶点,添加边时,会局部调整Graph的结构,确保顶点之间的关系是正确的。当需要查询某些边相关的点时,只需要在Graph应用一次Depth first search即可快速查询出结果。

Raft

raft

Raft 是一个强 Leader 的共识算法,只有 Leader 能处理客户端的请求,集群的数据(Log)的流向是从 Leader 流向 Follower

基于Raft算法,将EasyCore的数据安全的复制到多个节点上,保证了EasyCore是分布式高可用。

Grpc

EasyCore的协议层,采用Grpc协议。这一层,提供了图操作的相关API

...未完待续