Elasticsearch集群優化實戰


版本配置:

ES版本:6.2.4

OS內存64G。

 

一、安裝部署:

1.ES jvm內存31G,預留一半的物理內存給文件系統緩存(file system cache)。

2.禁止內存交換:

修改/etc/sysctl.conf 中 vm.swappiness = 1

elasticsearch.yml中,設置這個:bootstrap.mlockall:true

3.修改ES啟動用戶可使用的系統文件句柄數等。

4.有條件使用更好的硬盤如ssd。

5.如果有多塊盤:

  1)做RAID0或者RAID5,RAID可以提高磁盤IO,但是風險就是一塊硬盤故障整個就故障。

  2)每個盤mount到一個目錄,data path配置多個。

6.節點分開部署:master、data、coordinate

7.冷熱分離架構:熱數據SSD存儲,冷數據普通硬盤存儲。

 

二、合理的Index Mapping:

1.特殊字段:如Boolean、IP、時間等。

2.字符串:盡量使用keyword,默認的text會被analyze。keyword最大32766字節。

3.調整refresh間隔:refresh_interval: 30s,默認的1秒會導致大量segment產生,影響性能。

PUT /my_logs/_settings

{ "refresh_interval": "30s" }

4.調整translog刷新機制為異步:

"index": {

    "translog": {

        "flush_threshold_size": "512mb",  (默認512M,不建議修改)

        "sync_interval": "30s",  (默認5s,可適當增大)

        "durability": "async"   (默認request,每次更新都會寫trans log,修改為異步)

    }

}

5.創建新索引時,可以配置每個分片中的Segment的排序方式,index sorting是優化檢索性能的非常重要的方式之一:

{
    "settings" : {
        "index" : {
            "sort.field" : "date",
            "sort.order" : "desc"
        }
    },
    "mappings": {
        "properties": {
            "date": {
                "type": "date"
            }
        }
    }
}

 

三、ES參數調整:

針對data節點,設置elasticsearch.yml中:

thread_pool.bulk.queue_size: 1024 (增大)

indices.fielddata.cache.size: 1gb (默認10%,可適當調小)

indices.queries.cache.size: 1gb(默認10%,可適當調小)

indices.memory.index_buffer_size: 15% (默認10%,會影響寫入性能,寫入的分片數更多,則需要更多的buffer)

cluster.routing.allocation.disk.include_relocations: false (加快shard分配,在建索引的時候,不考慮遷移的任務)

熔斷circuit-breaker調整(調低,減小OOM風險):

indices.breaker.total.limit: 50%

indices.breaker.request.limit: 10%

indices.breaker.fielddata.limit: 10%

cluster.routing.allocation.same_shard.host:true

如果機器具有128 GB的RAM,可以運行兩個節點,每個節點配置31GB內存,Lucene將使用剩余64GB內存。如果這樣搭建data節點,在配置中設置cluster.routing.allocation.same_shard.host為true。這將阻止主副本分片被分配到同一台物理機,提高可用性。

 

四、設置合理的分片數和副本數:

1.對於數據量較小(100GB以下)的index:一般設置3~5個shard

2.對於數據量較大(100GB以上)的index:一般把單個shard的數據量控制在20GB~40GB

3.對於30G內存的節點,shard數量最好控制在600個(即每1GB內存的shard數在20以內)

4.副本數:一般副本數為1,對數據可用性有高要求的,可以設置為2

 

五、索引合並、段合並(Segment Merge)

1.通過_forcemerge API進行合並,減少segments數量,同時提高查詢效率:

2.max_num_segments取值為:max_num_segments =(單個索引的大小G/分片數/2G)

3.通過_reindex API將歷史小索引合並成大索引,減少索引數和分片數。

 

六、時序數據:

1.合理按天、周、月、年去創建、關閉、刪除索引。

2.索引太多時,索引預創建:每天定時任務把明天需要的索引先創建好。

3.從6.7版本開始kibana自帶索引生命周期管理ILM(Indice Life Management)

 

七、寫入:

1.使用批量請求bulk request。

2.盡量使用自動生成的ID。Elasticsearch自動生成的ID可以確保是唯一的,以避免版本查詢。

3.避免索引大的document數據,如超過100M的一條document。

4.減少副本數,字段不分詞,可增加寫入性能。

 

八、查詢:

1.盡量使用filter而不是query。使用filter不會計算評分score,只計算匹配。

2.如果不關心文檔返回的順序,則按_doc排序。

3.避免通配符查詢。

4.不要獲取太大的結果數據集,如果需要大量數據使用scroll API。
分頁查詢使用:from+size
遍歷使用:scroll
並行遍歷使用:scroll+slice

5.合理設置聚合的size:聚合結果是不精確的,聚合的結果是取每個分片的Top size元素后綜合排序后的值。盡量不要獲取全量聚合結果,從業務層面取TopN聚合結果值是合理的。

 

 

參考:

https://cloud.tencent.com/developer/article/1357698

https://www.elastic.co/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster 

https://www.elastic.co/guide/en/elasticsearch/reference/6.2/general-recommendations.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-disk-usage.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM