随着图技术的不断成熟,与大数据框架的融合也越来越紧密,使得使用图的场景也越来越广泛;安全领域里很多的场景也开始用图的相关技术来解决实际问题;如云安全中心利用图对关联关系的遍历能力,实现了基于进程链的安全检测, 更大程度的检测隐藏在正常操作背后的恶意行文, 为用户的主机保驾护航;同时基于多种数据的关联关系,可以实现安全事件的调查分析、溯源等;基于图来分析解决安全问题更符合现实场景,也更容易被人理解和接受;
但是由于图数据库需要庞大的图存储、图计算的资源, 因此在专有云场景下,直接使用传统的图数据库或者图计算引擎,会给客户带来巨大的资源压力;目前公有云上的基于图的安全检测、时间调查以及溯源功能,在专有云上是缺失的,而这部分功能对于安全能力又提升明显,时间调查、溯源能力在护网场景下可以很大提升客户分析处理问题的效率;所以图技术落地专有云已经迫在眉睫;
为了能够将图的能力应用在专有云的安全场景下,我们需要解决三个问题,图数据的存储问题,图计算问题以及定时任务的执行问题,解决了这三个问题,就可以将图在专有云的安全场景上落地,解决专有云的安全问题;
上图为Seraphdb的结构; 作为一个开放的图引擎, 首先在存储层,我们适配了大多数的存储介质,比如ES等文档型的存储,RDS/MYSQL等关系型存储以及RocksDB等KV型的存储,这样用户可以基于现有的存储资源来实现图的能力;
Reader/Model
Reader层提供统一的接口,向下对接底层数据存储,向上提供数据存储的基本操作,实现图存储对于图操作的透明;而Model层则作为图引擎与底层数据存储的枢纽,将图的基本操作如节点和边的CRUD,图的遍历等以及图的复杂算法如最短路径等转为Reader的操作;Reader层与Model层的结合,让seraphdb的扩展变的更加轻松; 当需要对接一种新的存储介质时,只需要基于Reader层的接口,构建新的实现类即可;
Schema
Schema层是seraphdb特有的逻辑层,它对于实现轻量级的图引擎有着重要的意义; 在传统的图数据库中,我们需要将数据按图数据库预先定义的数据格式写入到图数据库,即便是我们现在的数据格式以及索引已经具备了图遍历的能力; 而通过Schema层,将图的逻辑结构映射到底层物理存储的结构上,不但减少了人工处理数据的流程,同时对于有向图中的含有来、去向边,可以基于同一结构来实现,大大降低了图数据占用的存储;
计算逻辑层
计算逻辑层完全继承了Tinkerpop的概念, Structure、DSL、Strategy、Step均来自Tinerpop,简单介绍, Structure主要是用定义图的基本结构,如Vertex,Edge,Graph, Property等;Process API中的TraversalSource以及Traversal主要是用于定义图遍历的逻辑,Strategy则提供了一系列的拦击方法,用于在遍历过程中更改执行的逻辑、方向等;而Step则提供了最基础的执行算子;
为了能够实现轻量级一体化的图计算引擎,我们基于现有的功能做了一系列的扩展;
Steps
为了能够在gremlin中扩展自己的算子, 我们实现了自己的TraversalSource以及Traversal, 并基于自身的Traversal提供了一系列数据写出类的算子,如toJdbc(), toPrint(), toSlS(),toRocketmq()等, 满足图的遍历结果直接写到外部存储的要求;
Strategy
Tinkerpop 自有的图遍历的逻辑,通常是一步一步的查,将上一步的查询结果作为下一步查询的输入,这对于关系型数据存储来说,会同时产生大量的数据库查询,尤其是对于递归遍历而言,膨胀的查询会给数据库造成巨大的压力;
为此我们构建自己的strategy,对在关系型数据库上的图查询做了进一步的优化; 我们基于策略,实现了过滤条件提前的方式,这样将过滤放在数据库查询阶段,降低了返回的数据量; 同时我们对递归做了妥协, 强制用户加入递归的层数,同时基于用户的递归逻辑,将原来多次执行的简单查询做重建,构建为一个复杂的join查询,大大降低了数据库的压力;
任务调度
Seraphdb基于quzrtz实现了一个轻量级的分布式调度系统, 可帮助用户定时调度图的查询任务,并将结果写出,从而解决了专有云上图任务的调度问题;
至此,Seraphdb 轻量级图引擎方案在专有云上落地了; 后续我会继续介绍seraphdb的用法,以及在业务中的发展;希望大家能加入到讨论,提供更多的场景和方案;