1. 程式人生 > >Elasticsearch筆記九之優化

Elasticsearch筆記九之優化

很多 系統 div ons oca eat consola 極速 eth

Elasticsearch筆記九之優化
優化從索引片段,內存設置,副本,分片,日誌等方面入手。
1:索引片段
Es運行時會生成很多索引片段,執行查詢時會打開這些索引片斷。系統會限制打開索引片斷的個數一旦超過這個個數限制就無法打開索引片斷。我們可以通過命令來查看更改索引片斷的限制數量。
索引片斷位置
/usr/local/elasticsearch-1.4.4/data/elasticsearch/nodes/0/indices/shb01/0/index

ulimit –a 查看索引片斷數量,默認是1024

技術分享

ulimit -n 32000 更改索引片斷數量

技術分享


如果索引片斷太多會影響效率我們可以在es集群空閑時對索引片斷進行合並。合並可以通過curl命令和Java來實現。
Curl
curl -XPOST http://192.168.79.131:9200/shb01/_optimize?max_num_segments=1

java

[java] view plain copy
  1. /**
  2. * 合並索引片段
  3. */
  4. @Test
  5. public void testOptimize()
  6. {
  7. transportClient.admin().indices().prepareOptimize("shb01", "shb02")
  8. .setMaxNumSegments(1).get();
  9. }
curl命令可以在linux中建立一個定時任務每天執行一次,同樣java代碼也可以建立一個定時器來執行。

2:內存設置
之前介紹過es集群有兩種啟動方式

第一種是bin目錄下bin/ elasticsearch
打開/usr/local/elasticsearch-1.4.4/bin/elasticsearch.in.sh文件修改文件中的兩個參數,將ES_MIN_MEM=256m和ES_MAX_MEM=1g的值改成一樣一般設置為可用內存的60%,這樣可以避免頻繁的內存交換。
另一種是searchwrapper插件方式啟動bin/service/ elasticsearch start
打開/usr/local/elasticsearch-1.4.4/bin/service/修改set.default.ES_HEAP_SIZE=1024

另外在es的配置文件中修改bootstrap.mlockall: true,這樣禁止內存交換。

3:分片設置
Es將數據存儲在多個分片中那麽分片的數量就影響到了查詢效率。
分片數少了導致分片過大打開一個太大的分片太慢,分片數量過多查詢時會打開過多的分片而且還有多臺服務器之間的通信問題。所以過多過少都不行,一般情況下分片數量維持在5~20個之間單個分片最大不要超過20G。我們可以根據實際的業務來評估分片數量。
比如我有5個分片,預計3個月會產生100G的數據,那麽我們可以每3個月當5個分片達到20G時就重新建立一個索引庫。


4:副本設置
副本多了可以增強es集群的安全性提高搜索能力但是也會相應的增加服務器同步數據的壓力,一般可以設置2~3個副本即可。
另外當初次建立索引庫時需要大量倒入數據時我們可以臨時將副本改為0不讓其同步數據以減輕服務器壓力,倒入完成後通過mappings來更改副本數,這種方式只針對當前索引庫後期添加的索引庫仍會讀取elasticsearch.yml中的副本個數,es重啟後仍然會保持之前mappings修改的副本數。

5:刪除文檔
在es中刪除一個文檔後不會立即從硬盤中刪除只會標記這個文檔被刪除,lucene會產生一個.del文件,而在檢索過程中這個文件還會參與檢索只不過在最後會被過濾掉,這樣其實也會影響效率,我們可以定期刪除這些文件,同合並索引片斷一樣可以通過curl和java兩種方式來執行。
Curl
curl -XPOST http://192.168.79.131:9200/_optimize?only_expunge_deletes=true
Java

[java] view plain copy
  1. /**
  2. * 刪除.del文件
  3. */
  4. @Test
  5. public void testOptimizeDel()
  6. {
  7. transportClient.admin().indices().prepareOptimize("shb01", "shb02")
  8. .setOnlyExpungeDeletes(true).get();
  9. }


6:日誌輸出
可以調整es的日誌級別,es的默認級別是trace,超過500ms就屬於慢查詢就需要打印日誌,一般改為info或error級別。
日誌文件/usr/local/elasticsearch-1.4.4/config/logging.yml
ndex.search.slowlog: TRACE, index_search_slow_log_file 將TRACE改為INFO
或者更改elasticsearch.yml文件中對於慢查詢的設置
index.search.slowlog.threshold.query.trace: 500ms

7:單態獲取es對象
在java代碼中使用單實例的方式來獲取org.elasticsearch.client.transport.TransportClient對象。

8:es極速查詢
Es將數據存儲在不同的分片中,根據文檔id通過內部算法得出要將文檔存儲在哪個分片上,所以在查詢時只有指定在對應的分片上進行查詢就可以實現基於es的極速查詢,但是前提是你需要知道數據在那個分片上。
還可以通過路由參數來設置數據存儲在同一個分片中,setRouting(“”)

[java] view plain copy
  1. /**
  2. * 路由參數
  3. */
  4. @Test
  5. public void testRoutingInsert()
  6. {
  7. String source = "{\"name\":\"中山大學l\",\"num\":1800}";
  8. IndexResponse indexResponse = transportClient.prepareIndex(index, "stu")
  9. .setRouting("student")
  10. .setSource(source).get();
  11. System.out.println(indexResponse.getVersion());
  12. }
  13. /**
  14. * 路由參數
  15. */
  16. @Test
  17. public void testRoutingSearch()
  18. {
  19. SearchResponse searchResponse = transportClient.prepareSearch(index)
  20. .setTypes("stu")
  21. .setQuery(QueryBuilders.matchAllQuery())
  22. //.setPreference("_shards:0,1,2")
  23. .setRouting("student", "teacher")
  24. .get();
  25. SearchHits hits = searchResponse.getHits();
  26. SearchHit[] hits2 = hits.getHits();
  27. for(SearchHit h : hits2)
  28. {
  29. System.out.println(h.getSourceAsString());
  30. }
  31. }
技術分享
9:去掉mapping中_all域

Elasticsearch筆記九之優化