環(huán)境
CentOS-7-x86_64-DVD-2009.iso
https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
elasticsearch-7.10.0-linux-x86_64.tar.gz
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-10-0
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz
安裝
# mkdir -p /usr/local/elasticsearch # chown esuser:esuser /usr/local/elasticsearch # useradd esuser # passwd esuser # su - esuser $ mv elasticsearch-7.10.0-linux-x86_64.tar.gz /usr/local/elasticsearch/ $ cd /usr/local/elasticsearch/ $ tar -xvzf elasticsearch-7.10.0-linux-x86_64.tar.gz $ cd elasticsearch-7.10.0 $ ls bin config jdk lib LICENSE.txt logs modules NOTICE.txt plugins README.asciidoc
注意:默認(rèn)情況下,不允許使用root用戶運(yùn)行ES,會(huì)報(bào)錯(cuò):
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
前臺(tái)運(yùn)行
$ ./bin/elasticsearch
驗(yàn)證是否啟動(dòng)成功
$ curl localhost:9200/ { "name" : "localhost.localdomain", "cluster_name" : "elasticsearch", "cluster_uuid" : "8CLFbx4LSwW_maztFPGiTg", "version" : { "number" : "7.10.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96", "build_date" : "2020-11-09T2133.964949Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
說明:訪問地址要和config/elasticsearch.yml中network.host配置保持一致
后臺(tái)運(yùn)行
要將ES作為守護(hù)進(jìn)程運(yùn)行,請(qǐng)?jiān)诿钚猩现付?d,并使用-p選項(xiàng)將進(jìn)程ID記錄在文件中:
如果對(duì)ES密鑰庫進(jìn)行了密碼保護(hù),系統(tǒng)將提示你輸入密鑰庫的密碼。有關(guān)更多詳細(xì)信息,請(qǐng)參閱安全設(shè)置。日志消息可以在$ES_HOME/logs/目錄中找到。
$ ./bin/elasticsearch -d -p pid
關(guān)閉以守護(hù)進(jìn)程方式啟動(dòng)的ES,,殺死pid文件中記錄的進(jìn)程ID:
$ pkill -F pid
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/install-elasticsearch.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html#install-linux
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html#targz-running
配置
重要的Elasticsearch配置
Path配置
ES將索引的數(shù)據(jù)寫入索引,并將數(shù)據(jù)流寫入data目錄。ES將自己的應(yīng)用程序日志寫入logs目錄,其中包含有關(guān)集群健康和操作的信息。
對(duì)于macOS.tar.gz、Linux.tar.gz和Windows.zip安裝,默認(rèn)情況下data和logs是$ES_HOME的子目錄。但是,$ES_HOME中的文件在升級(jí)過程中有被刪除的風(fēng)險(xiǎn)。
在生產(chǎn)環(huán)境中,強(qiáng)烈建議將$ES_HOME/config/elasticsearch.yml中的path.data和path.logs設(shè)置為$ES_HOME之外的位置
類Unix系統(tǒng)中配置示例:
path: data: /var/data/elasticsearch logs: /var/log/elasticsearch
如果有必要,可以在path.data中指定多個(gè)路徑。ES在所有提供的路徑上存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù),但將每個(gè)分片的數(shù)據(jù)保持在同一路徑上。
注意:
ES不會(huì)在節(jié)點(diǎn)的數(shù)據(jù)路徑上均衡分片。單個(gè)路徑中的高磁盤使用率會(huì)觸發(fā)整個(gè)節(jié)點(diǎn)磁盤使用率高水位。如果觸發(fā),ES將不會(huì)向節(jié)點(diǎn)添加分片,即使節(jié)點(diǎn)的其他路徑有可用的磁盤空間。如果需要額外的磁盤空間,建議添加一個(gè)新節(jié)點(diǎn),而不是額外的數(shù)據(jù)路徑。
Linux和macOS安裝path.data支持多個(gè)類Unix風(fēng)格路徑:
path: data: - /mnt/elasticsearch_1 - /mnt/elasticsearch_2 - /mnt/elasticsearch_3
集群名稱配置
一個(gè)節(jié)點(diǎn)只有在與集群中的所有其他節(jié)點(diǎn)共享其cluster.name時(shí)才能加入集群。默認(rèn)名稱是elasticsearch,但應(yīng)該將其更改為描述集群用途的適當(dāng)名稱。
cluster.name: logging-prod
節(jié)點(diǎn)名稱配置
ES使用node.name作為ES特定實(shí)例的易讀標(biāo)識(shí)符。此名稱包含在許多API的響應(yīng)中。ES啟動(dòng)時(shí),節(jié)點(diǎn)名默認(rèn)為機(jī)器的主機(jī)名,但可以在elasticsearch.yml中顯式配置:
node.name: prod-data-2
網(wǎng)絡(luò)主機(jī)配置
默認(rèn)情況下,ES只綁定到環(huán)回地址,如127.0.0.1和[::1]。此綁定足以在服務(wù)器上運(yùn)行單個(gè)開發(fā)環(huán)境節(jié)點(diǎn)
注意:
可以從單個(gè)節(jié)點(diǎn)上的相同$ES_HOME位置啟動(dòng)多個(gè)節(jié)點(diǎn)。此設(shè)置可用于測(cè)試ES形成集群的能力,但不建議用于生產(chǎn)環(huán)境。
要與其他服務(wù)器上的節(jié)點(diǎn)形成集群,節(jié)點(diǎn)需要綁定到非環(huán)回地址。雖然有許多網(wǎng)絡(luò)設(shè)置,但通常只需配置network.host即可:
network.host: 192.168.1.10
network.host設(shè)置還可以理解一些特殊值,如_local_,_site_,_global_和修飾符,如:ip4和:ip6。請(qǐng)參閱network.host特殊值。
Discovery和集群信息配置
在投入生產(chǎn)之前,配置兩個(gè)重要的集群發(fā)現(xiàn)和形成設(shè)置,以便集群中的節(jié)點(diǎn)可以相互發(fā)現(xiàn)并選擇master節(jié)點(diǎn)。
discovery.seed_hosts
開箱即用,無需任何網(wǎng)絡(luò)配置,ES將綁定到可用的環(huán)回地址,并掃描本地端口9300到9305,以與同一服務(wù)器上運(yùn)行的其他節(jié)點(diǎn)連接。這種行為提供了一種自動(dòng)集群體驗(yàn),而無需進(jìn)行任何配置。
當(dāng)希望與其他主機(jī)上的節(jié)點(diǎn)形成集群時(shí),使用靜態(tài)“discovery.seed_hosts設(shè)置。此設(shè)置提供集群中其他節(jié)點(diǎn)的列表,這些節(jié)點(diǎn)符合master節(jié)點(diǎn)資格,可能處于活動(dòng)狀態(tài)并可聯(lián)系,以啟動(dòng)發(fā)現(xiàn)過程. 此設(shè)置接受集群中所有符合master節(jié)點(diǎn)條件的節(jié)點(diǎn)的YAML序列或地址數(shù)組。每個(gè)地址可以是IP地址,也可以是通過DNS解析為一個(gè)或多個(gè)IP地址的主機(jī)名。
discovery.seed_hosts: - 192.168.1.10:9300 - 192.168.1.11 - seeds.mydomain.com - [000c0a8:10c]:9301
端口號(hào)可選,默認(rèn)為9300, 可修改。
如果主機(jī)名解析為多個(gè)IP地址,則節(jié)點(diǎn)將嘗試在所有已解析的地址上發(fā)現(xiàn)其他節(jié)點(diǎn)。
IPv6地址必須括在方括號(hào)內(nèi)
如果符合master節(jié)點(diǎn)條件的節(jié)點(diǎn)沒有固定的名稱或地址,使用可選主機(jī)提供商動(dòng)態(tài)查找其地址。
cluster.initial_master_nodes
第一次啟動(dòng)ES集群時(shí),cluster bootstrapping步驟確定了在第一次選舉中投票的符合master節(jié)點(diǎn)資格的節(jié)點(diǎn)集。在開發(fā)模式下,在沒有配置發(fā)現(xiàn)設(shè)置的情況下,此步驟由節(jié)點(diǎn)本身自動(dòng)執(zhí)行。
因?yàn)樽詣?dòng)引導(dǎo)本質(zhì)上是不安全的,在生產(chǎn)模式下啟動(dòng)新集群時(shí),必須明確列出符合master節(jié)點(diǎn)資格的節(jié)點(diǎn),這些節(jié)點(diǎn)的投票應(yīng)在第一次選舉中被計(jì)算??梢允褂胏luster.initial_master_nodes設(shè)置來設(shè)置此列表。
在集群首次成功建立后,從每個(gè)節(jié)點(diǎn)的配置中刪除cluster.initial_master_nodes設(shè)置。重新啟動(dòng)群集或向現(xiàn)有群集添加新節(jié)點(diǎn)時(shí),請(qǐng)勿使用此設(shè)置。
discovery.seed_hosts: - 192.168.1.10:9300 - 192.168.1.11 - seeds.mydomain.com - [000c0a8:10c]:9301 cluster.initial_master_nodes: - master-node-a - master-node-b - master-node-c
通過node.name標(biāo)識(shí)初始master節(jié)點(diǎn)(https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html#node-name),默認(rèn)為其主機(jī)名。確保cluster.initial_master_nodes中的值與node.name完全匹配。如果使用完全限定域名(FQDN)作為節(jié)點(diǎn)名稱,例如master-node-a.example.com,則必須使用此列表中的FQDN。相反,如果node.name是一個(gè)沒有任何尾隨限定符的裸主機(jī)名,則還必須省略cluster.initial_master_nodes中的尾隨限定符。
查閱bootstrapping a cluster
堆大小配置
默認(rèn)情況下,ES告訴JVM使用一個(gè)最小和最大值都為1GB的堆。當(dāng)部署到生產(chǎn)環(huán)境時(shí),配置堆大小以確保ES有足夠的可用堆空間非常重要。
ES將通過Xms(最小堆大?。┖蚗mx(最大堆大?。┰O(shè)置分配jvm.options中指定的整個(gè)堆。Xms和Xmx設(shè)置必須彼此相等。
這些設(shè)置的值取決于服務(wù)器上可用的RAM量:
將Xmx和Xms設(shè)置為不超過物理RAM的50%。ES需要內(nèi)存用于JVM堆以外的目的,為此留出空間非常重要。例如,ES使用堆外緩沖區(qū)進(jìn)行高效的網(wǎng)絡(luò)通信,依賴于操作系統(tǒng)的文件系統(tǒng)緩存來高效訪問文件,JVM本身也需要一些內(nèi)存。ES進(jìn)程使用的內(nèi)存超過使用Xmx設(shè)置配置的限制是正常的。
將Xmx和Xms設(shè)置為不超過JVM用于壓縮對(duì)象指針的閾值。確切的閾值各不相同,但接近32GB??梢酝ㄟ^在日志中查找類似以下行來驗(yàn)證是否低于閾值:
heap size [1.9gb], compressed ordinary object pointers [true]
將Xmx和Xms設(shè)置為不超過從零開始的壓縮oops的閾值。確切的閾值各不相同,但26 GB在大多數(shù)系統(tǒng)上是安全的,在某些系統(tǒng)上可能高達(dá)30 GB??梢酝ㄟ^使用JVM選項(xiàng)-XX+PrintCompressedOopsMode啟動(dòng)ES,并查找類似以下行來驗(yàn)證是否低于此閾值:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
此行顯示啟用了從零開始的壓縮oops。如果未啟用從零開始的壓縮oops,你將看到類似以下行:
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
ES可用的堆越多,它可以用于內(nèi)部緩存的內(nèi)存就越多,但留給操作系統(tǒng)用于文件系統(tǒng)緩存的內(nèi)存越少。此外,較大的堆可能會(huì)導(dǎo)致垃圾收集暫停時(shí)間更長(zhǎng)。
下面是一個(gè)如何通過config/jvm.options.d/文件設(shè)置堆大小的示例:
-Xms2g -Xmx2g
將最小堆內(nèi)存和最大堆內(nèi)存都設(shè)置為 2g。
使用jvm.options.d是配置生產(chǎn)部署堆大小的首選方法。
備注:默認(rèn)情況下,jvm.options.d為空目錄,可以在該目錄下手動(dòng)新建配置,如jvm.options,文件格式可參考config/jvm.options
還可以通過ES_JAVA_OPTS環(huán)境變量設(shè)置堆大小。這通常不建議用于生產(chǎn)部署,但對(duì)于測(cè)試很有用,因?yàn)樗采w了設(shè)置JVM選項(xiàng)的所有其他方式。
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
1 設(shè)置最小堆內(nèi)存和最大堆內(nèi)存都為 2g。
2 設(shè)置最小堆內(nèi)存和最大堆內(nèi)存都為 4000 MB。
JVM 堆 dump路徑設(shè)置
默認(rèn)情況下,ES 配置JVM 將內(nèi)存不足的堆dump到默認(rèn)數(shù)據(jù)目錄。RPM以及Debian包,數(shù)據(jù)目錄為/var/lib/eelasticsearch。在Linux 和 MacOS 和Windows發(fā)行版中,data目錄位于ES安裝的根目錄下。如果此路徑不適合接收堆dump,則修改jvm.options中-XX:HeapDumpPath=…條目:
如果指定了一個(gè)目錄,JVM將根據(jù)運(yùn)行實(shí)例的PID為堆dump生成一個(gè)文件名。
如果指定固定文件名而不是目錄,則當(dāng)JVM需要對(duì)內(nèi)存不足的異常執(zhí)行堆dump時(shí),該文件必須不存在。否則,堆dump將失敗。
GC日志配置
默認(rèn)情況下,ES啟用垃圾收集(GC)日志。這些是在jvm.options配置的并且輸出到與ES日志相同的默認(rèn)位置。默認(rèn)配置每64 MB輪換一次日志,最多可消耗2 GB的磁盤空間。
可以使用JEP 158: 統(tǒng)一JVM日志中描述的命令行選項(xiàng)重新配置JVM日志記錄。除非直接更改默認(rèn)的jvm.options文件,否則除了你自己的設(shè)置外,還會(huì)應(yīng)用ES默認(rèn)配置。要禁用默認(rèn)配置,首先通過提供-Xlog:disable選項(xiàng)禁用日志,然后提供自己的命令行選項(xiàng)。這將禁用所有JVM日志,因此務(wù)必查看可用選項(xiàng)并啟用所需的一切。
要查看原始JEP中未包含的更多選項(xiàng),請(qǐng)參閱使用JVM統(tǒng)一日志框架啟用日志。
Examples
通過創(chuàng)建帶有一些示例選項(xiàng)的$ES_HOME/config/jvm.options.d/GC.options,將默認(rèn)GC日志輸出位置更改為/opt/my-app/gc.log:
# 關(guān)閉之前所有的日志記錄配置 -Xlog:disable # JEP 158的默認(rèn)設(shè)置,除了使用“utctime”而不是“uptime”來匹配下一行 -Xlog:all=warningutctime,level,tags # 使用各種選項(xiàng)將GC日志記錄到自定義位置 -Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,pid,tags:filecount=32,filesize=64m
配置ESDocker容器將GC調(diào)試日志發(fā)送到標(biāo)準(zhǔn)錯(cuò)誤(stderr)。這使容器編排器能夠處理輸出。如需使用ES_JAVA_OPTS環(huán)境變量,請(qǐng)指定:
MY_OPTS="-Xlog:disable -Xlog:all=warningutctime,level,tags -Xlog:gc=debugutctime" docker run -e ES_JAVA_OPTS="$MY_OPTS" # etc
臨時(shí)目錄設(shè)置
默認(rèn)情況下,ES使用啟動(dòng)腳本在系統(tǒng)臨時(shí)目錄下創(chuàng)建的私有臨時(shí)目錄。
在某些Linux發(fā)行版上,系統(tǒng)實(shí)用程序會(huì)將最近沒有訪問過的文件和目錄將從/tmp中刪除。這將導(dǎo)致ES運(yùn)行期間私有臨時(shí)目錄被刪除,如果需要使用臨時(shí)目錄的功能長(zhǎng)時(shí)間未使用的話。后續(xù)如果某些功能使用需要此臨時(shí)目錄,將會(huì)產(chǎn)生問題。
如果使用.deb或.rpm包安裝ES,并在systemd下運(yùn)行它,ES使用的私有臨時(shí)目錄將被排除在定期清理之外。
如果打算在Linux或MacOS上長(zhǎng)時(shí)間運(yùn)行.tar.gz發(fā)行版,考慮為ES創(chuàng)建一個(gè)專用的臨時(shí)目錄,將該目錄設(shè)置在不會(huì)從中清除舊文件和目錄的路徑下。此目錄應(yīng)設(shè)置權(quán)限,以便只有運(yùn)行ES的用戶可以訪問它。然后,在啟動(dòng)ES之前,將$ES_TMPDIR環(huán)境變量設(shè)置為指向此目錄
JVM致命錯(cuò)誤日志設(shè)置
默認(rèn)情況下,ES配置JVM將致命錯(cuò)誤日志寫入默認(rèn)日志目錄。針對(duì)RPM以及Debian包,該目錄為/var/log/elasticsearch。針對(duì)Linux,MacOS和Windows發(fā)行版中,logs目錄位于ES安裝目錄的根目錄下。
這些日志是JVM在遇到致命錯(cuò)誤(如分段錯(cuò)誤)時(shí)生成的日志。如果此路徑不適合接收日志,則修改jvm.options中-XX:ErrorFile=…條目
集群備份
快照可以防止因?yàn)闉?zāi)害導(dǎo)致的永久數(shù)據(jù)丟失??煺丈芷诠芾硎菍?duì)集群進(jìn)行定期備份的最簡(jiǎn)單方法。有關(guān)更多信息,請(qǐng)參閱集群備份.
注意:
不能通過簡(jiǎn)單地復(fù)制ES集群所有節(jié)點(diǎn)的數(shù)據(jù)目錄來備份ES。ES在運(yùn)行時(shí)可能會(huì)對(duì)其數(shù)據(jù)目錄的內(nèi)容進(jìn)行更改;復(fù)制其數(shù)據(jù)目錄不能保證其內(nèi)容的一致性。備份群集的唯一可靠方法是使用快照和還原功能。
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html
重要的系統(tǒng)配置
配置系統(tǒng)設(shè)置
在哪配置系統(tǒng)設(shè)置取決于用于安裝ES的軟件包以及使用的操作系統(tǒng)。
當(dāng)使用.zip或.tar.gz包時(shí),可以配置系統(tǒng)設(shè)置:
使用ulimit臨時(shí)配置,或
在/etc/security/limits.conf中永久配置
使用RPM或Debian軟件包時(shí),大多數(shù)系統(tǒng)設(shè)置都在 系統(tǒng)配置文件 中設(shè)置. 然后,使用systemd的系統(tǒng)要求在 systemd配置文件 中指定系統(tǒng)限制
ulimit
在Linux系統(tǒng)上,ulimit可用于臨時(shí)更改資源限制。通常需要在運(yùn)行ES的用戶啟動(dòng)ES前,切換為root,以配置資源限制。例如,要將打開的文件句柄數(shù)(ulimit-n)設(shè)置為65536,可以執(zhí)行以下操作:
sudo su ulimit -n 65535 su esuser
新的資源配置僅應(yīng)用于當(dāng)前會(huì)話??赏ㄟ^ulimit -a查詢當(dāng)前所有限制。
/etc/security/limits.conf
在Linux系統(tǒng)上,可以通過編輯/etc/security/limits.conf文件為特定用戶設(shè)置持久限制。例如,要將esuser用戶的最大打開文件數(shù)設(shè)置為65535,在limits.conf文件中添加以下行:
esuser - nofile 65535
此更改僅在elasticsearch用戶下次打開新會(huì)話時(shí)生效。
Ubuntu下的limits.conf
Ubuntu會(huì)忽略由init.d啟動(dòng)的進(jìn)程的limits.conf文件。要啟用limits.conf文件,請(qǐng)編輯/etc/pam.d/su并取消注釋以下行:
# session required pam_limits.so
系統(tǒng)配置文件
使用RPM或Debian軟件包時(shí),可以在系統(tǒng)配置文件中指定系統(tǒng)設(shè)置和環(huán)境變量,該文件位于:
包類型 | 系統(tǒng)配置文件路徑 |
---|---|
RPM | /etc/sysconfig/elasticsearch |
Debian | /etc/default/elasticsearch |
但是,對(duì)于使用systemd的系統(tǒng),需要通過systemd指定系統(tǒng)限制
Systemd配置
在使用systemd的系統(tǒng)上使用RPM或Debian軟件包時(shí),必須通過systemd指定系統(tǒng)限制。
systemd服務(wù)文件(/usr/lib/systemd/system/eelasticsearch.service)包含默認(rèn)應(yīng)用的限制。
要覆蓋它們,添加一個(gè)名為/etc/systemd/system/exelasticsearch.service.d/overrid.conf的文件(或者,運(yùn)行sudo systemctl edit elasticsearch,會(huì)在默認(rèn)編輯器中自動(dòng)打開該文件)。在此文件中設(shè)置任何需要的變更,例如:
[Service] LimitMEMLOCK=infinity
一旦完成更改,運(yùn)行以下命令以重載服務(wù)單元:
sudo systemctl daemon-reload
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/setting-system-settings.html
禁用交換(swapping)
大多數(shù)操作系統(tǒng)都試圖將盡可能多的內(nèi)存用于文件系統(tǒng)緩存,并急切地交換掉未使用的應(yīng)用程序內(nèi)存。這可能會(huì)導(dǎo)致JVM堆的一部分,甚至其可執(zhí)行頁面被換出到磁盤。
swapping 對(duì)性能和節(jié)點(diǎn)穩(wěn)定性非常不利,應(yīng)該不惜一切代價(jià)避免。它可能會(huì)導(dǎo)致垃圾收集持續(xù)分鐘而不是毫秒,并可能導(dǎo)致節(jié)點(diǎn)響應(yīng)緩慢,甚至與集群斷開連接。在彈性分布式系統(tǒng)中,更容易導(dǎo)致操作系統(tǒng)殺死節(jié)點(diǎn)。
有三種方法可以禁用交換。首選項(xiàng)是完全禁用交換。如果這不是一種選擇,那么是選擇最小化swappiness還是選擇內(nèi)存鎖定取決于你的環(huán)境
禁用所有swap文件
通常,ES是在機(jī)器上運(yùn)行的唯一服務(wù),其內(nèi)存使用由JVM選項(xiàng)控制。不需要啟用交換。
在Linux系統(tǒng)上,可以通過運(yùn)行以下命令暫時(shí)禁用交換::
sudo swapoff -a
這不需要重新啟動(dòng)Elasticsearch。
要永久禁用,則需要編輯/etc/fstab文件,并注釋掉任何包含單詞swap的行。
在Windows上,可以通過系統(tǒng)屬性→高級(jí)→性能→高級(jí)→虛擬內(nèi)存完全禁用分頁文件來實(shí)現(xiàn)等效功能。
配置swappiness
Linux系統(tǒng)上可用的另一個(gè)選擇是確保sysctl值vm.swappiness設(shè)置為1。這減少了內(nèi)核交換的傾向,在正常情況下不應(yīng)導(dǎo)致交換,同時(shí)仍然允許整個(gè)系統(tǒng)在緊急情況下交換。
開啟bootstrap.memory_lock
另一種選擇是在Linux/Unix系統(tǒng)上使用mlockall,在Windows上使用VirtualLock,以嘗試將進(jìn)程地址空間鎖定到RAM中,防止任何ES堆內(nèi)存被換出。
一些平臺(tái)在使用內(nèi)存鎖時(shí)仍然會(huì)交換堆內(nèi)存。為了防止堆外內(nèi)存交換,取而代之,禁用所有交換文件。
要啟用內(nèi)存鎖,需在elasticsearch.yml中將bootstrap.memory_lock設(shè)置為true:
bootstrap.memory_lock: true
如果mlockall試圖分配的內(nèi)存超過可用內(nèi)存,則可能會(huì)導(dǎo)致JVM或shell會(huì)話退出!
啟動(dòng)Elasticsearch后,可以通過檢查此請(qǐng)求輸出中mlockall值來查看此設(shè)置是否已成功應(yīng)用:
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)限??梢园慈缦路绞绞跈?quán):
使用.zip和.tar.gz安裝包
啟動(dòng)ES前以root用戶執(zhí)行ulimit -l unlimited。可選的,設(shè)置/etc/security/limits.confmemlock為unlimited
# allow user 'elasticsearch' mlockall elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
RPM 和 Debian
系統(tǒng)配置文件中設(shè)置MAX_LOCKED_MEMORY為unlimited
使用systemd的系統(tǒng)
systemd配置中設(shè)置LimitMEMLOCK為infinity
mlockall失敗的另一個(gè)可能原因是JNA臨時(shí)目錄(通常是/tmp的子目錄)是用noexec選項(xiàng)掛載的。這可以通過使用ES_JAVA_OPTS環(huán)境變量為JNA指定一個(gè)新的臨時(shí)目錄來解決:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=" ./bin/elasticsearch
或者在jvm.options配置文件中設(shè)置該JVM標(biāo)識(shí)。
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/setup-configuration-memory.html
文件描述符
這僅適用于Linux和MacOS,如果在Windows上運(yùn)行ES,可以安全地忽略它。在Windows上,JVM使用僅受可用資源的限制的API。
ES使用了大量的文件描述符或文件句柄。文件描述符用盡可能是災(zāi)難性的,很可能會(huì)導(dǎo)致數(shù)據(jù)丟失。確保將運(yùn)行ES的用戶的打開文件描述符數(shù)量限制增加到65536或更高。
對(duì)于.zip和.tar.gz包,在啟動(dòng)ES之前以root用戶設(shè)置ulimit -n 65535,或者在/etc/security/limits.conf中將nofile設(shè)置為65535。
在MacOS上,還必須將JVM選項(xiàng)-XX:-MaxFDLimit傳遞給ES,以便使用更高的文件描述符限制。
RPM和Debian軟件包已經(jīng)將文件描述符的最大數(shù)量默認(rèn)為65535,不需要進(jìn)一步配置。
可以使用Nodes stats檢查為每個(gè)節(jié)點(diǎn)配置的max_file_descriptors:
GET _nodes/stats/process?filter_path=**.max_file_descriptors
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/file-descriptors.html
虛擬內(nèi)存
默認(rèn)情況下,ES使用mmapfs目錄用于存儲(chǔ)其索引。默認(rèn)操作系統(tǒng)對(duì)mmap計(jì)數(shù)的限制可能太低,這可能會(huì)導(dǎo)致內(nèi)存不足異常。
在Linux上,可以通過以root身份運(yùn)行以下命令來增加限制。
sysctl -w vm.max_map_count=262144
要永久設(shè)置該值,需更新/etc/sysctl.conf中的vm.max_map_count設(shè)置。要在重新啟動(dòng)后進(jìn)行驗(yàn)證,請(qǐng)運(yùn)行sysctl vm.map_map_count。
RPM和Debian軟件包將自動(dòng)配置此設(shè)置。無需進(jìn)一步配置。CentOS7.9中驗(yàn)證,該配置項(xiàng)默認(rèn)為65535,無法正常啟動(dòng)
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/vm-max-map-count.html
線程數(shù)量
ES為不同類型的操作使用了許多線程池。重要的是,它能夠在需要時(shí)創(chuàng)建新線程。確保Elasticsearch用戶至少可創(chuàng)建4096個(gè)線程。
這可以通過在啟動(dòng)Elasticsearch之前以root用戶運(yùn)行ulimit -u 4096來完成 ,或者在/etc/security/limits.conf中將nproc設(shè)置為4096。
發(fā)行包在systemd下作為服務(wù)運(yùn)行時(shí),將自動(dòng)配置ES進(jìn)程的線程數(shù)。不需要額外的配置。
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/max-number-of-threads.html
DNS緩存設(shè)置
ES運(yùn)行時(shí)有一個(gè)安全管理器。有了安全管理器,JVM默認(rèn)無限期緩存正向主機(jī)名解析,默認(rèn)緩存反向主機(jī)名解析10秒。ES使用默認(rèn)值覆蓋此行為,以緩存正向解析60秒,反向解析10秒。這應(yīng)適用于大多數(shù)環(huán)境,包括DNS解析隨時(shí)間變化的環(huán)境。如果沒有覆蓋此配置,可以編輯JVM選項(xiàng)中的es.networkaddress.cache.ttl和es.networkaddress.cache.negative.ttl。注意,ES會(huì)忽略 Java安全策略中的networkaddress.cache.ttl=和networkaddress.cache.negative.ttl=。除非移除es.networkaddress.cache.ttl和es.networkaddress.cache.notanegative.ttl設(shè)置。
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/networkaddress-cache-ttl.html
JNA臨時(shí)目錄未使用noexec掛著
這僅適用于Linux。
ES使用Java Native Access(JNA)庫來執(zhí)行一些依賴于平臺(tái)的本地代碼。在Linux上,支持此庫的本地代碼在運(yùn)行時(shí)從JNA存檔中提取。默認(rèn)情況下,此代碼被提取到ES臨時(shí)目錄,該目錄默認(rèn)為/tmp的子目錄??蛇x的,可以使用JVM標(biāo)志-Djna.tmpdir=
參考鏈接
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/executable-jna-tmpdir.html
TCP重傳超時(shí)
集群中的每對(duì)節(jié)點(diǎn)都通過許多TCP連接進(jìn)行通信,這些TCP連接保持打開狀態(tài)直到其中一個(gè)節(jié)點(diǎn)關(guān)閉或節(jié)點(diǎn)之間的通信因底層基礎(chǔ)框架故障而中斷。
TCP通過向通信應(yīng)用程序隱藏臨時(shí)網(wǎng)絡(luò)中斷,在偶爾不可靠的網(wǎng)絡(luò)上提供可靠的通信。在通知發(fā)送者任何問題之前,操作系統(tǒng)將多次重新傳輸任何丟失的消息。大多數(shù)Linux發(fā)行版默認(rèn)重新傳輸任何丟失的數(shù)據(jù)包15次。重傳呈指數(shù)級(jí)推遲,因此這15次重傳需要900多秒才能完成。這意味著使用此方法檢測(cè)網(wǎng)絡(luò)分區(qū)或故障節(jié)點(diǎn)需要消耗Linux幾分鐘的時(shí)間。Windows默認(rèn)只重傳5次,超時(shí)時(shí)間約為6秒。
Linux默認(rèn)允許在可能經(jīng)歷很長(zhǎng)一段時(shí)間數(shù)據(jù)包丟失的網(wǎng)絡(luò)上進(jìn)行通信,但對(duì)于單個(gè)數(shù)據(jù)中心內(nèi)的生產(chǎn)網(wǎng)絡(luò)來說,這個(gè)默認(rèn)值是過高的,正如大多數(shù)Elasticsearch集群一樣。高可用集群必須能夠快速檢測(cè)節(jié)點(diǎn)故障,以便通過重新分配丟失的分片、重新路由搜索以及可能選擇新的主節(jié)點(diǎn)來迅速做出反應(yīng)。因此,Linux用戶應(yīng)該減少TCP重傳的最大次數(shù)。
可以通過以root身份運(yùn)行以下命令,將TCP重傳的最大次數(shù)減少到5。五次重傳對(duì)應(yīng)的超時(shí)時(shí)間約為六秒。
sysctl-w net.ipv4.tcp_reres2=5
要永久設(shè)置此值,更新/etc/sysctl.conf中的net.ipv4.tcp_reres2設(shè)置。要在重新啟動(dòng)后運(yùn)行sysctl net.ipv4.tcp_reres2查看是否生效。
此設(shè)置適用于所有TCP連接,也會(huì)影響與群體外系統(tǒng)的通信可靠性。如果的集群通過不可靠的網(wǎng)絡(luò)與外部系統(tǒng)通信,則可能需要為net.ipv4.tcp_reres2選擇更高的值。因此,Elasticsearch不會(huì)自動(dòng)調(diào)整此設(shè)置。
相關(guān)配置
ES還實(shí)現(xiàn)了自己的內(nèi)部健康檢查,超時(shí)時(shí)間比Linux上的默認(rèn)重傳超時(shí)時(shí)間短得多。由于這些是應(yīng)用程序級(jí)健康檢查,因此它們的超時(shí)必須考慮到應(yīng)用程序級(jí)的影響,如垃圾收集暫停。不應(yīng)該減少與這些應(yīng)用程序級(jí)健康檢查相關(guān)的任何超時(shí)。
鏈接:https://www.cnblogs.com/shouke/p/18551220
-
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209967 -
Elasticsearch
+關(guān)注
關(guān)注
0文章
30瀏覽量
2844
原文標(biāo)題:深入解析:如何在Linux環(huán)境下高效安裝部署和配置Elasticsearch
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論