Elasticsearch 参考指南(重要的系统配置)
重要的系統配置
理想情況下,Elasticsearch應該在服務器上單獨運行,并使用所有可用的資源,為了做到這一點,你需要配置你的操作系統,以允許運行Elasticsearch的用戶訪問默認允許的更多資源。
在進行生產之前,必須考慮以下設置。
開發模式vs生產模式
在默認情況下,Elasticsearch假定你在開發模式下工作,如果上面的任何設置沒有正確配置,警告將會寫入到日志文件,但是你可以啟動和運行你的Elasticsearch節點。
只要你配置一個網絡設置,比如network.host,Elasticsearch假定你正在轉向生產,并將上述警告升級為異常,這些異常將阻止你的Elasticsearch節點啟動,這是一個重要的安全措施,以確保你不會因為配置錯誤的服務器而丟失數據。
配置系統設置
在哪里配置系統設置取決于你使用哪一個包來安裝Elasticsearch,以及你正在使用的操作系統。
當使用.zip或.tar.gz包時,系統設置可配置為:
- 使用ulimit臨時更改配置
- 在/etc/security/limits.conf中持久性更改配置
當使用RPM或Debian包時,大多數系統設置都是在系統配置文件中設置的,但是,使用systemd的系統需要在systemd配置文件中指定系統限制。
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.confUbuntu忽略了使用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如果你看到mlockall為false,那么這意味著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中設置nofile為65536。
在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配置
下一篇:引導檢查
總結
以上是生活随笔為你收集整理的Elasticsearch 参考指南(重要的系统配置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb系列~mongodb慢语句
- 下一篇: 有始有终,设计一个结构合理的下载模块