ElasticSearch性能優化主要分爲4個方面的優化。
一、服務器部署
1、增加1-2臺服務器,用於負載均衡節點elasticSearch的配置文件中有2個參數:node.master和node.data。這兩個參數搭配使用時,能夠幫助提供服務器性能。
node.master: false
node.data: true
該node服務器只作爲一個數據節點,只用於存儲索引數據。使該node服務器功能 單一,只用於數據存儲和數據查詢,降低其資源消耗率。
node.master: true
node.data: false
該node服務器只作爲一個主節點,但不存儲任何索引數據。該node服務器將使用
自身空閒的資源,來協調各種創建索引請求或者查詢請求,講這些請求合理分發到相關 的node服務器上。
node.master: false
node.data: false
該node服務器即不會被選作主節點,也不會存儲任何索引數據。
該服務器主要用 於查詢負載均衡。在查詢的時候,通常會涉及到從多個node服務器上查詢數據,並請求分發到多個指定的node服務器,並對各個node服務器返回的結果進行一個彙總處理, 最終返回給客戶端。
注:服務器充足情況下可以根據上述配置
2、在生產環境儘量關閉data節點服務器中的http功能,同時也不要安裝head, bigdesk, marvel等監控 插件,這樣保證data節點服務器只需處理創建/更新/刪除/查詢索引數據等操作。http功能可以在非數據節點服務器上開啓,上述相關的監控插件也安裝到這些服 務器上,用於監控ElasticSearch集羣狀態等數據信息。這樣做一來出於數據安全考慮,二來出於服務性能考慮。
參數這樣設置:http.enabled: false
3、一臺服務器上最好只部署一個Node,一臺物理服務器上可以啓動多個Node服務器節點(通過設置不同的啓動port), 但一臺服務器上的CPU,內存,硬盤等資源畢竟有限,從服務器性能考慮,在生產環境下不建議一臺 服務器上啓動多個node節點。
二、服務器配置
1.配置索引線程池的大小ElastiSearch服務器有多個線程池大小配置。主要有:index,search,suggest,get,bulk,percolate,snapshot,snapshot_data,warmer,refresh。
在此主要針對index和search進行一個配置調整。
index:創建/更新/刪除索引數據。
Search:主要針對用戶的各種搜索操作。
具體配置如下:
threadpool:
index:
type: fixed
size: 24(邏輯核心數*3)
queue_ size: 1000
search:
type: fixed
size: 24(邏輯核心數*3)
queue_ size: 1000
2.確定分片(shard)的數量和副本(replica)的數量 ElasticSearch在創建索引數據時,最好指定相關的shards數量和replicas,否則會使用服務器中的默認配置參數shards=5,replicas=1。 因爲這兩個屬性的設置直接影響集羣中索引和搜索操作的執行。假設你有足夠的機器來持有碎片和副本,那麼可以按如下規則設置這兩個值:
1) 擁有更多的碎片可以提升索引執行能力,並允許通過機器分發一個大型的索引;
2) 擁有更多的副本能夠提升搜索執行能力以及集羣能力。對於一個索引來說,number_of_shards只能設置一次,而number_of_replicas可以使用索引更新設置API在任何時候被增加或者減少。這兩個配置參數在配置文件的配置如下:
index.number_of_shards: 5(第一次分片的數值)
index.number_of_replicas: 1(可變)
3.elasticsearch.yml log日誌其具體配置如下:
index.search.slowlog.level: INFO
index.search.slowlog.threshold.query.warn: 5s
index.search.slowlog.threshold.query.info: 2s
index.search.slowlog.threshold.query.debug: 500s
index.search.slowlog.threshold.query.trace: 500ms
index.search.slowlog.threshold.fetch.warn: 5s
index.search.slowlog.threshold.fetch.info: 2s
index.search.slowlog.threshold.fetch.debug: 500ms
index.search.slowlog.threshold.fetch.trace: 200ms