我爱编程

Elasticsearch官档翻译——2.1 配置

2018-03-07  本文已影响88人  code4j

配置

环境变量

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

系统配置

文件描述符
确保增大你机器(或者运行ES的用户)的最大文件打开数,推荐设置为32K或64K。
为了测试一个进程的最大文件打开数,启动时配置参数-Des.max-open-filestrue。这样系统启动时就会打印最大文件打开数。
另外,你也可以通过解析下面API的结果中的max_file_descriptors参数获取每个节点的最大文件打开数:

curl localhost:9200/_nodes/stats/process?pretty

虚拟内存
Elasticsearch默认使用mmaps / niofs混合的目录存储类型存储索引。默认的操作系统限制mmaps(内存映射模式)中的虚拟地址空间限制太小了,可能会导致内存溢出,在Linux上,你可以使用root用户通过如下命令扩大限制:

sysctl -w vm.max_map_count=262144

如果想要永久改变这个参数的花,修改配置文件/etc/sysctl.conf中的vm.max_map_count这项配置。

注意:如果你是用安装包安装ES(.deb或rpm),这个配置会自动改变,你可以使用命令sysctl vm.max_map_count 来校验。

内存配置
大多数操作系统会尽可能多的使用内存给文件系统缓存并迫切的交换(后称swap)无用的应用内存到磁盘,这有可能导致Elasticsearch进程被swap到磁盘,swap十分消耗性能并且影响节点的稳定性,因此要不惜一切代价避免它发生。
你有三种选择:

注意:在内核版本3.5-rc1及以上,vm.swappiness设置为0的时候,触发OOM则会杀掉进程而不是进行swap,紧急情况下你需要设置该配置为1来确保swap是能够执行的。

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配置

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: <NAME OF YOUR CLUSTER>

确保你的集群名不会在不同环境复用,否则可能会导致节点加入错误的集群而出错。例如你可以使用 logging-dev,logging-stagelogging-prod表示开发集群,预发布(译者公司称作沙箱)集群和生产集群。

节点名

也许你也需要修改节点名称,就像主机名一样。默认情况下节点启动时会从3000个漫威人物名字中随机选取一个。

node.name: <NAME OF YOUR NODE>

译者批注:推荐命名用编号区分方便管理维护

机器的主机名可以通过系统变量 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

这将会每天在你的日志目录创建滚动日志,经常检查

上一节:Elasticsearch官档翻译——2 设置

下一节:Elasticsearch官档翻译——2.2 在Linux上启动服务

上一篇 下一篇

猜你喜欢

热点阅读