私のアプリケーションは、RESTを介して複数のクライアントから非常に頻繁にSolr書き込みを行います。 「commitWithin」属性を使用して自動コミット機能を使用しています。 LockObtainFailedExceptionは、数日間使用すると表示され始めます。問題が何であるかを理解するのに苦労しています。どんな助けでも大歓迎です。 Tomcat6でSolr3.1を使用しています
これがsolrからのエラーダンプです
HTTP Status 500 - Lock obtain timed out: NativeFSLock@/var/lib/solr/data/index/write.lock
org.Apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/var/lib/solr/data/index/write.lock
at org.Apache.lucene.store.Lock.obtain(Lock.Java:84)
at org.Apache.lucene.index.IndexWriter.<init>(IndexWriter.Java:1097)
at org.Apache.solr.update.SolrIndexWriter.<init>(SolrIndexWriter.Java:83)
at org.Apache.solr.update.UpdateHandler.createMainIndexWriter(UpdateHandler.Java:102)
at org.Apache.solr.update.DirectUpdateHandler2.openWriter(DirectUpdateHandler2.Java:174)
at org.Apache.solr.update.DirectUpdateHandler2.addDoc(DirectUpdateHandler2.Java:222)
at org.Apache.solr.update.processor.RunUpdateProcessor.processAdd(RunUpdateProcessorFactory.Java:61)
at org.Apache.solr.handler.XMLLoader.processUpdate(XMLLoader.Java:147)
at org.Apache.solr.handler.XMLLoader.load(XMLLoader.Java:77)
at org.Apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.Java:55)
at org.Apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.Java:129)
at org.Apache.solr.core.SolrCore.execute(SolrCore.Java:1360)
at org.Apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.Java:356)
at org.Apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.Java:252)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:233)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:127)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:298)
at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:859)
at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:588)
at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:489)
at Java.lang.Thread.run(Thread.Java:662)
</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Lock obtain timed out: NativeFSLock@/var/lib/solr/data/index/write.lock
Solrconfig.xmlのwriteLockTimeoutを20秒に増やしましたが、現在は正常に機能しているようです。以前は1秒に設定されていました
これは通常、Solrが非標準の方法で終了したために発生し、そのロックがクリーンアップされませんでした。これが発生する前に、JVMクラッシュ/ Solrクラッシュがありましたか?
別の原因は、同じ場所に複数のSolrサーバーを向けようとしている場合です。たとえば、 この質問 。
それはまた記憶の欠如である可能性があります。メモリが不足するとロックが発生する可能性があります。サーバーでも同じことがわかります。
Apacheのドキュメントから:Solrインスタンスに十分なメモリが割り当てられていない場合、Java仮想マシンはJava OutOfMemoryErrorをスローすることがあります。これが発生してもデータ破損の危険はなく、Solrは正常に回復を試みます。ただし、エラーがスローされたときに進行中の追加/削除/コミットは成功しない可能性があります。その他の悪影響が発生する可能性があります。たとえば、SimpleFSLockの場合ロックメカニズムが使用されている場合(Solr 1.2の場合のように)、タイミングの悪いOutOfMemoryErrorにより、Solrがインデックスのロックを失う可能性があります。これが発生した場合、インデックスをさらに変更しようとすると、
重大:コミット/最適化中の例外:Java.io.IOException:ロック取得がタイムアウトしました:SimpleFSLock @/tmp/lucene-5d12dd782520964674beb001c4877b36-write.lock
http://wiki.Apache.org/solr/SolrPerformanceFactors を参照してください。