目录
产品简介
kgraph 是快手研发的一款分布式图数据库产品,于2019年底开始调研开发。
kgraph 设计目标
- 高性能,目标是单机千万qps;
- 为了解决内存加载数据耗时长的问题,我们需要一个持久化存储引擎;
- 为了解决本地内存数据容量不足的问题,性能和数据量支持线性扩容。
kgraph 产品架构
整个系统可以分为三层,kv存储层,图逻辑层,以及计算层。
三层是相互独立的,可以分别实现水平拓展,如果存储的数据比较多,可以线性拓展kv存储层;如果计算任务较重,可以线性拓展计算层。
对于kv存储层,kgraph使用了高性能rpc框架krpc和intel的新硬件pmem,实现了极致的单机性能;
对于图逻辑层,主要是对点和边的定义,也就是如何将点和边转化成kv;包括实现了点和边的增删查改等基本接口;
对于图计算层,主要设计到两个模块:
-
第一个graphserver,它的定位第一个是proxy,用户可以通过grpc或者krpc访问,第二个定位是一些图算法的实现,比如topn算法;
-
第二个是gremlinserver,它的定位是gremlin语言的计算层,他的存储后端依赖kgraph存储集群,多个gremlinserver组成了gremlin分布式集群。
kv存储层
对于kv存储层,集群包含三种角色:client,master和datanode。
数据根据client定义的分shard算法,存储在datanode的各个shard当中,由datanode服务读写。
master主要有以下几个作用:
- 维护机器的状态;
- shard调度:包括机器宕机时的failover,添加机器时shard迁移;
- 维护shard的路由信息。
对于一般的的读写流程,client向master请求路由并缓存在本地,根据client端定义的分区算法,把图相关的数据转化成kv对,通过krpc协议写对应的datanode。
数据模型
kgraph基于有向异构属性图建模,如上图右侧,一个代表人的节点指向了代表视频的节点,边类型是点赞。
有向图,指的是边是有方向的,一个点的边可以分为出边和入边,出边入边分别存储;异构图,指的是允许存在多种类型的点和边,比如用户和视频分属两种不同的类型;属性图,可以理解为点和边上的键值对,比如用户具有年龄,性别等属性。
对于点的建模如下,有以下几个字段:uint64_t的id或者string类型的用户自定义id;string类型的代表类型的type,由id或者自定义id type唯一代表一个点;属性,也就是键值对。
对于边:有确定的起点和终点;string类型的代表类型的type,由起点 终点 type唯一代表一条边;属性。
kgraph和table上的数据对比如图,database和graph对应,一个type对应一个table,一个点或者边对应一个row,属性指的是column。
使用方式
对于kgraph的使用方式:
- 可以通过c java sdk访问,他的形态类似上图右侧;
- 可以通过grpc访问;
- 可以访问gremlin server。
kgraph支持gremlin查询语言,其一是gremlin的生态比较完备,gremlin生态的工具,都可以进行迁移使用;其二他是一种函数调用式的查询语言,学习成本比较低,能够很好表达复杂的查询,表达力比sdk 或者 grpc更好。
我们可以简单看两个gremlin的例子,如右下图:第一个查询语句是对于666节点出边指向的点,其中类型是people的所有点;第二个查询语句是666号关注的所有视频主的粉丝群体,这些粉丝群体关注的女视频主按照重合度排序取前10个。
所属公司
北京快手科技有限公司