Elasticsearch 參考指南(重要的系統配置)

重要的系統配置

理想狀況下,Elasticsearch應該在服務器上單獨運行,並使用全部可用的資源,爲了作到這一點,你須要配置你的操做系統,以容許運行Elasticsearch的用戶訪問默認容許的更多資源。html

在進行生產以前,必須考慮如下設置。java

開發模式vs生產模式

在默認狀況下,Elasticsearch假定你在開發模式下工做,若是上面的任何設置沒有正確配置,警告將會寫入到日誌文件,可是你能夠啓動和運行你的Elasticsearch節點。node

只要你配置一個網絡設置,好比network.host,Elasticsearch假定你正在轉向生產,並將上述警告升級爲異常,這些異常將阻止你的Elasticsearch節點啓動,這是一個重要的安全措施,以確保你不會由於配置錯誤的服務器而丟失數據。shell

配置系統設置

在哪裏配置系統設置取決於你使用哪個包來安裝Elasticsearch,以及你正在使用的操做系統。bootstrap

當使用.zip.tar.gz包時,系統設置可配置爲:segmentfault

  • 使用ulimit臨時更改配置
  • /etc/security/limits.conf中持久性更改配置

當使用RPM或Debian包時,大多數系統設置都是在系統配置文件中設置的,可是,使用systemd的系統須要在systemd配置文件中指定系統限制。windows

ulimit

在Linux系統上,ulimit能夠用於臨時更改資源限制,在切換到要運行Elasticsearch的用戶以前,限制一般須要root身份設置。例如,要將打開文件句柄的數量(ulimit -n`)設置爲65,536,你能夠執行如下操做:緩存

sudo su  
ulimit -n 65536 
su elasticsearch
  • 切換到root身份
  • 更改打開文件的最大數量
  • 切換到elasticsearch用戶啓動Elasticsearch

新限制僅在當前會話期間適用,你能夠用ulimit -a查詢全部當前應用的限制。安全

/etc/security/limits.conf

在Linux系統上,能夠經過編輯/etc/security/limits.conf文件來爲特定用戶設置持久性限制配置,要將用戶打開的文件的最大數量設置爲65,536,請在limits.conf文件中添加如下一行:服務器

elasticsearch  -  nofile  65536

這個更改只會在下次elasticsearch用戶打開一個新會話時生效。

Ubuntu 和 limits.conf
Ubuntu忽略了使用 init.d啓動的進程的 limits.conf文件,爲了啓用 limits.conf文件,編輯 /etc/pam.d/su而且取消下面行的註釋:
# session    required   pam_limits.so

Sysconfig 文件

當使用RPM或Debian包時,系統設置和環境變量能夠在系統配置文件中指定,它們位於:

  • RPM:/etc/sysconfig/elasticsearch
  • Debian:/etc/default/elasticsearch

然而,對於使用systemd的系統,系統限制須要經過systemd來指定。

Systemd 配置

當在使用systemd的系統上使用RPM或Debian包時,必須經過systemd指定系統限制。

systemd服務文件(/usr/lib/systemd/system/elasticsearch.service)包含默認的應用限制。

要覆蓋它們,添加一個名爲etc/systemd/system/elasticsearch.service.d/override.conf的文件(或者,你能夠運行sudo systemctl edit elasticsearch,它在默認編輯器中自動打開文件),在此文件中設置任何更改,例如:

[Service]
LimitMEMLOCK=infinity

完成後,運行如下命令從新加載單元:

sudo systemctl daemon-reload

禁用swapping

大多數操做系統嘗試使用盡量多的內存用於文件系統緩存,並急切地交換未使用的應用程序內存,這可能致使JVM堆的某些部分甚至可執行頁面被交換到磁盤。

交換對性能、節點穩定性都很是不利,應該不惜一切代價避免交換,它能夠致使垃圾收集持續幾分鐘而不是幾毫秒,還能夠致使節點響應緩慢,甚至斷開與集羣的鏈接,在彈性分佈式系統中,它更有效的讓操做系統殺死節點。

禁用交換有三種方法,首選的選項是徹底禁用交換,若是這不是一個選項,是否選擇最小化的swappiness仍是內存鎖定取決於你的環境。

禁用全部交換文件

一般,Elasticsearch是一個容器上的惟一服務,而且它的內存使用由JVM選項控制,應該不須要啓用交換。

在Linux系統上,能夠運行如下命令暫時禁用交換:

sudo swapoff -a

要永久禁用它,你須要編輯/etc/fstab文件,並註釋掉任何包含單詞swap的行。

在Windows上,能夠經過徹底禁用分頁文件來實現等效功能,經過System Properties → Advanced → Performance → Advanced → Virtual memory

配置 swappiness

Linux系統上的另外一個可用選項是確保sysctl值vm.swappiness設置爲1,這減小了內核交換的趨勢,在正常狀況下不該該引發交換,同時仍然容許整個系統在緊急狀況下交換。

啓用 bootstrap.memory_lock

另外一種選擇是在Linux/Unix系統上使用mlockall,或者在Windows上使用VirtualLock,嘗試將進程地址空間鎖定到RAM中,以防止任何Elasticsearch內存被交換出去,這能夠經過向config/elasticsearch.yml文件中添加這一行來實現:

bootstrap.memory_lock: true
mlockall可能會致使JVM或shell會話退出,若是它試圖分配超過可用內存的內存!

在啓動Elasticsearch以後,經過檢查該請求的輸出中的mlockall的值,你能夠看到是否成功應用了此設置:

GET _nodes?filter_path=**.mlockall

若是你看到mlockallfalse,那麼這意味着mlockall請求失敗了,你還將看到日誌中包含更多信息Unable to lock JVM Memory詞語的行。

在Linux/Unix系統上,最可能的緣由是運行Elasticsearch的用戶沒有鎖內存的權限,這能夠被授予以下:

.zip.tar.gz
  • 在啓動Elasticsearch以前做爲root身份設置ulimit -l unlimited,或在/etc/security/limit.conf中將memlock設置爲unlimited
RPM和Debian
  • 在系統配置文件中將MAX_LOCKED_MEMORY設置爲unlimited(或參閱下面使用systemd的系統)。
使用systemd的系統
  • systemd配置中將LimitMEMLOCK設置爲infinity

mlockall失敗的另外一個可能緣由是臨時目錄(一般是/tmp)與noexec選項一塊兒掛載,這能夠經過使用ES_JAVA_OPTS環境變量指定一個新的臨時目錄來解決:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch

或者在jvm.options配置文件中設置這個JVM標誌。

文件描述符

這隻適用於Linux和macOS,若是在Windows上運行Elasticsearch,則能夠被安全地忽略,在Windows上,JVM使用的 API僅限於可用資源。

Elasticsearch使用大量的文件描述符或文件句柄,耗盡文件描述符多是災難性的,而且極可能致使數據丟失,確保將運行Elasticsearch的用戶打開的文件描述符的數量限制增長到65,536或更高。

對於.zip.tar.gz包,在啓動Elasticsearch以前做爲root身份設置ulimit -n 65536,或在/etc/security/limits.conf中設置nofile65536

在macOS上,你還必須將JVM選項-XX:-MaxFDLimit傳遞給Elasticsearch,以便使用更高的文件描述符限制。

RPM和Debian軟件包默認文件描述符的最大數量爲65536,不須要進一步配置。

你可使用節點Stats API檢查爲每一個節點配置的max_file_descriptors,使用:

GET _nodes/stats/process?filter_path=**.max_file_descriptors

虛擬內存

Elasticsearch默認使用mmapfs目錄存儲索引,mmap計數的默認操做系統限制可能過低,這可能致使內存不足異常。

在Linux上,能夠經過以root身份運行如下命令來增長限制:

sysctl -w vm.max_map_count=262144

要永久設置此值,請更新在/etc/sysctl.conf中的vm.max_map_count設置,要驗證從新引導後的效果,請運行sysctl vm.max_map_count

RPM和Debian包將自動配置此設置,不須要進一步的配置。

線程數

Elasticsearch爲不一樣類型的操做使用許多線程池,重要的是,它可以在須要時建立新的線程,確保Elasticsearch用戶可以建立的線程數至少是4096個。

這能夠經過在啓動Elasticsearch以前做爲root身份設置ulimit -u 4096,或者在/etc/security/limit.conf中將nproc設置爲4096來實現。

看成爲服務在systemd下運行時,包發行版將爲Elasticsearch進程自動配置線程數,不須要額外的配置。

DNS緩存設置

Elasticsearch運行時有一個安全管理器,有了安全管理器,JVM默認無限期地緩存積極的主機名解析。若是你的Elasticsearch節點在DNS解析隨時間變化的環境中依賴於DNS(例如,節點到節點的發現),那麼你可能須要修改默認的JVM行爲,這能夠經過添加networkaddress.cache.ttl=<timeout>到你的Java安全策略來修改。任何未能解析的主機將被記錄,還要注意,在Java安全管理器就緒後,JVM默認緩存負主機名解析時間爲10秒,這能夠經過添加networkaddress.cache.ttl=<timeout>到你的Java安全策略來修改。


上一篇:重要的Elasticsearch配置

下一篇:引導檢查

相關文章
相關標籤/搜索