2017-05-04 168 views
1

我有一個測試ElasticSearch框(2.3.0),我的測試使用ES失敗的隨機順序,真是令人沮喪(失敗,所有碎片失敗異常)。ElasticSearch運行測試時隨機失敗

望着elastic_search.log文件只給我看了這個

[2017-05-04 04:19:15,990][DEBUG][action.search.type  ] [es-testing-1] All shards failed for phase: [query] 
RemoteTransportException[[es-testing-1][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalIndexShardStateException[CurrentState[RECOVERING] operations only allowed when shard state is one of [POST_RECOVERY, STARTED, RELOCATED]]; 
Caused by: [derp_test][[derp_test][3]] IllegalIndexShardStateException[CurrentState[RECOVERING] operations only allowed when shard state is one of [POST_RECOVERY, STARTED, RELOCATED]] 
    at org.elasticsearch.index.shard.IndexShard.readAllowed(IndexShard.java:993) 
    at org.elasticsearch.index.shard.IndexShard.acquireSearcher(IndexShard.java:814) 
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:641) 
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:618) 
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:369) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:368) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:365) 
    at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350) 
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 

任何想法是怎麼回事?到目前爲止,我的研究只告訴我這很可能是由於腐敗的超時日誌 - 但我不認爲刪除超時日誌將會有所幫助,因爲測試將丟掉每個命名空間的測試索引

ES測試盒具有3.5GB RAM,使用2.5GB堆大小,CPU使用率是在測試過程中相當正常(15%達到峯值)


澄清:當我說失敗測試,​​餘與怪異異常意味着誤差以上(未失敗的測試如所提到的由於值不正確)。每次插入/更新操作後,我都進行了手動刷新,因此值是正確的。

+0

活躍(https://www.elastic.co /guide/en/elasticsearch/reference/current/integration-tests.html)進行集成測試? – chengpohi

+0

@chengpohi不,目前它只是把測試盒視爲一個普通的es盒子。這是一個反模式還是什麼? – GantengX

回答

1

調查ElasticSearch日誌文件(在DEBUG電平)和源代碼之後,原來實際上發生的事情是,索引創建後,碎片進入RECOVERING狀態,有時我的測試試圖在ElasticSearch上執行查詢,而碎片尚未激活 - 因此例外。

修復很簡單 - 創建索引後,就等到碎片是使用setWaitForActiveShards功能和更加偏執我還是否使用[ESIntegTestCase]加setWaitForYellowStatus

+0

您應將此標記爲接受的答案 –

+0

感謝您的提醒。在接受自己的答案之前,由於延遲2天而忘了它 – GantengX

0

建議用ESIntegTestCase來進行整合測試。

ESIntegTestCase有一些輔助方法,如:ensureGreenrefresh ......以確保Elasticsearch準備繼續測試。您可以配置node settings進行測試。

如果使用Elasticsearch直接作爲測試盒,它可能導致各種問題:

  1. 喜歡你Exception,這似乎是它的恢復索引 derp_test碎片。
  2. 即使你已經收錄您的數據轉換成指數,但是當你立刻查詢會失敗,因爲集羣需要沖洗刷新 ...

那些大多數問題可以只使用Thread.sleep等待一段時間來解決:),但這是一個不好的方法來做到這一點。

+1

嗯我不確定在這種情況下我是否可以輕鬆使用ESIntegTestCase,因爲它是一個clojure項目,而ES只是方程的一部分。我會看看我是否可以用flush/refresh來解決這個問題 – GantengX

+0

是的,你應該嘗試**同步**操作。 – chengpohi

0

嘗試在插入數據之後並在執行查詢之前手動刷新索引,以確保數據可搜索。

或者:

+0

哎呀我的壞,我應該更清楚,當我說「失敗的測試」我的意思是錯誤,而不是給予無效的結果。每次插入/更新後,我也會刷新 – GantengX