Elasticsearch參數調優


一、概述

為了避免Elasticsearch性能不足,需要對默認參數做一些優化。

本文采用elasticsearch:7.10.1,切勿低於7.x版本。

 

二、系統層面調優

系統層面的調優主要是內存的設定避免交換內存

ES 安裝后默認設置的堆內存是 1GB,這很明顯是不夠的,那么接下來就會有一個問題出現:我們要設置多少內存給 ES 呢?

其實這是要看我們集群節點的內存大小,還取決於我們是否在服務器節點上還是否要部署其他服務。

  • 如果內存相對很大,如 64G 及以上,並且我們不在 ES 集群上部署其他服務,那么我建議 ES 內存可以設置為 31G-32G,因為這里有一個 32G 性能瓶頸問題,直白的說就是即使你給了 ES 集群大於 32G 的內存,其性能也不一定會更加優良,甚至會不如設置為 31G-32G 時候的性能。
  • 以我調優的集群為例,我所調優的服務器節點內存為 64G,服務器節點上也基本不跑其他服務,所以我把 ES 集群內存大小設置為了 31G,以充分發揮集群性能。
  • 設置 ES 集群內存的時候,還有一點就是確保堆內存最小值(Xms)與最大值(Xmx)的大小是相同的,防止程序在運行時改變堆內存大小,這是一個很耗系統資源的過程。
  • 還有一點就是避免交換內存,在操作系統層面進行關閉內存交換。

 

三、分配與副本

  • 分片 (shard):ES 是一個分布式的搜索引擎, 索引通常都會分解成不同部分, 分布在不同節點的部分數據就是分片。ES 自動管理和組織分片, 並在必要的時候對分片數據進行再平衡分配, 所以用戶基本上不用擔心分片的處理細節。創建索引時默認的分片數為 5 個,並且一旦創建不能更改。

  • 副本 (replica):ES 默認創建一份副本,就是說在 5 個主分片的基礎上,每個主分片都相應的有一個副本分片。額外的副本有利有弊,有副本可以有更強的故障恢復能力,但也占了相應副本倍數的磁盤空間。

那我們在創建索引的時候,應該創建多少個分片與副本數呢?

  • 對於副本數,比較好確定,可以根據我們集群節點的多少與我們的存儲空間決定,我們的集群服務器多,並且有足夠大多存儲空間,可以多設置副本數,一般是 1-3 個副本數,如果集群服務器相對較少並且存儲空間沒有那么寬松,則可以只設定一份副本以保證容災(副本數可以動態調整)。

  • 對於分片數,是比較難確定的。因為一個索引分片數一旦確定,就不能更改,所以我們在創建索引前,要充分的考慮到,以后我們創建的索引所存儲的數據量,否則創建了不合適的分片數,會對我們的性能造成很大的影響。

 

四、參數調優

elasticsearch.yml中增加如下設置

# 參數優化#######################################
indices.memory.index_buffer_size: 20%
indices.memory.min_index_buffer_size: 96mb

# Search pool
thread_pool.search.size: 5

indices.fielddata.cache.size: 40%

discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s

注意:我在參考文章的基礎上,刪除了一些參數。否則啟動會報錯,提示無效參數。 

 

索引優化

PUT /_template/elk
{
      "order": 6,
      "template": "logstash-*",    #這里配置模板匹配的Index名稱
      "settings": {
        "number_of_replicas" : 1,    #副本數
        "number_of_shards" :   3,    #分片數
         "refresh_interval": "30s",
         "index.translog.durability": "async",
        "index.translog.sync_interval": "30s"

      }
}

 

elasticsearch.yml優化參數詳解

Indexing 緩沖大小

indices.memory.index_buffer_size: 20%
indices.memory.min_index_buffer_size: 96mb

已經索引好的文檔會先存放在內存緩存中,等待被寫到到段(segment)中。緩存滿的時候會觸發段刷盤(吃i/o和cpu的操作)。默認最小緩存大小為48m,不太夠,最大為堆內存的10%。對於大量寫入的場景也顯得有點小。

 

搜索線程池大小

thread_pool.search.size: 5

用於計數/搜索/建議操作。線程池類型是固定的自動隊列大小,大小為int類型,初始隊列大小為1000。

計算公式:((cpu個數 * 3)/2)+1

 

設置filedata cache大小

indices.fielddata.cache.size: 40%

filedata cache的使用場景是一些聚合操作(包括排序),構建filedata cache是個相對昂貴的操作。所以盡量能讓他保留在內存中

然后日志場景聚合操作比較少,絕大多數也集中在半夜,所以限制了這個值的大小,默認是不受限制的,很可能占用過多的堆內存

 

設置節點之間的故障檢測配置

discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s

參數解釋

discovery.zen.fd.ping_interval 節點被 ping 的頻率,檢測節點是否存活
discovery.zen.fd.ping_timeout 節點存活響應的時間,默認為 30s,如果網絡可能存在隱患,可以適當調大
discovery.zen.fd.ping_retries ping 失敗/超時多少導致節點被視為失敗,默認為 3

 

大數量寫入的場景,會占用大量的網絡帶寬,很可能使節點之間的心跳超時。並且默認的心跳間隔也相對過於頻繁(1s檢測一次)

此項配置將大大緩解節點間的超時問題

 

索引優化參數詳解

副本數為1,需要查詢性能高可以設置為1。副本太多會占用磁盤,一般設置為1。

"number_of_replicas" : 1

 

#分片數為3,一般有多少個節點,設置多少個分片。

"number_of_shards" :   3

 

這個參數的意思是數據寫入后幾秒可以被搜索到,默認是 1s。每次索引的 refresh 會產生一個新的 lucene 段, 這會導致頻繁的合並行為,如果業務需求對實時性要求沒那么高,可以將此參數調大,實際調優告訴我,該參數確實很給力,cpu 使用率直線下降。

"refresh_interval": "30s",

 

這個可以異步寫硬盤,增大寫的速度

"index.translog.durability": "async",

 

sync間隔調高

"index.translog.sync_interval": "30s"

 

 

本文參考鏈接:

https://blog.csdn.net/wmj2004/article/details/80804411

https://blog.csdn.net/lijingjingchn/article/details/104502256

 


免責聲明!

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



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