2011-05-25 51 views
19

我的應用程序通過REST從多個客戶端進行非常頻繁的solr寫入。我通過使用「commitWithin」屬性來使用自動提交功能。 LockObtainFailedException在幾天使用後開始出現。我很難找出問題的癥結所在。任何幫助表示讚賞。我使用的Solr 3.1和Tomcat 6多個同時寫入的Solr - LockObtainFailedException

這裏是從Solr的錯誤轉儲


HTTP Status 500 - Lock obtain timed out:  [email protected]/var/lib/solr/data/index/write.lock 

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/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: [email protected]/var/lib/solr/data/index/write.lock 

回答

16

我將solrconfig.xml中的writeLockTimeout增加爲20秒,現在看起來工作正常。此前它被設置爲1秒

+0

我在寫一條記錄時遇到了同樣的錯誤,並增加了'writeLockTimeout'修復它。我不認爲這與本文的原始標題的併發性或「多個同時寫入」有關。我認爲這個指數正在增長,並且寫入的時間也增加了。 – 2011-08-18 23:03:04

7

這通常是因爲Solr的終止在一個非標準的方式,所以它的鎖並沒有得到清理乾淨。發生這種情況之前是否存在JVM崩潰/ Solr崩潰?

另一個原因是如果您嘗試將多個solr服務器指向同一位置。見例如this question

+0

謝謝。我將嘗試查看JVM日誌。我想這需要一些調整。 – Nands 2011-05-26 08:26:55

+0

如何清理鎖? – Trip 2013-07-02 15:30:13

+1

Solr使用文件鎖定,因此重命名或刪除鎖定文件(我們的鎖定文件包含'write.lock')。該文件位於索引文件文件夾中 - 對我們來說,「SolrHome \」 \ data \ index'。重命名或刪除該文件:我們的文件'lucene-5d886598917ad7fbb03256c713a8aacb-write.lock'已重命名爲'TEMP__lucene-5d886598917ad7fbb03256c713a8aacb-write_lock__TEMP'。之後,重新編制索引並不會出現鎖定問題。顯然,這不能替代(1)預防(調度重新索引),(2)可能的錯誤處理(writer.close&writer.open?),或(3)適合您的超時設置。 – 2013-11-14 19:18:53

2

它也可能是缺乏記憶。內存不足可能導致鎖定,我在服務器上看到同樣的事情。

從apache文檔: 如果您的Solr實例沒有足夠的內存分配給它,Java虛擬機有時會拋出一個Java OutOfMemoryError。發生這種情況時不會有數據損壞的危險,Solr會嘗試正常恢復。但是,在引發錯誤時進行的任何添加/刪除/提交操作都不可能成功。其他不利影響可能會出現。例如,如果正在使用SimpleFSLock鎖定機制(如Solr 1.2中的情況),則錯誤的OutOfMemoryError可能會導致Solr失去對索引的鎖定。如果發生這種情況,進一步嘗試修改索引將導致

嚴重:異常期間提交/優化:java.io.IOException的:鎖定獲得超時:[email protected]/tmp/lucene-5d12dd782520964674beb001c4877b36-write.lock

請參閱http://wiki.apache.org/solr/SolrPerformanceFactors