Elasticsearch集群調優


系統調優

  • 禁用swap
    使用swapoff命令可以暫時關閉swap。永久關閉需要編輯/etc/fstab,注釋掉swap設備的掛載項。

swapoff -a

如果完全關閉swap不可行,可以試着降低swap使用的優先級,執行

sysctl vm.swappiness = 1

並編輯/etc/sysctl.conf,加入swappiness設置。
如果因為一些原因,無法對swap進行操作,可以將ES配置中的memory_lock設置為true,從JVM層面保證內存數據不被交換到swap中。

bootstrap.memory_lock: true

要注意的是,linux系統對lock memory的大小有限制(調整方法見下),可以通過ES接口查看是否設置成功。

GET /_nodes?filter_path=**.mlockall&pretty

  • 調整io策略
    推薦使用的調度策略如下:
    HDD: cfq
    SSD: noop / deadline
    NVMe: none

io策略通過block scheduler接口查看和調整。

/sys/block/sd*/queue/scheduler

  • 關閉Access Time更新
    掛載目錄時,指定文件系統選項"noatime","nodiratime",關閉文件access time更新,可以節省大量的io帶寬。

  • 調整系統限額
    調整打開文件數量限制

ulimit -n 65535

調整lock memory大小限制

ulimit -l unlimited

調整stack大小限制

ulimit -s unlimited

ES使用mmapfs方式,將磁盤文件映射到內存上,這會導致占用大量的虛擬地址空間。系統默認值並不能滿足要求,可以通過sysctl調整。

sysctl -w vm.max_map_count=262144

以上命令只是暫時生效,想要持久化配置可以編輯/etc/security/limits.conf,/etc/sysctl.conf。

ES調優

  • 集群規划
    分離master節點,data節點和client節點。data節點只用來存儲,索引數據,外部的索引和查詢請求全部導向client節點,降低data節點的壓力。(data節點故障和恢復時,涉及到分片的恢復和遷移,會造成比較大的io負載,影響集群整體索引和查詢性能。)

  • 內存!內存!
    對於ES的jvm內存設置,推薦不要超過32G,超過32G一方面會降低內存利用效率,降低GC效率,消耗cpu帶寬(參見jvm compressed oops機制),另一方面可能導致不可知的問題。
    同時,要為ES所依賴的底層索引庫Lucene預留同等大小的內存。例如,一台內存64G(官方推薦配置,ideal sweet spot)大小的機器,可以為ES配置32G內存,另外32G預留給Lucene使用。
    對於大配置的機器,也不推薦為ES配置超過32G的內存,仍要堅持50%策略,通過單台多node的方式充分利用配置。例如,內存128G的機器,可以配置兩個node節點,每個node節點分配32G內存。
    同一台機器配置有多個data節點時,要防止單個分片的主副本都落在同一個機器上,失去副本的意義。設置如下:

cluster.routing.allocation.same_shard.host:true

另外,內存32G大小的限制,目前是為了觸發jvm的compressed oops機制,提高內存使用效率,但是由於平台和jvm版本的差異,這個閾值並不是恰好為32G,需要自行進行測試,獲取一個最佳值。

java -Xmx32600m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops

  • 分片建議
    分片的大小和數量之間需要一個平衡:分片過小數量過大會產生更大的集群狀態信息,更多的segment文件,占用更多jvm內存,分片過大數量過小則會影響查詢性能。
  1. 使用time-base的索引格式,控制索引(分片)大小,便於動態調整。
  2. 單分片平均大小在20G~40G之間,不要超過50G。
  3. 保證每GB內存對應20~25分片
  4. 通過測試獲取最佳值benchmark using realistic data and queries
  • 集群發現使用單播
    出於可靠和安全考慮,使用單播方式做集群發現。

discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

  • 關閉Data節點http
    對於數據加點,關閉http功能,同時也不要安裝head, bigdesk, marvel等監控插件,保證數據節點只處理索引,查詢,合並等相關數據操作。

http.enabled: false

  • 設置最小選舉數
    防止腦裂,將最小選舉數

discovery.zen.minimum_master_nodes:

設置為

(number of master-eligible nodes / 2) + 1

  • 設置故障恢復閾值
    ES集群在故障恢復的初期,由於部分節點還未恢復服務,ES會檢測到大量分片處於非健康狀態,而進行分片的重建,遷移,造成不需要的資源開銷。通過合理設置恢復參數,可以有效避免上述問題:
    最小恢復節點數(存活節點數達到這個閾值,才會進行恢復)

gateway.recover_after_nodes: 80

集群節點數

gateway.expected_nodes: 100

恢復等待時間(達到節點規模閾值后,多久后開始執行恢復)

gateway.recover_after_time: 5m

參考文獻:
Elasticsearch Reference


免責聲明!

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



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