1. 程式人生 > >Elasticsearch乾貨(九):Elasticsearch崩潰風險

Elasticsearch乾貨(九):Elasticsearch崩潰風險

我們在使用Elasticsearch時應該選擇性的避免一些可能導致叢集變慢甚至崩潰的操作,這是非常必要的。

萬用字元

我們在查詢時,或多或少可能會用到萬用字元(比如:*)來進行查詢操作。但是一個萬用字元下對應的往往是非常大的資料集,這種情況下,很容易導致叢集變慢。所以我們在使用萬用字元時一定要注意,萬用字元下的資料集是否過大。

對於分詞欄位聚合查詢

我們一定要避免對分詞欄位的聚合操作,尤其是類似content這類欄位,分詞結果往往數量級很大。Elasticsearch中對於分詞欄位的聚合是針對分詞結果的term進行聚合,而非整個field_value,這種操作結果就是佔用大量的系統記憶體。所以,需要聚合的欄位我們不要分詞,一般設定keyword即可。

聚合基數

對於聚合欄位,如果聚合的基數很大,一樣會導致系統很大的開銷。什麼是聚合基數呢?舉個例子說就是,你將要對人名進行分組聚合,可以想像,一旦你的系統中使用者數過億,那這個基數就非常大了。所以對於基數過大的聚合,最好還是通過其他辦法來實現聚合操作。

Mapping

我們都知道,Elasticsearch中每個節點都是可以處理index、delete、update、search請求的。但是在index時,如果插入的doc中存在一個未知欄位,那就涉及到mapping的修改(增加新field)。但是mapping修改是要鎖住整個索引的,因為mapping作為叢集狀態資訊是維護在Master,雖然所有節點都有同步叢集狀態,但只有Master可以進行修改,就是說要等待Master修改Mapping資訊並同步到所有節點後,才能進行下一步插入操作,這期間整個索引都是鎖住的。這在一些場景是很致命的,所以一般建議配置Mapping:dynamic=false,來禁止Mapping動態修改,但這只是從一定程度上減少了Mapping對叢集的影響。