首页 文章

泰坦Db无视指数

提问于
浏览
4

我有一个带有几个索引的图表 . 它们是两个具有标签限制的综合指数 . (两者在不同的属性/标签上完全相同) . 一个肯定似乎工作,但另一个没有 . 我已完成以下配置文件()以加倍检查:

一个名为 KeyOnNode :property uid ,label node

gremlin> g.V().hasLabel("node").has("uid", "xxxxxxxx").profile().cap(...)
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TitanGraphStep([~label.eq(node), uid.eq(dammit_...                     1           1           2.565    96.84
  optimization                                                                                 1.383
  backend-query                                                        1                       0.231
SideEffectCapStep([~metrics])                                          1           1           0.083     3.16
                                            >TOTAL                     -           -           2.648        -

以上是完全可以接受的,效果很好 . 我假设魔术线是 backend-query .

另一个名为 NameOnSuperNode :property name 和label supernode

gremlin> g.V().hasLabel("supernode").has("name", "xxxxxxxx").profile().cap(...)
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TitanGraphStep([~label.eq(supernode), name.eq(n...                     1           1        5763.163   100.00
  optimization                                                                                 2.261
  scan                                                                                         0.000
SideEffectCapStep([~metrics])                                          1           1           0.073     0.00
                                            >TOTAL                     -           -        5763.236        -

这里查询需要花费大量时间,我们有一条 scan 行 . 我原本想知道索引是不是通过管理系统提交,但唉以下似乎工作得很好:

gremlin> m = graphT.openManagement(); 
==>com.thinkaurelius.titan.graphdb.database.management.ManagementSystem@73c1c105
gremlin> index = m.getGraphIndex("NameOnSuperNode")
==>NameOnSuperNode
gremlin> index.getFieldKeys()
==>name
gremlin> import static com.thinkaurelius.titan.graphdb.types.TypeDefinitionCategory.*
==>null
gremlin> sv = m.getSchemaVertex(index)
==>NameOnSuperNode
gremlin> rel = sv.getRelated(INDEX_SCHEMA_CONSTRAINT, Direction.OUT)
==>com.thinkaurelius.titan.graphdb.types.SchemaSource$Entry@26b2b8e2
gremlin> sse = rel.iterator().next()
==>com.thinkaurelius.titan.graphdb.types.SchemaSource$Entry@2d39a135
gremlin> sse.getSchemaType()
==>supernode

我不能只在这时重置数据库 . 任何有助于确定问题的帮助都会令人惊叹,我在这里碰到了一堵墙 . 这是我需要重新索引的标志吗?

信息:Titan DB 1.1(TP 3.1.1)

干杯

UPDATE : 我发现有问题的索引不是 REGISTERED 状态:

gremlin> :> m = graphT.openManagement(); index = m.getGraphIndex("NameOnSuperNode"); pkey = index.getFieldKeys()[0]; index.getIndexStatus(pkey)
==>INSTALLED

我该如何注册?我已经尝试了 m.updateIndex(index, SchemaAction.REGISTER_INDEX).get(); m.commit(); graphT.tx().commit(); 但似乎没有做任何事情

UPDATE 2 : 我试过注册索引以便使用以下内容重新编制索引:

gremlin> m = graphT.openManagement(); 
index = m.getGraphIndex("NameOnSuperNode") ; 
import static com.thinkaurelius.titan.graphdb.types.TypeDefinitionCategory.*; 
import com.thinkaurelius.titan.graphdb.database.management.ManagementSystem; 
m.updateIndex(index, SchemaAction.REGISTER_INDEX).get();
ManagementSystem.awaitGraphIndexStatus(graphT, "NameOnSuperNode").status(SchemaStatus.REGISTERED).timeout(20, java.time.temporal.ChronoUnit.MINUTES).call();
m.commit();
graphT.tx().commit()

但这不起作用 . 我的索引仍然处于 INSTALLED 状态,并且我检查了没有打开的交易 . 有人有想法吗?仅供参考,图表在单个服务器上运行,并且具有~100K顶点和~130k个边缘 .

2 回答

  • 7

    所以这里有一些事情可以发生:

    • 如果您描述的这两个索引都没有在同一个事务中创建(并且问题索引是在已经定义 name propertyKey 之后创建的)那么您应该根据Titan docs发出reindex:

    图索引的名称必须是唯一的 . 针对新定义的属性键构建的图索引,即在与索引相同的管理事务中定义的属性键,立即可用 . 针对已在使用的属性键构建的图索引需要执行reindex过程以确保索引包含所有先前添加的元素 . 在reindex过程完成之前,索引将不可用 . 建议在与初始模式相同的事务中定义图索引 .

    • 索引可能会超时从 REGISTERED 移动到 INSTALLED 的过程,在这种情况下,您要使用 mgmt.awaitGraphIndexStatus() . 您甚至可以指定您愿意在此等待的时间 .

    • 确保图表上没有未结交易,或者索引状态确实不会改变,如here所述 .

    • 这显然不是你的情况,但是Titan中有一个错误(在JanusGraph中通过this PR修复),这样如果你为新创建的propertyKey和以前使用过的propertyKey创建一个索引,那么索引将陷入困境 REGISTERED

    • 索引不会移动到 REGISTERED ,除非群集中的每个Titan / JanusGraph节点都确认索引创建 . 如果索引陷入 INSTALLED 状态,则系统中的其他节点可能无法确认索引是否存在 . 这可能是由于集群中另一台服务器的问题,Titan / JanusGraph用于相互通信的消息队列中的回填,或者最意外的是:存在幻像实例 . 每次服务器通过非正常的JVM关闭进程被杀死时都会发生这些情况,即由于服务器被卡在世界垃圾收集中而导致服务器停止运行 . 如果您希望回填成为问题,那么this class中的注释可以提供对可自定义配置选项的深入了解,这些选项可能有助于解决问题 . 要检查是否存在幻像节点,请使用this function然后使用this function来终止幻像实例 .

  • 1

    我认为你错过了图表的配置 . 如果您使用后端是cassandra,则必须使用elasticsearch进行配置 . 如果您使用后端是hbase,则必须使用缓存进行配置 . 阅读下面的链接:https://docs.janusgraph.org/0.2.0/configuration.html

相关问题