Elasticsearch有三个配置文件,分别是elasticsearch.yml、jvm.options和log4j2.properties.分别用来配置elasticsearch,elasticsearch的jvm和日志。如果安装时选择的是压缩包,那么一般这三个文件都保存在elasticsearch的文件夹中;如果是win安装包安装的,配置文件在c盘的ProgramData下,而不是ProgramFile。如果是linux通过安装工具安装的,例如apt-get,那么配置文件很可能在/etc/elasticsearch文件夹下;当然也可以通过更改环境变量ES_PATH_CONF更改配置文件位置。
一点小知识:
- elasticsearch配置文件都是yaml格式的,所以在配置的时候注意格式;
- 在配置文件中例如${HOSTNAME}表示使用环境变量HOSTNAME;
- 有些配置我们并不想写在配置文件中,而是想启动的时候根据情况再指定,则可以使用${prompt.text} 或 ${prompt.secret}指定某个配置项,这样在启动的时候就需要手动输入。
下面一个一个来解析配置文件。
elasticsearch.yml文件
示例配置内容如下:
bootstrap.memory_lock: false
cluster.name: elasticsearch
http.port: 9200
network.host: 127.0.0.1
node.data: true
node.ingest: true
node.master: true
node.max_local_storage_nodes: 1
node.name: WNT123
path.data: C:\ProgramData\Elastic\Elasticsearch\data
path.logs: C:\ProgramData\Elastic\Elasticsearch\logs
transport.tcp.port: 9300
reindex.remote.whitelist: 127.0.0.2:9200
- bootstrap.memory_lock: false: JVM的内存能swap到磁盘,不能则需要配置为true
- cluster.name: elasticsearch : 集群名称
- node.data: 表示节点是否存储数据
- node.master: 表示节点是否具有成为主节点的资格
- node.ingest: 节点是否具有预处理能力
- node.max_local_storage_nodes:同一安装路径最多可以启动的节点
- node.name: 节点名称
- path.data, path.logs: 数据文件和日志文件存放地址
- transport.tcp.port:节点通信的端口
- reindex.remote.whitelist:远程重建索引时的ip白名单
log4j2.properties日志配置文件
日志文件配置项较多,就挑一些重要的看一下。
elasticsearch的日志文件命名格式是这样的,如果你的配置项path.log的配置为C:\ProgramData\Elastic\Elasticsearch\logs,集群名称cluster.name是elasticsearch。那么你的日志一般就是长成C:\ProgramData\Elastic\Elasticsearch\logs\elasticsearch.log这个样子了。
- appender.rolling.fileName = s y s : e s . l o g s . b a s e p a t h {sys:es.logs.base_path} sys:es.logs.basepath{sys:file.separator}${sys:es.logs.cluster_name}.log 日志文件命名规则
- appender.rolling.filePattern = s y s : e s . l o g s . b a s e p a t h {sys:es.logs.base_path} sys:es.logs.basepath{sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz 日志过大时,会压缩,这是压缩日志文件的格式
- appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 使用基于时间的滚动策略
- appender.rolling.policies.time.interval = 1 滚动日志为一天一次
- appender.rolling.policies.time.modulate = true 每个自然日滚动,而不是24小时滚动
- appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 使用基于大小的滚动策略,就是说日志文件大概长这样子xxx-2019-01-01-1.log当本日的文件超过一定大小时,就会启动这一规则进行滚动
- appender.rolling.policies.size.size = 256MB 按大小滚动时的日志大小上限
- appender.rolling.strategy.action.type = Delete 滚动日志时使用删除操作(删除)
- appender.rolling.strategy.action.condition.type = IfFileName 仅删除与文件模式匹配的日志
- appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB 当日志文件大小达到2G时,启用压缩
如果想保留一定时间段之内的日志文件,可以这样配置: - appender.rolling.strategy.type = DefaultRolloverStrategy
- appender.rolling.strategy.action.type = Delete 不在这个时间段的删除
- appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
- appender.rolling.strategy.action.condition.type = IfFileName
- appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
- appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
- appender.rolling.strategy.action.condition.nested_condition.age = 7D 默认保留7天之内
另外,elasticsearch为了照顾到需要升级es的操作,可以配置logger.deprecation有关配置项,这样那些已经准备弃用的操作日志就会被打印出来,十分方便。
配置elasticsearch jvm
jvm配置就是配置java虚拟机,语法是通用的jvm配置语法。
-Xmx2g表示这个配置项是所有版本通用
2:-Xmx2g表示当jvm版本等于2时,此配置项才有效
2-:-Xmx2g表示当jvm版本大于等于2时配置项才有效
2-6:-Xmx2g表示当jvm版本在2和6之间时才有效
-6:-Xmx2g表示当jvm版本小于等于6时才有效
一般来说我们也不怎么需要改jvm的配置,安装好只好配置项如下所示:
# 自己加个注释
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch
-server
-Xss1m
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
-XX:+HeapDumpOnOutOfMemoryError
-Xmx2048m
-Xms2048m
- -XX:+UseConcMarkSweepGC:设置年老代为并发收集。配置这个以后,-XX:NewRatio=4的配置失效了。所以,此时年轻代大小最好用-Xmn设置
- XX:CMSInitiatingOccupancyFraction=75:表示年老代空间到70%时就开始执行CMS,确保年老代有足够的空间接纳来自年轻代的对象
- XX:+UseCMSInitiatingOccupancyOnly:使用手动定义初始化定义开始CMS收集,禁止hostspot自行触发CMS GC
- XX:+AlwaysPreTouch:JVM就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM.后续JVM就可以顺畅的访问内存了
- -server:server模式运行
- Xss1m:每个线程的堆栈大小1m
- Djava.awt.headless=true:对于一个Java服务器来说经常要处理一些图形元素,这些API基本上总是需要运行一个X-server以便能使用AWT。然而,运行一个不必要的X-server并不是一种好的网络管理方式。开启此配置可以禁用X-server
- Dfile.encoding=UTF-8:编码为utf8编码
- Djna.nosys=true:始终使用提供的JNA与系统之一
- Dio.netty.noUnsafe=true:使用Heap堆内存创建ByteBuf
- Dio.netty.noKeySetOptimization=true:没有密钥集
- Dio.netty.recycler.maxCapacityPerThread: netty回收配置,每个线程最大容量
- Dlog4j.shutdownHookEnabled:log4j配置,是否允许关闭hook
- Dlog4j2.disable.jmx: 是否禁用jmx
- Dlog4j.skipJansi: ConsoleAppender不会尝试在Windows上使用Jansi输出流
- XX:+HeapDumpOnOutOfMemoryError: 输出Heap Dump到指定文件
- Xmx: 初始堆大小
- Xmx: 最大堆大小 基本上这个配置也就修改一下堆大小,其他配置一般不需要修改。