1. 程式人生 > >ElasticSearch優化系列三:索引過程

ElasticSearch優化系列三:索引過程

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

大家可能會遇到索引資料比較慢的過程。其實明白索引的原理就可以有針對性的進行優化。ES索引的過程到相對Lucene的索引過程多了分散式資料的擴充套件,而這ES主要是用tranlog進行各節點之間的資料平衡。所以從上我可以通過索引的settings進行第一優化:

"index.translog.flush_threshold_ops":"10000"  "refresh_interval" : "1s"

這兩個引數第一是到translog資料達到多少條進行平衡,預設為5000,而這個過程相對而言是比較浪費時間和資源的。所以我們可以將這個值調大一些還是設為-1關閉,進而手動進行translog平衡。第二引數是重新整理頻率,預設為1s是指索引在生命週期內定時重新整理,一但有資料進來能refresh像lucene裡面commit,我們知道當資料addDoucment後,還不能檢索到要commit之後才能行資料的檢索,所以可以將其關閉,在最初索引完後手動refresh之,然後將索引setting裡面的index.refresh_interval引數按需求進行修改,從而可以提高索引過程效率。

另外的知道ES索引過程中如果有副本存在,資料也會馬上同步到副本中去。我個人建議在索引過程中將副本數設為0,待索引完成後將副本數按需量改回來,這樣也可以提高索引效率。

“number_of_replicas”: 0

其實檢索速度快度與索引質量有很大的關係。而索引質量的好壞主要與以下幾方面有關:

分片數0?wx_fmt=png

分片數是與檢索速度非常相關的的指標,如果分片數過少或過多都會導致檢索比較慢。分片數過多會導致檢索時開啟比較多的檔案別外也會導致多臺伺服器之間通訊。而分片數過少會導致單個分片索引過大,所以檢索速度慢。基於索引分片數=資料總量/單分片數的計算公式,在確定分片數之前需要進行單服務單索引單分片的測試,目前我們測試的結果單個分片的內容為10G。

分片(Shard):一個索引會分成多個分片儲存,分片數量在索引建立後不可更改,推薦【分片數*副本數=叢集數量】

確定分片的數量和副本的數量0?wx_fmt=png

ElasticSearch在建立索引資料時,最好指定相關的shards數量和replicas,  否則會使用伺服器中的預設配置引數shards=5,replicas=1。


因為這兩個屬性的設定直接影響叢集中索引和搜尋操作的執行。假設你有足夠的機器來持有碎片和副本,那麼可以按如下規則設定這兩個值:


    1) 擁有更多的碎片可以提升索引執行能力,並允許通過機器分發一個大型的索引;


    2) 擁有更多的副本能夠提升搜尋執行能力以及叢集能力。


對於一個索引來說,number_of_shards只能設定一次,而number_of_replicas可以使用索引更新設定API在任何時候被增加或者減少。


這兩個配置引數在配置檔案的配置如下:

index.number_of_shards: 5 number_of_replicas: 1

Elastic官方文件建議:一個Node中一個索引最好不要多於三個shards.配置total_shards_per_node引數,限制每個index每個節點最多分配多少個發片.

http://www.open-open.com/doc/view/f240d61f8f7745098b4459c2483feb40

http://wenku.baidu.com/linkurl=bwD9mpebmQ28mqPj6Z0P1_A9bgFKnhIss8UrRA_Nsv7oTFuUEa9JgUdr9ynKc8OjWvd0pVLsp3tYZTFaNcxVt30EyFBCvkNflFGjMWcqsRq

副本數0?wx_fmt=png

副本數與索引的穩定性有比較大的關係,如果Node在非正常掛了,經常會導致分片丟失,為了保證這些資料的完整性,可以通過副本來解決這個問題。建議在建完索引後在執行Optimize後,馬上將副本數調整過來。

分詞0?wx_fmt=png

分詞對於索引的影響可大可小,看自己把握。大家或許認為詞庫越多,分詞效果越好,索引質量越好,其實不然。分詞有很多演算法,大部分基於詞表進行分詞。也就是說詞表的大小決定索引大小。所以分詞與索引膨漲率有直接關係。詞表不應很多,而對文件相關特徵性較強的即可。比如論文的資料進行建索引,分詞的詞表與論文的特徵越相似,詞表數量越小,在保證查全查準的情況下,索引的大小可以減少很多。索引大小減少了,那麼檢索速度也就提高了。

索引段0?wx_fmt=png

索引段即lucene中的segments概念,我們知道ES索引過程中會refresh和tranlog也就是說我們在索引過程中segments number不只一個。而segments number與檢索是有直接聯絡的,segments number越多檢索越慢,而將segments numbers 有可能的情況下保證為1,這將可以提高將近一半的檢索速度。

https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html

原文連結:http://www.jianshu.com/p/b4eda49583b5

640.png?

640?wx_fmt=jpeg

請關注LeadAI公眾號,檢視更多專業文章

點選量最高的文章

640.png?

640.png?

0?wx_fmt=gif

點選“閱讀原文”直接開啟【北京站 | GPU CUDA 進階課程】報名連結