上線必備 | 高性能ES5.X部署配置清單

| 題記 |html

網上當前(截止20170914)流傳的各類配置文件普通存在如下問題: java

1)版本低,不能和當前版本5.X匹配。 node

2)5.X的配置自己較1.X,2.X就有很大不一樣,原有配置已不適用。 git

3)ES英文、中文文檔也沒有及時更新。github

如今,確保ES5.X的高性能到底須要哪些配置愈加使人神往。bootstrap

如下清單內容參考了ES官網文檔,且都是在ES5.4.0的環境中驗證過的,請放心使用。vim

清單1:瞭解ES集羣拓撲結構服務器

您須要肯定您的部署拓撲,以便作出正確的Elasticsearch配置決策。併發

當咱們啓動Elasticsearch的實例,就會啓動至少一個節點。相同集羣名的多個節點的鏈接組成一個集羣,app

在默認狀況下,集羣中的每一個節點均可以處理Http請求和集羣節點的數據傳輸。

集羣中的全部的節點都知道集羣中其餘全部的節點,能夠將客戶端請求轉發到適當的節點。
瞭解節點的類別,以下

主節點(master):

node.master:true node.data:false

數據節點(data):

node.master:false node.data:true

客戶端/路由節點(client):

node.master:false node.data:false

默認狀況下,節點同時是主節點和數據節點,這適合小集羣(3個節點);大於3個節點後,分離主節點和數據節點變得很是重要。

清單2:配置線程池

儘可能不要動線程池這個配置,若是要動,建議改成:
int(( 核心數 3 )/ 2 )+ 1 。
同時知足:不容許bulk和’indexing’線程池的大小大於CPU內核數。

舉例:24核處理器,檢索服務器是24核,因此:線程池的大小

=(24*3)/2+1=37,

同時要知足cpu核數爲24。37和24取最小值,應該選擇24。

默認的隊列大小是1000,
如今的問題是:併發請求數據超過了隊列最大的大小,致使出錯。

可能的解決方案:

1)、增長隊列大小;(太大了,可能會致使內存溢出)

2)、增長節點數和副本數。

隊列大小:
在elasticsearch.yml中新增以下配置(5.X已經驗證):

Threadpool Settings

Search pool

thread_pool.search.size: 24
thread_pool.search.queue_size: 2000

#Bulk pool
thread_pool.bulk.size: 24
thread_pool.bulk.queue_size: 1000

Index pool

thread_pool.index.size: 24
thread_pool.index.queue_size: 1000

若是你的批量請求數目高於隊列大小,將會出現RemoteTransportException異常。

清單3:配置堆內存

Elasticsearch 默認安裝後設置的堆內存是 1 GB。

修改方式一:

以下環境變量修改方式,指定堆內存大小爲4g。
export ES_HEAP_SIZE=4g

修改方式二:

命令行啓動設置方式。
./bin/elasticsearch -Xmx4g -Xms4g

修改方式三:(5.x版本建議)
修改 jvm.options配置文件。

Xms represents the initial size of total heap space

Xmx represents the maximum size of total heap space

-Xms4g
-Xmx4g
確保堆內存最小值( Xms )與最大值( Xmx )的大小是相同的,防止程序在運行時改變堆內存大小, 這是一個很耗系統資源的過程。

修改後查看:

[elasticsearch@4da2 bin]$ ps -ef | grep elasticsearch
root 17501 17474 0 Sep13 pts/2 00:00:00
su elasticsearch500 20389 1 17 04:31
pts/2 00:00:47 /usr/java/jdk1.8.0_91/bin/java
-Xms4g -Xmx4g -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+DisableExplicitGC -XX:+AlwaysPreTouch
-server -Xss1m -Djava.awt.headless=true
-Dfile.encoding=UTF-8 -Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
-XX:+HeapDumpOnOutOfMemoryError
-Des.path.home=/opt/elasticsearch
-cp /opt/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
注意:
最大可分配堆內存大小爲:
32GB與當前ES宿主機內存兩者的最小值。

舉例1):ES宿主機內存:128GB,可供分配的堆內存:32GB。(建議31GB)

舉例2):ES宿主機內存:32GB,可供分配的堆內存:16GB。

清單4:禁止swapping操做

在你的 elasticsearch.yml 文件中的Memory部分,修改設置以下:

bootstrap.memory_lock : true

核心緣由:內存交換 到磁盤對服務器性能來講是 致命 的。
早期的版本叫:bootstrap.mlockall,

5.X版本更名爲:bootstrap.memory_lock。

清單5:配置文件描述符數目

切換到ES的啓動帳戶,如Elasticsearch。

步驟1)設置環境變量。
vim /etc/profile
增長

ulimit -n 65535
用以設定同一時間打開的文件數的最大值爲65535。
source /etc/profile 使得命令生效。

步驟2)修改limits.conf配置文件。
/etc/security/limits.conf
增長

  • soft nofile 65536
  • hard nofile 65536
    用來限制打開文件數65535

步驟3)切換到Elasticsearch用戶,使用ulimit -a 查看是否修改爲功。
[root@4da2 elasticsearch]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 516047

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 65535

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 4096

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

核心緣由: Elasticsearch 在節點和 HTTP 客戶端之間進行通訊也使用了大量的套接字(注:sockets)。 全部這一切都須要足夠的文件描述符。

而: 許多現代的 Linux 發行版本,每一個進程默認容許一個微不足道的 1024 文件描述符。這對一個小的 Elasticsearch 節點來講實在是太 低 了,更不用說一個處理數以百計索引的節點。

清單6:修改最大映射數量MMP

Elasticsearch 對各類文件混合使用了 NioFs( 非阻塞文件系統)和 MMapFs ( 內存映射文件系統)。

請確保你配置的最大映射數量,以便有足夠的虛擬內存可用於 mmapped 文件。這能夠暫時設置:

sysctl -w vm.max_map_count=262144
或者你能夠在 /etc/sysctl.conf 經過修改 vm.max_map_count 永久設置它。

[root@4ad # tail -f /etc/sysctl.confvm.max_map_count=262144
實施生成環境或者部署ES環境供使用以前,請仔細覈對以上清單列表。

小結

確保ES的高性能是一個永恆的話題,還有很長的路要走。
讓咱們一塊兒精進,高效習得ES技能!

[1] 5.X版本的配置變化:
https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_50_settings_changes.html
[2] 線程池大小問題
https://github.com/elastic/elasticsearch/issues/15582
[3] swap配置
https://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html

相關文章
相關標籤/搜索