1.elasticsearch支持的操作系統(tǒng)和JVM 版本
https://www.elastic.co/support/matrix
2.下載安裝啟動(dòng)elasticsearch
下載地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.2.tar.gz
解壓:tar -xzf elasticsearch-5.4.2.tar.gz
啟動(dòng):$ES_HOME/bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
說(shuō)明: -d 后臺(tái)進(jìn)程
-Ecluster.name 集群名字
-Enode.name 節(jié)點(diǎn)名字
-Epath.conf es配置文件,默認(rèn)elasticsearch.yml
-Epath.data 節(jié)點(diǎn)上索引/分片的數(shù)據(jù)文件位置
-Epath.logs 日志文件位置
-Epath.scripts 腳本文件位置
3.es的配置文件有兩個(gè):
1>.elasticsearch.yml 配置es,使用YAML格式,可以使用${}標(biāo)記引用環(huán)境變量,比如:
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
2>.log4j2.properties 配置es日志生成方式,具體參考: http://logging.apache.org/log4j/2.x/manual/configuration.html
4.es的安全配置
使用elasticsearch-keystore工具管理
1>.bin/elasticsearch-keystore create 創(chuàng)建一個(gè)和es配置同目錄的elasticsearch.keystore文件
2>.bin/elasticsearch-keystore add key 添加一個(gè)key字段,tool提示輸入值
3>.bin/elasticsearch-keystore list 列出keystore中所有的命令key
4>.bin/elasticsearch-keystore remove key 刪除keystore中的命令key
5.es的引導(dǎo)檢查或者自舉檢查
es啟動(dòng)時(shí)進(jìn)行引導(dǎo)檢查,包括es配置和系統(tǒng)配置,確保這些配置操作es是安全的.在開(kāi)發(fā)模式下,引導(dǎo)失敗會(huì)在日志中出現(xiàn)警告;在生產(chǎn)模式下,引導(dǎo)失敗,es會(huì)重新加在配置啟動(dòng).
1>.堆大小檢查
如果jvm的Xms和Xmx不相等,使用系統(tǒng)過(guò)程中由于堆大小重置,很容易出現(xiàn)停頓現(xiàn)象,所以需要設(shè)置Xms=Xmx;
如果bootstrap.memory_lock=true,jvm啟動(dòng)時(shí)會(huì)鎖住堆初始化大小,重置堆后不會(huì)出現(xiàn)將所有的jvm堆都鎖住.
設(shè)置:jvm.options
-Xms2g
-Xmx2g
2>.文件描述符
文件描述符是Unix用來(lái)跟蹤打開(kāi)的文件,在Unix中一切皆文件.es請(qǐng)求許多文件描述符,如分片是由很多分段以及其他文件組成.文件描 述符檢查在OS X和Linux上是強(qiáng)制的.
3>.內(nèi)存鎖檢查
檢查boostrap.memory_lock啟用,jvm成功鎖住堆.
當(dāng)jvm做一個(gè)較大的gc時(shí),觸發(fā)堆的每一頁(yè),如果這些頁(yè)交換到磁盤(pán)了,gc完成時(shí)會(huì)被重新導(dǎo)入內(nèi)存,這會(huì)引起磁盤(pán)抖動(dòng),es更擅長(zhǎng)使用服務(wù)請(qǐng)求,避免這種情況可以使用內(nèi)存堆鎖(Unix使用mlockall,windows使用virtual lock),在es中通過(guò)啟用boostrap.memory_lock使用,特別注意要限制memlock.
4>.最大線程數(shù)檢查
es執(zhí)行的請(qǐng)求被劃分為多個(gè)階段,然后推給線程池執(zhí)行.es有多鐘任務(wù)所以對(duì)應(yīng)多種線程池執(zhí)行器,因此要求es有創(chuàng)建許多線程的能力.最大線程數(shù)檢查確保es正常使用下能正確創(chuàng)建足夠的線程.在Linux上該檢查是強(qiáng)制的,可以通過(guò)系統(tǒng)配置/etc/security/limits.conf文件,使用nproc設(shè)置,最少要設(shè)置2048個(gè)線程.
5>.最大虛擬內(nèi)存檢查
es和Lucerne使用mmap將索引部分隱射到es的地址空間,可以使得索引數(shù)據(jù)遠(yuǎn)離jvm堆而又能快速訪問(wèn),所以es需要無(wú)限制的地址空間.最大虛擬內(nèi)存檢查強(qiáng)制檢查es有處理無(wú)限的地址空間,并且只有Linux上強(qiáng)制的.在Linux上在/etc/security/limits.conf文件使用as設(shè)置無(wú)限的地址空間.
6>.最大隱射數(shù)檢查
為了使用mmap,es需要?jiǎng)?chuàng)建許多內(nèi)存隱射區(qū)域.最大隱射數(shù)檢查內(nèi)核允許處理最少262144內(nèi)存隱射區(qū)域,并且只有Linux是強(qiáng)制的.通過(guò)vm.max_map_count=262144.
7>.客戶端jvm檢查
OpenJDK有兩種jvm驅(qū)動(dòng):客戶端jvm和服務(wù)端jvm,它們以不同的編譯方式執(zhí)行字節(jié)碼.客戶端jvm可以獲得啟動(dòng)時(shí)間和內(nèi)存占用空間;而服務(wù)端jvm可以獲得最大性能,兩種jvm在性能方面存在巨大差距.客戶端jvm檢查保證es不會(huì)運(yùn)行在客戶端jvm中.現(xiàn)在的系統(tǒng)和操作系統(tǒng),默認(rèn)使用服務(wù)端vm,另外,es強(qiáng)制設(shè)置為服務(wù)端vm.
8>.使用串行g(shù)c回收器檢查
基于OpenJDK的jvm有幾種垃圾回收器,針對(duì)不同的工作負(fù)載.其中串行垃圾回收器特別適合于單核cpu,非常小的堆內(nèi)存,但是es不適合這兩種場(chǎng)合.假如es使用了串行回收對(duì)性能是毀滅性的.因此串行回收器保證es不會(huì)運(yùn)行在串行回收機(jī)制下.默認(rèn)jvm配置是隨著es的配置改變的,es使用CMS(Concurrent Low Pause Collector,少停頓的并發(fā)回收器)
9>.系統(tǒng)調(diào)用過(guò)濾器檢查
es對(duì)不同的OS安裝不同種類的系統(tǒng)調(diào)用過(guò)濾器.安裝系統(tǒng)調(diào)用過(guò)濾器可以保護(hù)執(zhí)行系統(tǒng)調(diào)用分支對(duì)抗惡意代碼攻擊能力.es系統(tǒng)調(diào)用過(guò)濾器確保是否啟用了系統(tǒng)調(diào)用過(guò)濾器,如果啟用了會(huì)被成功安裝.可以通過(guò)bootstrap.system_call_filter=false禁用.
10>.錯(cuò)誤和OOM檢查
JVM啟用選項(xiàng)OnError和OnOutOfMemoryError,執(zhí)行任意命令會(huì)出現(xiàn)致命錯(cuò)誤(OnError)或內(nèi)存溢出錯(cuò)誤,但是es的系統(tǒng)調(diào)用過(guò)濾器啟用時(shí),會(huì)阻止這種錯(cuò)誤.所以O(shè)nError和OOM與系統(tǒng)調(diào)用過(guò)濾器時(shí)互斥的.OnError和OOM檢查從es啟動(dòng)時(shí)阻止使用jvm選項(xiàng)或者啟用系統(tǒng)調(diào)用過(guò)濾器中的一種.這個(gè)檢查是強(qiáng)制的.
11>.早期訪問(wèn)檢查
OpenJDK項(xiàng)目提供了早期訪問(wèn)即將發(fā)布的快照版本.這些發(fā)布版,不適合用于生產(chǎn)環(huán)境.早期訪問(wèn)檢查檢測(cè)這些早期訪問(wèn)快照版本.
12>.G1 GC檢查
HotSpot在JDK 8u40以前,如果啟用了G1 GC會(huì)出現(xiàn)索引損壞.G1 GC檢查可以檢測(cè)這些早期HotSpot JVM版本.
6. 重要的系統(tǒng)配置
理想情況下,es應(yīng)該運(yùn)行于單獨(dú)的服務(wù)器,并使用所有可用的資源.因此,生產(chǎn)環(huán)境下需要設(shè)置以下配置:
JVM堆大小
禁用交換
增加文件描述符
確保足夠的虛擬內(nèi)存
確保足夠的線程
注意:如果在開(kāi)發(fā)模式下,上面的任何一個(gè)設(shè)置沒(méi)有配置正確,es出現(xiàn)警告并記錄到日志,es node 可以啟動(dòng)和運(yùn)行.
如果一配置網(wǎng)絡(luò)設(shè)置比如network.host,es會(huì)認(rèn)為是生產(chǎn)環(huán)境,將警告改為異常,阻止node啟動(dòng),這種安全處理保證不會(huì)丟失數(shù)據(jù).
6.1 配置系統(tǒng)設(shè)置
配置系統(tǒng)設(shè)置依賴于使用的es安裝包和操作系統(tǒng).
使用.zip或.tar.gz包,配置可以使用:
臨時(shí)配置 ulimit 和 永久配置 /etc/security/limits.conf
使用RPM或Debian包,大多數(shù)配置在系統(tǒng)配置文件中:
RPM /etc/sysconfig/elasticsearch
Debian /etc/default/elasticsearch
使用systemd的系統(tǒng)配置需要在systemd配置文件:
/usr/lib/systemd/system/elasticsearch.service
例子參考: https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html
6.2 通過(guò)jvm.options設(shè)置jvm堆大小
默認(rèn)es告訴jvm使用一個(gè)最小和最大都為2G的堆.如果在生產(chǎn)環(huán)境下,需要配置堆大小保證es有足夠的可用的堆.
好的規(guī)則如下:
1> 設(shè)置堆的最小最大值相等;
2> es可用的堆越多,可以使用的緩存就越多.但是太大的堆會(huì)造成垃圾回收停頓變長(zhǎng);
3> Xmx不能超過(guò)物理內(nèi)存的50%,確保有足夠的內(nèi)存留下,緩存內(nèi)核文件系統(tǒng);
4> Xmx不要大于jvm壓縮對(duì)象指針的臨界值,準(zhǔn)確臨界值接近32G;
6.3 禁用交換
大多數(shù)操作系統(tǒng)使用盡可能多的內(nèi)存緩存文件系統(tǒng),同時(shí)交換未使用的應(yīng)用內(nèi)存,這種情形在jvm堆或執(zhí)行堆的ye時(shí)引起交換.交換對(duì)節(jié)點(diǎn)穩(wěn)定性時(shí)非常壞的.會(huì)導(dǎo)致幾分鐘垃圾回收或節(jié)點(diǎn)響應(yīng)緩慢或從集群斷開(kāi)等.在彈性分布式系統(tǒng)中,節(jié)點(diǎn)可能被操作系統(tǒng)殺死.有三種方式可以禁用交換:
1> 禁用所有的交換
Linux上臨時(shí)禁用: swapoff -a;永久禁用: 注釋掉/etc/fastab中所有包含swap的行
windows系統(tǒng)禁用: System Properties → Advanced → Performance → Advanced → Virtual memory
2> 設(shè)置交換參數(shù)(swappiness)
Linux系統(tǒng)設(shè)置vm.sappiness=1,減少內(nèi)核的交換,正常情況下不會(huì)導(dǎo)致交換,當(dāng)特殊緊急情況會(huì)交換
3. 啟用bootstrap.memory_lock
在elasticsearch.yml設(shè)置bootstrap.memory_lock: true
驗(yàn)證是否禁用成功: http://192.168.0.128:9200/_nodes?filter_path=**.mlockall
如果出現(xiàn)了mlockall is false,說(shuō)明mlockall請(qǐng)求失敗,有詳細(xì)的說(shuō)明,這時(shí)需要檢查是否有鎖內(nèi)存的權(quán)限.具體操作見(jiàn):https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html
6.3 增加文件描述符
文件描述符只與Linux,macOS有關(guān),windows會(huì)被安全忽略.
es使用許多文件描述符或文件處理器.由于運(yùn)行文件描述符可能導(dǎo)致數(shù)據(jù)丟失.所以需要增加文件描述符的數(shù)為65536或者更高.
對(duì)于.zip或.tar.gz包,使用ulimit -n 65536 或者 /etc/security/limits.conf 設(shè)置 nofile 65536
查看每個(gè)節(jié)點(diǎn)的max_file_descriptors配置
http://192.168.0.128:9200/_nodes/stats/process?filter_path=**.max_file_descriptors
6.3 確保足夠的虛擬內(nèi)存
OS限制mmap數(shù)很低,導(dǎo)致OOM,在Linux上以root身份使用命令: sysctl -w vm.max_map_count=262144
RPM和Debian包會(huì)自動(dòng)配置.
6.3 確保足夠的線程
臨時(shí)設(shè)置: ulimit -u 2048
永久設(shè)置: /etc/security/limits.conf中設(shè)置nproc位2048
7 es常用的配置
# ---------------------------------- Cluster -----------------------------------
#集群名字:所有節(jié)點(diǎn)共享,默認(rèn)是elasticsearch
cluster.name: es-cluster
# ------------------------------------ Node ------------------------------------
#節(jié)點(diǎn)名字:es默認(rèn)使用uuid的前7個(gè)字符作為node id,節(jié)點(diǎn)名字生成后不能更改.
node.name: ${HOSTNAME}
#是否是master節(jié)點(diǎn)
node.master: true
ode.attr.rack: r1
# 配置es數(shù)據(jù)和日志目錄,不要使用默認(rèn)的,因?yàn)樯?jí)時(shí)會(huì)被刪掉
path:
data: ../data
logs: ../logs
#path.data可以設(shè)置多個(gè)目錄,這些目錄都用來(lái)存儲(chǔ)數(shù)據(jù),相同分片數(shù)據(jù)存儲(chǔ)相同路徑
#path:
# data:
# - /mnt/elasticsearch_1
# - /mnt/elasticsearch_2
# - /mnt/elasticsearch_3
# ----------------------------------- Memory -----------------------------------
#導(dǎo)出node的健康數(shù)據(jù)到磁盤(pán)
bootstrap.memory_lock: true
# ---------------------------------- Network -----------------------------------
#節(jié)點(diǎn)ip,默認(rèn)單個(gè)節(jié)點(diǎn)使用回環(huán)地址127.0.0.1或[::1]就足夠了;如果是集群,為了通信需要指定ip.
network.host: 192.168.0.128
#rest api端口,可以通過(guò)瀏覽器訪問(wèn)
http.port: 9200
#集群間通信端口號(hào)尚骄,在同一機(jī)器下必須不一樣
transport.tcp.port: 9300
# --------------------------------- Discovery ----------------------------------
#同一個(gè)服務(wù)器,啟動(dòng)多個(gè)node,可以不用配置,es會(huì)綁定到回環(huán)地址同時(shí)掃描9300-9305運(yùn)行節(jié)點(diǎn)
#在不同的服務(wù)器上的節(jié)點(diǎn)需要指定ip或ip:port或域名
discovery.zen.ping.unicast.hosts:
-192.168.0.128:9300
-192.168.0.128:9301
# -www.es.com
# -192.168.0.128 #沒(méi)有指定端口,使用transport.profiles.default.port,失敗了使用transport.tcp.port
#指定合適的最少master節(jié)點(diǎn)數(shù),避免由于網(wǎng)絡(luò)問(wèn)題出現(xiàn)腦裂,造成數(shù)據(jù)丟失,計(jì)算公式(master_eligible_nodes / 2) + 1
#如果有3個(gè)節(jié)點(diǎn),那么設(shè)置為: (3/2) + 1 = 2
discovery.zen.minimum_master_nodes: 1