溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Elasticsearch常見的5個錯誤及解決策略是什么

發(fā)布時間:2021-12-08 10:12:02 來源:億速云 閱讀:218 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Elasticsearch常見的5個錯誤及解決策略是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1、采用動態(tài)Mapping

如果不定義Mapping,Elasticsearch會根據(jù)輸入的數(shù)據(jù),創(chuàng)建對應的Mapping,這看起來非常完美,但是Elasticsearch的動態(tài)Mapping并不總是精確的。
動態(tài)Mapping對于入門很有用,但在某些時候您需要結(jié)合業(yè)務數(shù)據(jù)指定Mapping。

舉例1:5.x版本之后,需要分詞的字段需要設定text類型和對應的analyzer ;僅需要精確匹配的可直接設置為keyword類型。
舉例2:長文本高亮需要在text類型的基礎上,設置fast-vector-highlighter高亮方式,高亮效率能提升20倍以上。

2、聚合設置不當導致OOM

在某些聚合中,沒有足夠的內(nèi)存來支持復雜的嵌套聚合,導致聚合結(jié)果超時甚至OOM

聚合爆炸是計算問題,可能導致某些聚合的桶生成呈指數(shù)增長,并可能導致不受控制的內(nèi)存使用。

Elasticsearch“terms”字段根據(jù)您的數(shù)據(jù)構(gòu)建存儲桶,但無法預測將提前創(chuàng)建多少存儲桶。 對于由多個子聚合組成的父聚合,這可能會有問題。 組合每個子聚合中的唯一值可能會導致創(chuàng)建的桶數(shù)量大幅增加。

我們來看一個例子。

假設您有一個代表運動隊的數(shù)據(jù)集。 如果你想特別關(guān)注那支球隊的前10名球員和以及他們的支持球員,那么聚合將如下所示

1{
2"aggs" : {
3"play_aggs" : {
4"terms" : {
5"field" : "players",
6"size" : 10
7},
8"aggs" : {
9"other_aggs" : {
10"terms" : {
11"field" : "players",
12"size" : 5
13}
14}
15}
16}
17}
18}

聚合將返回前10名球員的列表以及每位頂級球員的前五名支持球員的列表 - 這樣總共將返回50個值。這個看上去簡單的查詢可以輕而易舉地消耗大量內(nèi)存。

terms聚合可以顯示為使用每個級別的桶的樹。因此,以上聚合中每個頂級球員的桶將構(gòu)成第一級,而另一個聚合中的每個支持球員的桶將構(gòu)成第二級。因此,一個團隊將生產(chǎn)n2桶。想象一下,如果您擁有5億個文檔的數(shù)據(jù)集會發(fā)生什么。

Collection Mode用于幫助控制子聚合的執(zhí)行方式。聚合的默認Collection Mode稱為深度優(yōu)先,首先需要構(gòu)建整個樹,然后修剪邊緣。雖然深度優(yōu)先是大多數(shù)聚合的適當收集模式,但它不適用于上面的運動員聚合示例。因此,Elasticsearch允許您將特定聚合中的收集模式更改為更合適的方式。

諸如上面的示例之類的規(guī)范應該使用廣度優(yōu)先收集模式,該模式一次構(gòu)建和修剪樹一級以控制聚合爆炸。 此收集模式極大地幫助減少消耗的內(nèi)存量并保持節(jié)點穩(wěn)定。

1{
2"aggs" : {
3"play_aggs" : {
4"terms" : {
5"field" : "players",
6"size" : 10,
7"collect_mode" : "breadth_first"
8},
9"aggs" : {
10"other_aggs" : {
11"terms" : {
12"field" : "players",
13"size" : 5
14}
15}
16}
17}
18}
19}

推薦閱讀:http://t.cn/RHndSgY

3. ES索引設置不當

3.1 集群名稱配置

ES啟動的默認群集名稱稱為elasticsearch。 如果群集中有許多節(jié)點,最好保持命名標志盡可能一致,例如:

1cluster.name:app_es_production
2node.name:app_es_node_001

3.2 集群恢復設置

節(jié)點的恢復設置也很重要。 假設群集中的某些節(jié)點由于故障而重新啟動,并且某些節(jié)點在其他節(jié)點之后重啟。 為了使所有這些節(jié)點之間的數(shù)據(jù)保持一致,我們必須運行一致性程序,以使所有集群保持一致狀態(tài)。

舉例1:只要10個數(shù)據(jù)或主節(jié)點已加入群集,即可恢復。

1gateway.recover_after_nodes:10

舉例2:集群中期待啟動節(jié)點達到20個以及時間超過7分鐘后,集群重啟或恢復。

1gateway.expected_nodes:20
2gateway.recover_after_time:7m

使用正確的配置,可能需要數(shù)小時的恢復縮減到只需要分鐘級,極大提高工作效率。

3.3 防腦裂配置

minimum_master_nodes對于群集穩(wěn)定性非常重要。 它們有助于防止腦裂。
此設置的建議值為(N / 2)+ 1 , 其中N是候選主節(jié)點的節(jié)點數(shù)。
有了這個,如果你有10個可以保存數(shù)據(jù)并成為主數(shù)據(jù)的 候選主節(jié)點,那么該值將是6。
如果您有三個專用主節(jié)點和1,000個數(shù)據(jù)節(jié)點,則該值為兩個(僅計算候選主節(jié)點):
discovery.zen.minimum_master_nodes:2

4、集群不做規(guī)劃,遇到問題再說

1“我需要多少存儲空間、多大的內(nèi)存?”是用戶經(jīng)常問自己的問題。

遺憾的是,沒有固定的公式,但可以采取某些步驟來協(xié)助規(guī)劃資源。
推薦方法:模擬實際用例。
步驟1:創(chuàng)建ES集群。
步驟2:使用與生產(chǎn)設置所需的數(shù)據(jù)速率幾乎相同的數(shù)據(jù)。
步驟3:啟動節(jié)點,用真實文檔填充它們,然后推送填充數(shù)據(jù)到索引分片。

在模擬實際用例過程中了解資源利用率非常重要,因為它允許您為節(jié)點保留適當?shù)腞AM量,配置JVM堆空間并優(yōu)化整個測試過程。

根據(jù)模擬結(jié)果,決定實際集群的內(nèi)存、CPU、磁盤容量。

5、線程池設置不合理

ES節(jié)點具有許多線程池,以便改進節(jié)點內(nèi)線程的管理方式。 但是每個線程可以處理多少數(shù)據(jù)存在限制。 要跟蹤此值,我們可以使用ES屬性:

1threadpool.bulk.queue_size:2000

這會向ES通知分片中的請求數(shù),當沒有可用于處理請求的線程時,新請求可以在節(jié)點中排隊等待執(zhí)行。 如果任務數(shù)高于此值,您將獲得RemoteTransportException。 該值越高,節(jié)點機器上所需的堆空間量就越大,并且JVM堆也將被消耗。
此外,你應該在代碼的開發(fā)階段做好異常處理。

注意:ES官網(wǎng)不建議修改此值。

Elasticsearch的使用過程中總會遇到這樣、那樣的問題,多總結(jié)、多思考,形成針對業(yè)務場景的有效的解決方案。
同時,也要多吸取國內(nèi)外社區(qū)、論壇、博客中的精華,取長補短。

注意:網(wǎng)絡文獻一般沒有涉及版本,老版本ES一些配置不一定適用于6.X最新版本,但,底層的技術(shù)永遠不過時。

上述就是小編為大家分享的Elasticsearch常見的5個錯誤及解決策略是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI