2012-05-11 48 views
1

技術版本
Hibernate Search的問題

 
Hibernate 3.6.5
Hibernate Search 3.4.0
Lucene (lucene-core-*.jar) 3.1.0
Spring 3.1.0.M2

休眠(搜索)配置

<prop key="hibernate.search.default.indexBase">/some/dir</prop> 
<prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider</prop> 
<prop key="hibernate.search.default.locking_strategy">native</prop> 
<prop key="hibernate.search.default.exclusive_index_use">false</prop> 

問題
我們的應用程序部署在亞馬遜(AWS雲),但我們已經在我們的本地集羣面臨這個問題,以及:

應用程序的設計是這樣的:有是從內部的主催生了Thread( Web)應用程序,我們需要更新索引的實體。基本上它就像一個狀態監視器線程,它讀取.status文件並每30秒左右更新一次數據庫。這種情況平均持續10分鐘到1/2小時左右。 我們看到的問題是:每隔幾天我們需要重新生成索引,因爲Hibernate Search會停止爲所討論的實體(上面討論的那個)返回任何內容。

我經歷了幾個論壇,似乎建議只有一個線程應該更新Lucene索引。但是,索引編寫也是線程安全的。所以,即使多個線程正在寫入相同的索引,我仍然認爲它不應該導致問題(在搜索中沒有返回任何內容)。也就是說,我可能會得到有問題的實體的陳舊狀態,但仍然應該返回的東西

我們使用Hibernate Search的默認IndexReader/Writer實現。

任何幫助將不勝感激。謝謝。

+1

你應該在使用NFS你的問題,這對Hibernate Search的參考手冊,明確鼓勵,因爲鎖的問題指出。如果您需要實時更新,請使用Infinispan目錄,或按照記錄設置JMS主/從方法。您也可以使用Amazon隊列服務編寫後端。 – Sanne

回答

2

這裏有一些想法。

我經歷了幾個論壇,似乎建議只有一個 線程應該更新Lucene索引。

這通常不正確。 Lucene和Hibernate Search允許多索引編寫器,但是訪問索引必須正確同步,這通過Lucene的org.apache.lucene.store.LockFactory發生。鎖定工廠是可配置的,並且您通過屬性* hibernate.search.default.locking_strategy *使用本地的。問題可能是這種策略是基於文件的。我對亞馬遜的分佈式文件系統內部工作知之甚少,但我會想象在這種情況下文件鎖不起作用。您可能需要實施自定義鎖定策略。

但也給出了索引編寫是線程安全的。所以,即使多個線程 寫入相同的索引,我仍然認爲它不應該導致問題

正確,提供鎖定工作。

另一種方法是無w/o鎖(設置* hibernate.search.default.locking_strategy *至),前提是您可以保證只有您的更新線程纔會寫入索引。你有沒有啓用更新線程自動索引?如果是這樣,請嘗試將其轉換(允許您的用例允許)。

+1

你說得對,這似乎是亞馬遜上的文件鎖定問題。爲了驗證,我執行了Lucene的LockStressTest(w/LockVerfifyServer),並觀察到在高負載下,鎖獲取失敗多次。不幸的是,我還沒有找到解決方案。 – pugmarx

0

好,對於那些誰落在這裏尋找一個解決方案 - 這裏就是我們所做的最後,這似乎已經解決了這個問題(我們已經負載測試此修復程序在AWS上,至今還沒有任何問題) :

我們寫我們實現了基於Lucene的NativeFSLockFactory鎖工廠。我們修改了obtain方法,以便在放棄之前重試獲得鎖定幾次。我們增加了重試之間短暫的延遲(sleep)來處理NFS延遲。

我們測試了此修補程序與Lucene的LockVerifyServer,並指出,在高負載下,即使幾個鎖的獲取請求必須等待獲得鎖 - 但最終每個鎖定獲取請求解決。實時地,這解釋爲索引文件的成功更新。

感謝您對Hardy我們展示的路徑。 :)

更新:昨天,我們必須將重試計數提高到一個更高的數字~30,因爲我們遇到了索引更新滑動與以前的值3。事情看起來很好。

+1

如果你只在你的問題中提到了NFS,我會立刻告訴你,這是很麻煩的使用Lucene。這就是爲什麼我們創建了[Infinispan目錄](https://docs.jboss.org/author/display/ISPN/Infinispan+as+a+Directory+for+Lucene),現在它被集成到Hibernate Search中[建議方法](http://docs.jboss.org/hibernate/search/4.2/reference/en-US/html_single/#infinispan-directories)。 – Sanne