1.elasticsearch支持的操作系统和JVM 版本
https://www.elastic.co/support/matrix
2.下载安装启动elasticsearch
下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.2.tar.gz
解压:tar -xzf elasticsearch-5.4.2.tar.gz
启动:$ES_HOME/bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
说明: -d 后台进程
-Ecluster.name 集群名字
-Enode.name 节点名字
-Epath.conf es配置文件,默认elasticsearch.yml
-Epath.data 节点上索引/分片的数据文件位置
-Epath.logs 日志文件位置
-Epath.scripts 脚本文件位置
3.es的配置文件有两个:
1>.elasticsearch.yml 配置es,使用YAML格式,可以使用${}标记引用环境变量,比如:
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 创建一个和es配置同目录的elasticsearch.keystore文件
2>.bin/elasticsearch-keystore add key 添加一个key字段,tool提示输入值
3>.bin/elasticsearch-keystore list 列出keystore中所有的命令key
4>.bin/elasticsearch-keystore remove key 删除keystore中的命令key
5.es的引导检查或者自举检查
es启动时进行引导检查,包括es配置和系统配置,确保这些配置操作es是安全的.在开发模式下,引导失败会在日志中出现警告;在生产模式下,引导失败,es会重新加在配置启动.
1>.堆大小检查
如果jvm的Xms和Xmx不相等,使用系统过程中由于堆大小重置,很容易出现停顿现象,所以需要设置Xms=Xmx;
如果bootstrap.memory_lock=true,jvm启动时会锁住堆初始化大小,重置堆后不会出现将所有的jvm堆都锁住.
设置:jvm.options
-Xms2g
-Xmx2g
2>.文件描述符
文件描述符是Unix用来跟踪打开的文件,在Unix中一切皆文件.es请求许多文件描述符,如分片是由很多分段以及其他文件组成.文件描 述符检查在OS X和Linux上是强制的.
3>.内存锁检查
检查boostrap.memory_lock启用,jvm成功锁住堆.
当jvm做一个较大的gc时,触发堆的每一页,如果这些页交换到磁盘了,gc完成时会被重新导入内存,这会引起磁盘抖动,es更擅长使用服务请求,避免这种情况可以使用内存堆锁(Unix使用mlockall,windows使用virtual lock),在es中通过启用boostrap.memory_lock使用,特别注意要限制memlock.
4>.最大线程数检查
es执行的请求被划分为多个阶段,然后推给线程池执行.es有多钟任务所以对应多种线程池执行器,因此要求es有创建许多线程的能力.最大线程数检查确保es正常使用下能正确创建足够的线程.在Linux上该检查是强制的,可以通过系统配置/etc/security/limits.conf文件,使用nproc设置,最少要设置2048个线程.
5>.最大虚拟内存检查
es和Lucerne使用mmap将索引部分隐射到es的地址空间,可以使得索引数据远离jvm堆而又能快速访问,所以es需要无限制的地址空间.最大虚拟内存检查强制检查es有处理无限的地址空间,并且只有Linux上强制的.在Linux上在/etc/security/limits.conf文件使用as设置无限的地址空间.
6>.最大隐射数检查
为了使用mmap,es需要创建许多内存隐射区域.最大隐射数检查内核允许处理最少262144内存隐射区域,并且只有Linux是强制的.通过vm.max_map_count=262144.
7>.客户端jvm检查
OpenJDK有两种jvm驱动:客户端jvm和服务端jvm,它们以不同的编译方式执行字节码.客户端jvm可以获得启动时间和内存占用空间;而服务端jvm可以获得最大性能,两种jvm在性能方面存在巨大差距.客户端jvm检查保证es不会运行在客户端jvm中.现在的系统和操作系统,默认使用服务端vm,另外,es强制设置为服务端vm.
8>.使用串行gc回收器检查
基于OpenJDK的jvm有几种垃圾回收器,针对不同的工作负载.其中串行垃圾回收器特别适合于单核cpu,非常小的堆内存,但是es不适合这两种场合.假如es使用了串行回收对性能是毁灭性的.因此串行回收器保证es不会运行在串行回收机制下.默认jvm配置是随着es的配置改变的,es使用CMS(Concurrent Low Pause Collector,少停顿的并发回收器)
9>.系统调用过滤器检查
es对不同的OS安装不同种类的系统调用过滤器.安装系统调用过滤器可以保护执行系统调用分支对抗恶意代码攻击能力.es系统调用过滤器确保是否启用了系统调用过滤器,如果启用了会被成功安装.可以通过bootstrap.system_call_filter=false禁用.
10>.错误和OOM检查
JVM启用选项OnError和OnOutOfMemoryError,执行任意命令会出现致命错误(OnError)或内存溢出错误,但是es的系统调用过滤器启用时,会阻止这种错误.所以OnError和OOM与系统调用过滤器时互斥的.OnError和OOM检查从es启动时阻止使用jvm选项或者启用系统调用过滤器中的一种.这个检查是强制的.
11>.早期访问检查
OpenJDK项目提供了早期访问即将发布的快照版本.这些发布版,不适合用于生产环境.早期访问检查检测这些早期访问快照版本.
12>.G1 GC检查
HotSpot在JDK 8u40以前,如果启用了G1 GC会出现索引损坏.G1 GC检查可以检测这些早期HotSpot JVM版本.
6. 重要的系统配置
理想情况下,es应该运行于单独的服务器,并使用所有可用的资源.因此,生产环境下需要设置以下配置:
JVM堆大小
禁用交换
增加文件描述符
确保足够的虚拟内存
确保足够的线程
注意:如果在开发模式下,上面的任何一个设置没有配置正确,es出现警告并记录到日志,es node 可以启动和运行.
如果一配置网络设置比如network.host,es会认为是生产环境,将警告改为异常,阻止node启动,这种安全处理保证不会丢失数据.
6.1 配置系统设置
配置系统设置依赖于使用的es安装包和操作系统.
使用.zip或.tar.gz包,配置可以使用:
临时配置 ulimit 和 永久配置 /etc/security/limits.conf
使用RPM或Debian包,大多数配置在系统配置文件中:
RPM /etc/sysconfig/elasticsearch
Debian /etc/default/elasticsearch
使用systemd的系统配置需要在systemd配置文件:
/usr/lib/systemd/system/elasticsearch.service
例子参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html
6.2 通过jvm.options设置jvm堆大小
默认es告诉jvm使用一个最小和最大都为2G的堆.如果在生产环境下,需要配置堆大小保证es有足够的可用的堆.
好的规则如下:
1> 设置堆的最小最大值相等;
2> es可用的堆越多,可以使用的缓存就越多.但是太大的堆会造成垃圾回收停顿变长;
3> Xmx不能超过物理内存的50%,确保有足够的内存留下,缓存内核文件系统;
4> Xmx不要大于jvm压缩对象指针的临界值,准确临界值接近32G;
6.3 禁用交换
大多数操作系统使用尽可能多的内存缓存文件系统,同时交换未使用的应用内存,这种情形在jvm堆或执行堆的ye时引起交换.交换对节点稳定性时非常坏的.会导致几分钟垃圾回收或节点响应缓慢或从集群断开等.在弹性分布式系统中,节点可能被操作系统杀死.有三种方式可以禁用交换:
1> 禁用所有的交换
Linux上临时禁用: swapoff -a;永久禁用: 注释掉/etc/fastab中所有包含swap的行
windows系统禁用: System Properties → Advanced → Performance → Advanced → Virtual memory
2> 设置交换参数(swappiness)
Linux系统设置vm.sappiness=1,减少内核的交换,正常情况下不会导致交换,当特殊紧急情况会交换
3. 启用bootstrap.memory_lock
在elasticsearch.yml设置bootstrap.memory_lock: true
验证是否禁用成功: http://192.168.0.128:9200/_nodes?filter_path=**.mlockall
如果出现了mlockall is false,说明mlockall请求失败,有详细的说明,这时需要检查是否有锁内存的权限.具体操作见:https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html
6.3 增加文件描述符
文件描述符只与Linux,macOS有关,windows会被安全忽略.
es使用许多文件描述符或文件处理器.由于运行文件描述符可能导致数据丢失.所以需要增加文件描述符的数为65536或者更高.
对于.zip或.tar.gz包,使用ulimit -n 65536 或者 /etc/security/limits.conf 设置 nofile 65536
查看每个节点的max_file_descriptors配置
http://192.168.0.128:9200/_nodes/stats/process?filter_path=**.max_file_descriptors
6.3 确保足够的虚拟内存
OS限制mmap数很低,导致OOM,在Linux上以root身份使用命令: sysctl -w vm.max_map_count=262144
RPM和Debian包会自动配置.
6.3 确保足够的线程
临时设置: ulimit -u 2048
永久设置: /etc/security/limits.conf中设置nproc位2048
7 es常用的配置
# ---------------------------------- Cluster -----------------------------------
#集群名字:所有节点共享,默认是elasticsearch
cluster.name: es-cluster
# ------------------------------------ Node ------------------------------------
#节点名字:es默认使用uuid的前7个字符作为node id,节点名字生成后不能更改.
node.name: ${HOSTNAME}
#是否是master节点
node.master: true
ode.attr.rack: r1
# 配置es数据和日志目录,不要使用默认的,因为升级时会被删掉
path:
data: ../data
logs: ../logs
#path.data可以设置多个目录,这些目录都用来存储数据,相同分片数据存储相同路径
#path:
# data:
# - /mnt/elasticsearch_1
# - /mnt/elasticsearch_2
# - /mnt/elasticsearch_3
# ----------------------------------- Memory -----------------------------------
#导出node的健康数据到磁盘
bootstrap.memory_lock: true
# ---------------------------------- Network -----------------------------------
#节点ip,默认单个节点使用回环地址127.0.0.1或[::1]就足够了;如果是集群,为了通信需要指定ip.
network.host: 192.168.0.128
#rest api端口,可以通过浏览器访问
http.port: 9200
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9300
# --------------------------------- Discovery ----------------------------------
#同一个服务器,启动多个node,可以不用配置,es会绑定到回环地址同时扫描9300-9305运行节点
#在不同的服务器上的节点需要指定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 #没有指定端口,使用transport.profiles.default.port,失败了使用transport.tcp.port
#指定合适的最少master节点数,避免由于网络问题出现脑裂,造成数据丢失,计算公式(master_eligible_nodes / 2) + 1
#如果有3个节点,那么设置为: (3/2) + 1 = 2
discovery.zen.minimum_master_nodes: 1