版本配置:html
ES版本:6.2.4bootstrap
OS內存64G。緩存
1、安裝部署:架構
1.ES jvm內存31G,預留一半的物理內存給文件系統緩存(file system cache)。app
2.禁止內存交換:異步
修改/etc/sysctl.conf 中 vm.swappiness = 1jvm
elasticsearch.yml中,設置這個:bootstrap.mlockall:trueasync
3.修改ES啓動用戶可以使用的系統文件句柄數等。elasticsearch
4.有條件使用更好的硬盤如ssd。ide
5.若是有多塊盤:
1)作RAID0或者RAID5,RAID能夠提升磁盤IO,可是風險就是一塊硬盤故障整個就故障。
2)每一個盤mount到一個目錄,data path配置多個。
6.節點分開部署:master、data、coordinate
7.冷熱分離架構:熱數據SSD存儲,冷數據普通硬盤存儲。
2、合理的Index Mapping:
1.特殊字段:如Boolean、IP、時間等。
2.字符串:儘可能使用keyword,默認的text會被analyze。keyword最大32766字節。
3.調整refresh間隔:refresh_interval: 30s,默認的1秒會致使大量segment產生,影響性能。
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"
}
}
}
}
3、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。這將阻止主副本分片被分配到同一臺物理機,提升可用性。
4、設置合理的分片數和副本數:
1.對於數據量較小(100GB如下)的index:通常設置3~5個shard
2.對於數據量較大(100GB以上)的index:通常把單個shard的數據量控制在20GB~40GB
3.對於30G內存的節點,shard數量最好控制在600個(即每1GB內存的shard數在20之內)
4.副本數:通常副本數爲1,對數據可用性有高要求的,能夠設置爲2
5、索引合併、段合併(Segment Merge)
1.經過_forcemerge API進行合併,減小segments數量,同時提升查詢效率:
2.max_num_segments取值爲:max_num_segments =(單個索引的大小G/分片數/2G)
3.經過_reindex API將歷史小索引合併成大索引,減小索引數和分片數。
6、時序數據:
1.合理按天、周、月、年去建立、關閉、刪除索引。
2.索引太多時,索引預建立:天天定時任務把明天須要的索引先建立好。
3.從6.7版本開始kibana自帶索引生命週期管理ILM(Indice Life Management)
7、寫入:
1.使用批量請求bulk request。
2.儘可能使用自動生成的ID。Elasticsearch自動生成的ID能夠確保是惟一的,以免版本查詢。
3.避免索引大的document數據,如超過100M的一條document。
4.減小副本數,字段不分詞,可增長寫入性能。
8、查詢:
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