Elasticsearch 参考指南(重要的系统配置)
重要的系統(tǒng)配置
理想情況下,Elasticsearch應(yīng)該在服務(wù)器上單獨(dú)運(yùn)行,并使用所有可用的資源,為了做到這一點(diǎn),你需要配置你的操作系統(tǒng),以允許運(yùn)行Elasticsearch的用戶訪問默認(rèn)允許的更多資源。
在進(jìn)行生產(chǎn)之前,必須考慮以下設(shè)置。
開發(fā)模式vs生產(chǎn)模式
在默認(rèn)情況下,Elasticsearch假定你在開發(fā)模式下工作,如果上面的任何設(shè)置沒有正確配置,警告將會(huì)寫入到日志文件,但是你可以啟動(dòng)和運(yùn)行你的Elasticsearch節(jié)點(diǎn)。
只要你配置一個(gè)網(wǎng)絡(luò)設(shè)置,比如network.host,Elasticsearch假定你正在轉(zhuǎn)向生產(chǎn),并將上述警告升級(jí)為異常,這些異常將阻止你的Elasticsearch節(jié)點(diǎn)啟動(dòng),這是一個(gè)重要的安全措施,以確保你不會(huì)因?yàn)榕渲缅e(cuò)誤的服務(wù)器而丟失數(shù)據(jù)。
配置系統(tǒng)設(shè)置
在哪里配置系統(tǒng)設(shè)置取決于你使用哪一個(gè)包來安裝Elasticsearch,以及你正在使用的操作系統(tǒng)。
當(dāng)使用.zip或.tar.gz包時(shí),系統(tǒng)設(shè)置可配置為:
- 使用ulimit臨時(shí)更改配置
- 在/etc/security/limits.conf中持久性更改配置
當(dāng)使用RPM或Debian包時(shí),大多數(shù)系統(tǒng)設(shè)置都是在系統(tǒng)配置文件中設(shè)置的,但是,使用systemd的系統(tǒng)需要在systemd配置文件中指定系統(tǒng)限制。
ulimit
在Linux系統(tǒng)上,ulimit可以用于臨時(shí)更改資源限制,在切換到要運(yùn)行Elasticsearch的用戶之前,限制通常需要root身份設(shè)置。例如,要將打開文件句柄的數(shù)量(ulimit -n`)設(shè)置為65,536,你可以執(zhí)行以下操作:
sudo su ulimit -n 65536 su elasticsearch- 切換到root身份
- 更改打開文件的最大數(shù)量
- 切換到elasticsearch用戶啟動(dòng)Elasticsearch
新限制僅在當(dāng)前會(huì)話期間適用,你可以用ulimit -a查詢所有當(dāng)前應(yīng)用的限制。
/etc/security/limits.conf
在Linux系統(tǒng)上,可以通過編輯/etc/security/limits.conf文件來為特定用戶設(shè)置持久性限制配置,要將用戶打開的文件的最大數(shù)量設(shè)置為65,536,請(qǐng)?jiān)趌imits.conf文件中添加以下一行:
elasticsearch - nofile 65536這個(gè)更改只會(huì)在下次elasticsearch用戶打開一個(gè)新會(huì)話時(shí)生效。
Ubuntu 和 limits.confUbuntu忽略了使用init.d啟動(dòng)的進(jìn)程的limits.conf文件,為了啟用limits.conf文件,編輯/etc/pam.d/su并且取消下面行的注釋: # session required pam_limits.so
Sysconfig 文件
當(dāng)使用RPM或Debian包時(shí),系統(tǒng)設(shè)置和環(huán)境變量可以在系統(tǒng)配置文件中指定,它們位于:
- RPM:/etc/sysconfig/elasticsearch
- Debian:/etc/default/elasticsearch
然而,對(duì)于使用systemd的系統(tǒng),系統(tǒng)限制需要通過systemd來指定。
Systemd 配置
當(dāng)在使用systemd的系統(tǒng)上使用RPM或Debian包時(shí),必須通過systemd指定系統(tǒng)限制。
systemd服務(wù)文件(/usr/lib/systemd/system/elasticsearch.service)包含默認(rèn)的應(yīng)用限制。
要覆蓋它們,添加一個(gè)名為etc/systemd/system/elasticsearch.service.d/override.conf的文件(或者,你可以運(yùn)行sudo systemctl edit elasticsearch,它在默認(rèn)編輯器中自動(dòng)打開文件),在此文件中設(shè)置任何更改,例如:
[Service] LimitMEMLOCK=infinity完成后,運(yùn)行以下命令重新加載單元:
sudo systemctl daemon-reload禁用swapping
大多數(shù)操作系統(tǒng)嘗試使用盡可能多的內(nèi)存用于文件系統(tǒng)緩存,并急切地交換未使用的應(yīng)用程序內(nèi)存,這可能導(dǎo)致JVM堆的某些部分甚至可執(zhí)行頁面被交換到磁盤。
交換對(duì)性能、節(jié)點(diǎn)穩(wěn)定性都非常不利,應(yīng)該不惜一切代價(jià)避免交換,它可以導(dǎo)致垃圾收集持續(xù)幾分鐘而不是幾毫秒,還可以導(dǎo)致節(jié)點(diǎn)響應(yīng)緩慢,甚至斷開與集群的連接,在彈性分布式系統(tǒng)中,它更有效的讓操作系統(tǒng)殺死節(jié)點(diǎn)。
禁用交換有三種方法,首選的選項(xiàng)是完全禁用交換,如果這不是一個(gè)選項(xiàng),是否選擇最小化的swappiness還是內(nèi)存鎖定取決于你的環(huán)境。
禁用所有交換文件
通常,Elasticsearch是一個(gè)容器上的唯一服務(wù),并且它的內(nèi)存使用由JVM選項(xiàng)控制,應(yīng)該不需要啟用交換。
在Linux系統(tǒng)上,可以運(yùn)行以下命令暫時(shí)禁用交換:
sudo swapoff -a要永久禁用它,你需要編輯/etc/fstab文件,并注釋掉任何包含單詞swap的行。
在Windows上,可以通過完全禁用分頁文件來實(shí)現(xiàn)等效功能,通過System Properties → Advanced → Performance → Advanced → Virtual memory。
配置 swappiness
Linux系統(tǒng)上的另一個(gè)可用選項(xiàng)是確保sysctl值vm.swappiness設(shè)置為1,這減少了內(nèi)核交換的趨勢,在正常情況下不應(yīng)該引起交換,同時(shí)仍然允許整個(gè)系統(tǒng)在緊急情況下交換。
啟用 bootstrap.memory_lock
另一種選擇是在Linux/Unix系統(tǒng)上使用mlockall,或者在Windows上使用VirtualLock,嘗試將進(jìn)程地址空間鎖定到RAM中,以防止任何Elasticsearch內(nèi)存被交換出去,這可以通過向config/elasticsearch.yml文件中添加這一行來實(shí)現(xiàn):
bootstrap.memory_lock: true mlockall可能會(huì)導(dǎo)致JVM或shell會(huì)話退出,如果它試圖分配超過可用內(nèi)存的內(nèi)存!在啟動(dòng)Elasticsearch之后,通過檢查該請(qǐng)求的輸出中的mlockall的值,你可以看到是否成功應(yīng)用了此設(shè)置:
GET _nodes?filter_path=**.mlockall如果你看到mlockall為false,那么這意味著mlockall請(qǐng)求失敗了,你還將看到日志中包含更多信息Unable to lock JVM Memory詞語的行。
在Linux/Unix系統(tǒng)上,最可能的原因是運(yùn)行Elasticsearch的用戶沒有鎖內(nèi)存的權(quán)限,這可以被授予如下:
.zip和.tar.gz
- 在啟動(dòng)Elasticsearch之前作為root身份設(shè)置ulimit -l unlimited,或在/etc/security/limit.conf中將memlock設(shè)置為unlimited。
RPM和Debian
- 在系統(tǒng)配置文件中將MAX_LOCKED_MEMORY設(shè)置為unlimited(或參閱下面使用systemd的系統(tǒng))。
使用systemd的系統(tǒng)
- 在systemd配置中將LimitMEMLOCK設(shè)置為infinity。
mlockall失敗的另一個(gè)可能原因是臨時(shí)目錄(通常是/tmp)與noexec選項(xiàng)一起掛載,這可以通過使用ES_JAVA_OPTS環(huán)境變量指定一個(gè)新的臨時(shí)目錄來解決:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" ./bin/elasticsearch或者在jvm.options配置文件中設(shè)置這個(gè)JVM標(biāo)志。
文件描述符
這只適用于Linux和macOS,如果在Windows上運(yùn)行Elasticsearch,則可以被安全地忽略,在Windows上,JVM使用的API僅限于可用資源。Elasticsearch使用大量的文件描述符或文件句柄,耗盡文件描述符可能是災(zāi)難性的,并且很可能導(dǎo)致數(shù)據(jù)丟失,確保將運(yùn)行Elasticsearch的用戶打開的文件描述符的數(shù)量限制增加到65,536或更高。
對(duì)于.zip和.tar.gz包,在啟動(dòng)Elasticsearch之前作為root身份設(shè)置ulimit -n 65536,或在/etc/security/limits.conf中設(shè)置nofile為65536。
在macOS上,你還必須將JVM選項(xiàng)-XX:-MaxFDLimit傳遞給Elasticsearch,以便使用更高的文件描述符限制。
RPM和Debian軟件包默認(rèn)文件描述符的最大數(shù)量為65536,不需要進(jìn)一步配置。
你可以使用節(jié)點(diǎn)Stats API檢查為每個(gè)節(jié)點(diǎn)配置的max_file_descriptors,使用:
GET _nodes/stats/process?filter_path=**.max_file_descriptors虛擬內(nèi)存
Elasticsearch默認(rèn)使用mmapfs目錄存儲(chǔ)索引,mmap計(jì)數(shù)的默認(rèn)操作系統(tǒng)限制可能太低,這可能導(dǎo)致內(nèi)存不足異常。
在Linux上,可以通過以root身份運(yùn)行以下命令來增加限制:
sysctl -w vm.max_map_count=262144要永久設(shè)置此值,請(qǐng)更新在/etc/sysctl.conf中的vm.max_map_count設(shè)置,要驗(yàn)證重新引導(dǎo)后的效果,請(qǐng)運(yùn)行sysctl vm.max_map_count。
RPM和Debian包將自動(dòng)配置此設(shè)置,不需要進(jìn)一步的配置。
線程數(shù)
Elasticsearch為不同類型的操作使用許多線程池,重要的是,它能夠在需要時(shí)創(chuàng)建新的線程,確保Elasticsearch用戶能夠創(chuàng)建的線程數(shù)至少是4096個(gè)。
這可以通過在啟動(dòng)Elasticsearch之前作為root身份設(shè)置ulimit -u 4096,或者在/etc/security/limit.conf中將nproc設(shè)置為4096來實(shí)現(xiàn)。
當(dāng)作為服務(wù)在systemd下運(yùn)行時(shí),包發(fā)行版將為Elasticsearch進(jìn)程自動(dòng)配置線程數(shù),不需要額外的配置。
DNS緩存設(shè)置
Elasticsearch運(yùn)行時(shí)有一個(gè)安全管理器,有了安全管理器,JVM默認(rèn)無限期地緩存積極的主機(jī)名解析。如果你的Elasticsearch節(jié)點(diǎn)在DNS解析隨時(shí)間變化的環(huán)境中依賴于DNS(例如,節(jié)點(diǎn)到節(jié)點(diǎn)的發(fā)現(xiàn)),那么你可能需要修改默認(rèn)的JVM行為,這可以通過添加networkaddress.cache.ttl=<timeout>到你的Java安全策略來修改。任何未能解析的主機(jī)將被記錄,還要注意,在Java安全管理器就緒后,JVM默認(rèn)緩存負(fù)主機(jī)名解析時(shí)間為10秒,這可以通過添加networkaddress.cache.ttl=<timeout>到你的Java安全策略來修改。
上一篇:重要的Elasticsearch配置
下一篇:引導(dǎo)檢查
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch 参考指南(重要的系统配置)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb系列~mongodb慢语句
- 下一篇: 有始有终,设计一个结构合理的下载模块