在具有共享NFS的集群环境中使用Lucene

时间:2013-07-29 10:39:53

标签: lucene locking cluster-computing

我在群集的Websphere环境中使用Lucene 4.3.1。双方应共享位于共享NFS卷上的索引。

我不断获得以下堆栈跟踪:

Lock obtain timed out: NativeFSLock@/<pathToIndex>/write.lock
        org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/<pathToIndex>/write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:84)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:667)

我使用以下代码获取目录:

directory = FSDirectory.open( indexPath );

我在ejb的方法中打开和关闭编写器(在集群成员上):

public void removeWikiDocument( long oid ) {
    IndexWriter writer = new IndexWriter( directory, config );
    Term t = new Term( OID, Long.toString( oid ) );
    writer.deleteDocuments( t );
    writer.commit();
    writer.close();
}

是否有人知道我做错了什么是在这种情况下使用的正确方法。

3 个答案:

答案 0 :(得分:2)

不同的JVM不可能在写入模式下访问相同的索引。您只能使用只读索引执行此操作。

lucene索引必须由单个JVM管理。

如果要在群集环境中部署lucene,您必须查看Lucene SolrCloudElasticSearch

答案 1 :(得分:2)

除了上一个答案之外,强烈建议不要使用NFS作为Lucene索引,因为它会严重损害性能。 有关更多信息,请参阅此类讨论: http://lucene.472066.n3.nabble.com/Lucene-index-on-NFS-td4011301.html

还有一个请求功能,可以获得完整的NFS支持(这意味着处理延迟删除): https://jira.atlassian.com/browse/JRA-33887

答案 2 :(得分:1)

我在使用Lucene和Hibernate Search时遇到了同样的问题。在Hibernate官方搜索文档中,据说在集群模式下使用Lucene和共享文件系统是可能的,如here所述。

你必须确保 exclusive_index_use 值是 false ,它指定第一个节点获得索引锁定保持它直到关闭(默认情况下它是真的) )正如here所解释的那样。我认为应该有一种方法来为没有Hibernate Search的Lucene指定这个设置。