Elasticsearch会使用脚本中内置的JAVA_OPTS
变量值做为JVM启动参数,最重要参数-Xmx
,它控制进程最大的堆内存,-Xms
,控制进程分配最小堆内存(一般来讲内存分配越多越好)。 一般来讲,推荐作法是不改变JAVA_OPTS
变量,而使用ES_JAVA_OPTS
来改变JVM参数配置。 ES_HEAP_SIZE
参数用来配置Java为ES进程分配的堆内存,最大最小值是同样的,固然也能够经过指定的参数分别设置,最小最大分别是 ES_MIN_MEM
(默认256M)和ES_MAX_MEM
(默认是1G)。 (译者批注:一般建议最大最小内存设置成同样的,由于一般ES集群所在服务器资源尽量都是提供给集群使用的,因此资源管够,而设置不一样的最大最小值,会产生内存扩容致使过多开销) 建议将最大值最小值设置同样,而且打开(mlockall) (译者批注:mlockall
这个参数能够防止进程进行swap内存交换,内存交换效率很低,毕竟要读写磁盘。详细缘由能够看这里:把bootstrap.mlockall设为true)html
文件描述符 确保增大你机器(或者运行ES的用户)的最大文件打开数,推荐设置为32K或64K。 为了测试一个进程的最大文件打开数,启动时配置参数-Des.max-open-files
为true
。这样系统启动时就会打印最大文件打开数。 另外,你也能够经过解析下面API的结果中的max_file_descriptors
参数获取每一个节点的最大文件打开数:node
curl localhost:9200/_nodes/stats/process?prettyshell
虚拟内存 Elasticsearch默认使用mmaps / niofs
混合的目录存储类型存储索引。默认的操做系统限制mmaps
(内存映射模式)中的虚拟地址空间限制过小了,可能会致使内存溢出,在Linux上,你可使用root
用户经过以下命令扩大限制:apache
sysctl -w vm.max_map_count=262144json
若是想要永久改变这个参数的花,修改配置文件/etc/sysctl.conf
中的vm.max_map_count
这项配置。bootstrap
注意:若是你是用安装包安装ES(.deb或rpm),这个配置会自动改变,你可使用命令
sysctl vm.max_map_count
来校验。windows
内存配置 大多数操做系统会尽量多的使用内存给文件系统缓存并迫切的交换(后称swap
)无用的应用内存到磁盘,这有可能致使Elasticsearch进程被swap到磁盘,swap十分消耗性能而且影响节点的稳定性,所以要不惜一切代价避免它发生。 你有三种选择:缓存
ES_HEAP_SIZE
来控制,所以swap不该该启用。 Linux系统中,你能够经过命令sudo swapoff -a
来关闭,若是想永久关闭,须要修改配置文件/etc/fstab
并找到注释中包括swap
的那行。 Windows下,你能够彻底禁用分页文件,设置方法:个人电脑右键属性->高级系统设置->高级/性能,点击设置->高级->虚拟内存,点击更改->选择无分页文件。swappiness
第二个选择就是确保sysctl的配置vm.swappiness
设置为0。这样可以下降内核的swap频率,正常状况下是不会产生swap的,固然系统在紧急状况下仍是会进行swap。注意:在内核版本3.5-rc1及以上,
vm.swappiness
设置为0的时候,触发OOM则会杀掉进程而不是进行swap,紧急状况下你须要设置该配置为1来确保swap是可以执行的。安全
mlockall
,Windows使用 VirtualLock,可以将进程地址空间锁在内存中,防止Elasticsearch进程内存被swap出去,能够经过在配置文件elasticsearch.yml
中加入下面的配置:bootstrap.mlockall: true服务器
启动后,你能够经过检验下面这个命令的返回结果中的mlockall
值来看配置是否成功:
curl http://localhost:9200/_nodes/process?pretty
若是你发现mlockall
的值是false,说明配置失败了,最有可能的缘由是在Linux/Unix系统中启动ES的用户没有权限锁住内存,你能够在启动前,经过root用户执行ulimit -l unlimited
来受权。
另外一个缘由多是临时文件目录(Linux下一般是/tmp
)挂载时指定了noexec
选项,你能够在启动ES的时候指定新的临时目录来解决:
./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir
注意:启用mlockall,若是尝试申请超过可用内存大小的内存,可能会致使JVM或shell 回话退出。
elasticsearch的配置文件在ES_HOME/config
目录下,目录中有两个文件,elasticsearch.yml
用来配置ES的不一样模块,logging.yml
用来配置ES日志相关设置。 配置风格是YAML,下面咱们来一个示例,修改全部网络模块绑定的地址信息,改成以下:
network.host: 10.0.0.4
(译者批注:格式按照默认配置文件来便可,官网的yaml配置风格和我是用的略有不一样,这里我直接使用默认的配置文件中的注释demo)
生产环境使用,咱们确定须要修改data和log的存放目录:
path.data: /var/data/elasticsearch path.logs: /var/log/elasticsearch
(译者批注:data目录能够写多个,经过逗号分隔,实现磁盘阵列,把数据写到多个磁盘上,下降读写锁的开销。不过目前译者没有这么实践过。)
别忘了给你的集群命名,用来使节点发现并自动加入集群。
cluster.name:
确保你的集群名不会在不一样环境复用,不然可能会致使节点加入错误的集群而出错。例如你可使用 logging-dev
,logging-stage
,logging-prod
表示开发集群,预发布(译者公司称做沙箱)集群和生产集群。
也许你也须要修改节点名称,就像主机名同样。默认状况下节点启动时会从3000个漫威人物名字中随机选取一个。
node.name:
(译者批注:推荐命名用编号区分方便管理维护)
机器的主机名能够经过系统变量 HOSTNAME
获取,若是你的机器只运行集群中的一个节点,能够设置节点名为主机名,使用标签 ${...}
。
node.name: ${HOSTNAME}
(译者批注:这种配置方式极不推荐,不利于管理,风险高,把它当作一个trick测试玩好了。除非你作了一些安全或权限的插件,用到输入密码这种配置。)
ES内部在处理这些配置的时候都会使用“ namespaced”压缩处理(译者批注:也就是译者如今为你们展现的这种风格)。你也可使用JSON风格的配置,配置文件命名为:elasticsearch.json
就好了: Code style
{
"network" : {
"host" : "10.0.0.4"
}
}
复制代码
也就是说你能够很轻松的经过外部配置,使用ES_JAVA_OPTS
或者启动时参数进行配置,例如:
./elasticsearch -Des.network.host=10.0.0.4
另外,若是你不但愿存储你的配置,还可使用通配符的方式在启动ES时从前台传值,使用${prompt.text}
或 ${prompt.secret}
配置,前者控制台输入显示明文,后者则不显示,示例以下:
node.name: ${prompt.text}
启动ES后,会提示你输入参数值,以下:
Enter value for [node.name]:
若是${prompt.text}
或 ${prompt.secret}
已经存在于配置中,或者你使用后台启动ES,则这两个配置不会起做用。
集群中建立的索引拥有它本身的配置,例如,如下建立索引的配置设置了刷新间隔为5s,而没有使用默认的刷新间隔(可使用YAML或JSON格式):
$ curl -XPUT http://localhost:9200/kimchy/ -d
' index: refresh_interval: 5s '
索引级别的配置也能够用于节点级别的配置,好比刚才的配置咱们也能够在elasticsearch.yml
中设置:
index.refresh_interval: 5s
就是说在特定节点上建立的每一个索引都将使用5s的刷新间隔,除非建立索引时设置它。也能够说,索引级别的配置能够覆盖节点级别的配置。
全部的配置信息均可以在索引模块找到。
elasticsearch内部使用log4j日志系统,开箱即用,并使用YAML配置风格简化log4j的配置,配置文件是conf/logging.yml
,一样JSON风格的配置文件也支持。多个配置文件也是支持的,它们会被整合到一块儿,前提是文件名要以logging.
开头,并以支持的后缀结尾(目前能够是.yml
, .yaml
, .json
或.properties
)。日志器包括Java包名和相应的日志级别,你能够省略org.elasticsearch
前缀。Appender部分包括日志目的地。更多地自定义日志配置和appender类型请看 log4j documentation。 额外的Appender还有 log4j-extras 提供的其余日志类也是支持的,开箱即用。
除了常规日志,ES容许你启动过时日志记录。例如若是你要迁移某些功能,须要你提早肯定。默认的过时日志是禁用的,你能够经过以下配置启用:
deprecation: DEBUG, deprecation_log_file
这将会天天在你的日志目录建立滚动日志,常常检查