天天看點

幹貨 | Elasticsearch 趨勢科技實戰分享筆記

1、Elasticsearch 索引的設計

1.1 單一索引還是基于時間的索引?

幹貨 | Elasticsearch 趨勢科技實戰分享筆記

單一索引的問題:

1)不能更新Mapping。

比如:主分片數不可以修改(除非reindex)。

2)無法靈活、快速地擴充。

3)更适合固定、小型資料集。

基于時間的索引面臨的問題:

1)如何确定間隔?

資料量

變更頻率

預設嘗試每周為機關分割——建議

2)如何實施?

索引模闆

1.2 定義索引注意事項

舉例:

{
    "facet_internet_access_minute":{
        "template":"ce-index-access-v1-*",
        "order":0,
        "settings":{
            "number_of_shards":5
        },
        "aliases":{
            "{index}-query":{

            }
        },
        "mappings":{
            "es_doc":{
                "dynamic":"strict",
                "_all":{
                    "enabled":false
                },
                "_source":{
                    "enabled":false
                },
                "properties":{
                    "CLF_Timestamp":{
                        "type":"long"
                    },
                    "CLF_CustomerID":{
                        "type":"keyword"
                    },
                    "CLF_ClientIP":{
                        "type":"ip",
                        "ignore_malformed":true
                    }
                }
            }
        }
    }
}           

注意1:不要在一個索引中定義多個type。

6.X版本已經不支援,7.X版本徹底不支援。

擴充問題:5.X版本的父子文檔實際實作中是一個索引中定義了多個type,到了6.X中實作方式改變為:join方式。

注意2:将Set _source設定為false。

假設你隻關心度量結果,不是原始檔案内容。

将節省磁盤空間并減少IO。

這個點,需要結合實際的業務場景具體問題具體分析。

“_source”:{ 
“enabled”:false 
},           

注意3:将_all設定為false。

假設你确切地知道你對哪個field做查詢操作?

能實作性能提升,縮減存儲。

“_all”:{ 
“enabled”:false },           

注意4:設定dynamic = strict。

假設你的資料是結構化資料。

字段設定嚴格,避免髒資料注入。

“dynamic”:”strict”,           

注意5:使用keyword類型

假設你隻關心完全比對

提高性能和縮小磁盤存儲空間

“CLF_CustomerID”:{ 
“type”:”keyword” 
},           

注意6:使用别名

如何在不停機的前提從一個索引切換到另一個索引?

幹貨 | Elasticsearch 趨勢科技實戰分享筆記
“aliases”:{ 
“{index}-query”:{ 
}           

或者你通過head插件建立。

2、Elasticsearch分片配置設定原則

社群和QQ群中經常被問到的問題:

1)應該分幾個索引、幾個分片?

2)每個分片大小如何設定?

3)副本多少如何設定?

這裡,明确給出實操可行的6個步驟。

幹貨 | Elasticsearch 趨勢科技實戰分享筆記

步驟1:定義索引。

思考索引中要大緻有哪些字段?

最好能列一個Excel表統計一下,包含但不限于:

序号、名稱、類型、作用、備注。

以上對計算單條資料大小也有用。

步驟2:評估資料量。

評估方法舉例:

1分鐘有100條資料,1天=1006024=144000條。

1月=144000條*30天=432W條資料。

1年=432W*12=5184W條資料。

假設要儲存2年,共=10368W條資料。

假設每條資料20KB,共需要存儲:10368W*20/1024/1024/1024=1.977TB。

步驟3:評估索引大小和磁盤空間。

步驟4:計算分片數。

細節考慮點:

1、每個分片大小應小于30GB。

2、分片數量= k *資料節點數目(k = 一個足夠小的整數,舉例:1,2,3)

3、假設你有一個小的索引,并且你有叢集中有足夠的節點,請嘗試使用預設值分片數5。

步驟5:評估索引數和類型。

(此處可能會有多次回報疊代)

3、資料去重的思考?

方法1:指定唯一id

缺點:

1、唯一值無法壓縮,不利于存儲。

2、存在高基數問題。

方法2:用聚合方法實作

步驟1:所有文檔加一個Hash值;

步驟2:檢查重複;

GET *_index/_search { 
“size”:0, 
“aggs”:{ 
“duplicate”:{ 
“terms”:{ 
“field”:”hash”, 
“min_doc_count”:2, 
“size”:5000 
}, 
“aggs”:{ 
“documents”:{ 
“top_hits”:{ 
“size”:2 
} 
} 
} 
} 
} }           

步驟3:批量删除步驟2中的重複id。

以上步驟,不影響寫入,可以實作異步。

1、存儲量大(尤其超過3億條+);

2、随着資料量增加,聚合受影響,越來越慢。

3、存在高基數問題。

方法3:用distinct query實作

深入方法待進一步探讨。

4、小結

以上内容是Elasticsearch南京分享會20180630上的分享核心筆記。

具體PPT位址:

https://elasticsearch.cn/slides/115

很受用的分析步驟和實戰經驗,實戰中都可以用得上。

作者:銘毅天下

轉載請标明出處,原文位址:

https://blog.csdn.net/laoyang360/article/details/80892392