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

EasyCore是一个单体的架构,数据完整的存储在一个机器上,采用Raft协议将数据复制到多台机器,通过多副本的机制确保数据的安全和可靠。Client通过grpc协议与EasyCore进行通信,提供了图API供Client操作图数据库。
采用这种架构的好处是:
- 组件单一,降低部署和维护的门槛,理论上可以秒级启动一个图数据库
- 采用
Rust开发,整个系统的内存占用低
存储
既然要把数据存储到磁盘,那就需要一个存储引擎。存储引擎的作用是把数据落盘,有组织有格式的存储在磁盘上。
自研一个存储引擎的工作量很大,而且目前开源有不少优秀的存储引擎,因此我们选用了开源的RocksDB作为存储引擎。
RocksDB是Facebook开源的一个Key-Value存储引擎,采用LSM Tree来组织文件,根据Key顺序存储在磁盘上,采用顺序写来替换随机写,极大的提升了写的性能。RocksDB对外提供的API只有简单的Get Put Delete Scan操作。
EasyCore存储的是图相关的结构化数据,RocksDB接收Key-Value数据,因此需要做一层编码转换Struct Data -> Key-Value。
基于Key有序的特性,我们使用以下原则来组织EasyCore的数据:
- 每个模型分配一个
tid,模型的Schema以tid为Key进行存储,即tid->Object Schema - 实例
tid_instanceId->Instance
基于以上原则,也就是每类数据的Key都会包含一个命名空间的前缀,因此能快速查到模型下的实例。
Graph
EasyCore是一个图数据库,需要具备图查询的能力,也就是能够根据一些点、一些边,查询出其所连接的点。
在EasyCore内部,实时维护了一个图结构,添加实例时,会往Graph中存储顶点,添加边时,会局部调整Graph的结构,确保顶点之间的关系是正确的。当需要查询某些边相关的点时,只需要在Graph应用一次Depth first search即可快速查询出结果。
Raft

Raft 是一个强 Leader 的共识算法,只有 Leader 能处理客户端的请求,集群的数据(Log)的流向是从 Leader 流向 Follower。
基于Raft算法,将EasyCore的数据安全的复制到多个节点上,保证了EasyCore是分布式高可用。
Grpc
EasyCore的协议层,采用Grpc协议。这一层,提供了图操作的相关API。
...未完待续