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

在具有共享NFS的群集环境中使用Lucene,lucene,locking,cluster-computing,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>/wri

我正在集群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)
我用ejb的方法打开和关闭写入程序(在clustermembers上):

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();
}

有人知道我做错了什么吗?在这种情况下,正确的方法是什么。

不同的JVM不可能在写模式下访问同一个索引。只有使用只读索引才能做到这一点

lucene索引必须由单个JVM管理


如果您想在集群环境中部署lucene,您必须查看或。

除了前面的答案之外,强烈建议不要将NFS用于lucene索引,因为这会严重影响性能。 有关更多信息,请参见此类讨论:

还有一个请求功能,可以获得完全的NFS支持(这意味着处理延迟删除):

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

您必须确保exclusive_index_use value为false,这指定第一个节点获得索引锁,并将其保持到关机(默认情况下为true),如所述。我认为应该有一种方法可以在没有Hibernate搜索的情况下为Lucene指定此设置

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();
}