使用&缩放泰坦图数据库

时间:2016-06-19 06:50:19

标签: amazon-web-services graph titan bigdata

我正在找出存储分层数据的选项(父子关系)。

由于树是图形而森林(树木)在技术上也是图形,因此图形数据库似乎比RDBMS特别好。因为我关心优化读写操作。

  • 优化写入意味着层次结构的更改需要最少的写入。
  • 优化读取意味着实现特定节点消费者最小读取操作的完整路径。

我的用例是:

  • 每个用户的树。我应该在用户空间中存储和使用一个图表,还是每个用户使用一个图表?
  • 路径查询从任何节点开始并返回到用户的树根。
  • 子节点存储指向父节点的链接

由于我的所有资源都在AWS中,因此能够使用Titan DynamoDB后端似乎是理想的。

我真正的问题在于了解如何扩展和管理Titan。

  1. 我需要一个gremlin服务器实例吗?换句话说,为了对Titan做任何事情,我是否需要使用gremlin服务器站起EC2实例?或者我可以使用Java Titan API直接处理图形数据吗?

  2. 我是否需要显式分片数据?换句话说,随着使用量的增加以及数据量和操作量的增加,我是否需要站起来使用更多的gremlin服务器?当服务器数量向外扩展时,我是否需要从客户端跨这些服务器进行一致性哈希才能执行操作?

  3. 我是否需要设置弹性搜索群集才能从任何节点启动遍历?或者是使用顶点来表示对象和边缘以表示此时足够的父关系?我可以保证顶点ID在用户空间中是唯一的;我也可以用唯一的用户ID装饰每个顶点。在那种情况下,我需要弹性搜索吗?我希望弹性搜索是针对自由格式或更复杂的搜索类型查询,而不是针对确切的查询!

  4. 随着前端数量的增加,每个前端可以打开图形(跨用户空间的单个图形)吗?如果每个用户的图形,然后由于前端没有亲和力,可以为每个用户打开相同的图形;这可以吗?

  5. 我无法找到任何关于此的文档。谢谢!

1 个答案:

答案 0 :(得分:5)

我将尝试回答以下问题:

  1. 这两种解决方案都是可能的,在很大程度上取决于您的应用程序,在选择gremlin服务器或通过其他辅助数据存储进行自定义查询的自定义数据访问层之间做出决定。虽然我更喜欢使用自定义数据访问层,但可以通过gremlin服务器响应所有gremlin查询要求。

  2. Gremlin服务器只是应用程序和数据存储之间的接口,由于缓存机制,它是内存密集型的。数据可以存储在不同的机器中,例如DynamoDB机器的集群。它取决于并发用户的数量,但我认为垂直扩展对于大多数应用程序来说已经足够了。如果要在高度并发的环境中使用titan,超出单机资源,可能需要在不同的机器上创建不同的gremlin服务器并处理负载均衡机制。问题是你必须以类似查询从缓存效率的角度来看同一个gremlin-server的方式来控制发送请求。

  3. 是的,索引后端对于除简单检索之外的更复杂的查询非常有用。如果您希望通过相似性进行条件搜索或文本搜索,则像Solr / Elastic或Lucene这样的二级索引后端非常有用。这是因为像Lucene这样的索引器可以提供反向索引结构,可以对类似的搜索有所帮助。如果您要搜索所有父母/孩子,并且有#34; foo"在他们的名字中你必须使用索引后端。如果您要搜索年龄小于40岁的所有父母/子女,您也必须使用索引后端。 可以通过这些链接访问有关索引后端的更多信息。 http://s3.thinkaurelius.com/docs/titan/1.0.0/indexes.html http://s3.thinkaurelius.com/docs/titan/1.0.0/index-parameters.html

  4. 强烈建议将整个应用程序的打开图形数量限制为一个。 Titan使用一些缓存机制,鼓励您在整个应用程序中使用单个图形实例,以提高性能。由于未提交的数据仅在单个图形实例和事务上可见,因此如果您需要实时应用程序,则建议使用单个图形实例和单个事务。但是,在整个应用程序中使用多个图形实例进行只读事务并没有错,但效率不高。

  5. 您可以在以下链接中找到有关Titan图数据库的大量信息:

    主要泰坦文件:http://s3.thinkaurelius.com/docs/titan/1.0.0/

    关于泰坦如何运作的一个古老但非常有用的文件:https://github.com/elffersj/delftswa-aurelius-titan/tree/master/SA-doc