ElasticSearch教程FG003-ElasticSearch配置文件参数详解与调优
本文档风哥主要介绍ElasticSearch数据库的配置文件参数详解与调优,包括ElasticSearch的配置文件结构、JVM配置、集群配置、节点配置、性能调优、内存优化、I/O优化等内容,风哥教程参考ElasticSearch官方文档Configuring Elasticsearch、Important configuration等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 ElasticSearch配置文件
ElasticSearch的主要配置文件包括:
- elasticsearch.yml:主要配置文件,包含集群、节点、网络等配置
- jvm.options:JVM配置文件,包含堆大小、GC策略等配置
- log4j2.properties:日志配置文件,包含日志级别、输出格式等配置
1.2 JVM配置基础
JVM配置是ElasticSearch性能的关键因素,主要包括:
- 堆大小:设置JVM堆的最小和最大大小
- GC策略:选择合适的垃圾回收器
- 内存分配:调整内存分配策略
- 系统属性:设置JVM系统属性
1.3 调优原则
ElasticSearch调优的基本原则:
- 了解工作负载:根据实际使用场景调整配置
- 监控性能:定期监控集群性能指标
- 渐进式调整:小步调整,观察效果
- 测试验证:在测试环境验证调优效果
- 文档化配置:记录配置变更和效果
Part02-生产环境规划与建议
2.1 集群配置建议
ElasticSearch集群配置建议:
## 1. 集群名称
cluster.name: fgedu-cluster
## 2. 节点发现
# 生产环境建议使用固定的种子主机
cluster.initial_master_nodes: [“node-1”, “node-2”, “node-3”]
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
## 3. 集群级设置
# 分片分配策略
cluster.routing.allocation.enable: all
# 集群恢复设置
cluster.routing.allocation.node_concurrent_recoveries: 2
cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 断路器设置
cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%
2.2 节点配置建议
ElasticSearch节点配置建议:
## 1. 节点名称
node.name: node-1
## 2. 节点角色
# 生产环境建议分离角色
# 主节点
node.roles: [master]
# 数据节点
node.roles: [data]
# 协调节点
node.roles: []
# ingest节点
node.roles: [ingest]
## 3. 路径设置
path.data: /es/fgdata
path.logs: /es/app/elasticsearch/logs
## 4. 网络配置
network.host: 192.168.1.10
http.port: 9200
transport.port: 9300
## 5. 内存配置
# 在jvm.options中设置
# -Xms16g
# -Xmx16g
2.3 JVM调优建议
JVM调优建议:
- 堆大小:设置为物理内存的50%,最大不超过32GB
- GC策略:使用G1GC垃圾回收器
- 内存锁定:启用内存锁定,避免内存交换
- 线程池:根据CPU核心数调整线程池大小
Part03-生产环境项目实施方案
3.1 elasticsearch.yml配置实战
elasticsearch.yml配置实战:
# 集群配置
cluster.name: fgedu-cluster
# 节点配置
node.name: node-1
node.roles: [master, data, ingest]
# 路径配置
path.data: /es/fgdata
path.logs: /es/app/elasticsearch/logs
# 网络配置
network.host: 192.168.1.10
http.port: 9200
transport.port: 9300
# 集群发现
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
cluster.initial_master_nodes: [“node-1”, “node-2”, “node-3”]
# 内存配置
bootstrap.memory_lock: true
# 集群级设置
cluster.routing.allocation.enable: all
cluster.routing.allocation.node_concurrent_recoveries: 2
cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 断路器设置
cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%
# 线程池设置
thread_pool.search.size: 16
thread_pool.search.queue_size: 1000
thread_pool.write.size: 8
thread_pool.write.queue_size: 1000
# 索引设置
index.number_of_shards: 5
index.number_of_replicas: 2
# 安全设置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
3.2 jvm.options配置实战
jvm.options配置实战:
# 堆大小设置
-Xms16g
-Xmx16g
# GC策略
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=4
-XX:InitiatingHeapOccupancyPercent=75
# 内存配置
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/es/app/elasticsearch/logs/heapdump.hprof
# 系统属性
-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
-Dlog4j2.formatMsgNoLookups=true
-Djava.locale.providers=SPI,COMPAT
# 临时目录
-Djava.io.tmpdir=/tmp
3.3 log4j2.properties配置实战
log4j2.properties配置实战:
# 日志级别
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
# 日志文件
appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log.gz
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 256MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 30
# 日志记录器
rootLogger.level = info
rootLogger.appenderRef.console.ref = console
rootLogger.appenderRef.rolling.ref = rolling
# 特定包的日志级别
logger.org.apache.http.level = warn
logger.org.apache.hadoop.level = warn
logger.org.elasticsearch.level = info
logger.org.elasticsearch.discovery.level = info
logger.org.elasticsearch.cluster.service.level = info
Part04-生产案例与实战讲解
4.1 性能调优实战
ElasticSearch性能调优实战:
## 1. 查看当前配置
$ curl -u elastic:your_password -X GET “http://192.168.1.10:9200/_cluster/settings?pretty”
{
“persistent” : {
“cluster” : {
“routing” : {
“allocation” : {
“disk” : {
“threshold_enabled” : “true”,
“watermark” : {
“flood_stage” : “95%”,
“high” : “90%”,
“low” : “85%”
}
}
}
}
}
},
“transient” : { }
}
## 2. 动态调整集群设置
$ curl -u elastic:your_password -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“cluster.routing.allocation.node_concurrent_recoveries”: 4,
“cluster.routing.allocation.node_initial_primaries_recoveries”: 8
}
}’
{
“acknowledged” : true,
“persistent” : {
“cluster” : {
“routing” : {
“allocation” : {
“node_concurrent_recoveries” : “4”,
“node_initial_primaries_recoveries” : “8”
}
}
}
},
“transient” : { }
}
## 3. 调整线程池设置
$ curl -u elastic:your_password -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“thread_pool.search.size”: 32,
“thread_pool.search.queue_size”: 2000,
“thread_pool.write.size”: 16,
“thread_pool.write.queue_size”: 2000
}
}’
{
“acknowledged” : true,
“persistent” : {
“thread_pool” : {
“search” : {
“queue_size” : “2000”,
“size” : “32”
},
“write” : {
“queue_size” : “2000”,
“size” : “16”
}
}
},
“transient” : { }
}
4.2 内存优化实战
ElasticSearch内存优化实战:
## 1. 查看JVM内存使用情况
$ curl -u elastic:your_password -X GET “http://192.168.1.10:9200/_nodes/stats/jvm?pretty”
{
“nodes” : {
“node-1” : {
“jvm” : {
“mem” : {
“heap_used_in_bytes” : 8589934592,
“heap_used_percent” : 50,
“heap_committed_in_bytes” : 17179869184,
“heap_max_in_bytes” : 17179869184,
“non_heap_used_in_bytes” : 201326592,
“non_heap_committed_in_bytes” : 2147483648
},
“gc” : {
“collectors” : {
“old” : {
“collection_count” : 0,
“collection_time_in_millis” : 0
},
“young” : {
“collection_count” : 12,
“collection_time_in_millis” : 150
}
}
}
}
}
}
}
## 2. 调整JVM堆大小
$ vi /es/app/elasticsearch/config/jvm.options
# 修改堆大小
-Xms32g
-Xmx32g
## 3. 重启服务
$ systemctl restart elasticsearch
## 4. 验证内存配置
$ curl -u elastic:your_password -X GET “http://192.168.1.10:9200/_nodes/stats/jvm?pretty”
{
“nodes” : {
“node-1” : {
“jvm” : {
“mem” : {
“heap_used_in_bytes” : 8589934592,
“heap_used_percent” : 25,
“heap_committed_in_bytes” : 34359738368,
“heap_max_in_bytes” : 34359738368,
“non_heap_used_in_bytes” : 201326592,
“non_heap_committed_in_bytes” : 2147483648
}
}
}
}
}
4.3 I/O优化实战
ElasticSearch I/O优化实战:
## 1. 查看磁盘使用情况
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 10G 38G 21% /
/dev/sdb1 200G 50G 140G 27% /es
## 2. 调整索引刷新间隔
$ curl -u elastic:your_password -X PUT “http://192.168.1.10:9200/fgedu-index/_settings” -H “Content-Type: application/json” -d ‘{
“index”: {
“refresh_interval”: “30s”,
“translog”: {
“durability”: “async”,
“flush_threshold_size”: “512mb”
}
}
}’
{
“acknowledged” : true
}
## 3. 调整合并策略
$ curl -u elastic:your_password -X PUT “http://192.168.1.10:9200/fgedu-index/_settings” -H “Content-Type: application/json” -d ‘{
“index”: {
“merge”: {
“policy”: {
“max_merge_size”: “5gb”,
“segments_per_tier”: 10,
“max_merged_segment”: “5gb”
}
}
}
}’
{
“acknowledged” : true
}
## 4. 查看I/O性能
$ iostat -d -x 1
Device r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 10.0 20.0 400.0 800.0 40.0 0.1 3.0 2.0 3.5 0.5 1.5
Part05-风哥经验总结与分享
5.1 配置最佳实践
ElasticSearch配置最佳实践:
- 集群配置:
- 使用有意义的集群名称
- 配置固定的种子主机
- 设置合适的磁盘水位线
- 节点配置:
- 分离节点角色,提高集群稳定性
- 配置合理的路径设置
- 启用内存锁定,避免内存交换
- JVM配置:
- 设置合适的堆大小(物理内存的50%)
- 使用G1GC垃圾回收器
- 启用堆转储,便于问题排查
- 性能调优:
- 根据硬件配置调整线程池大小
- 合理设置索引刷新间隔
- 优化合并策略,减少I/O操作
5.2 常见问题与解决方案
ElasticSearch配置常见问题与解决方案:
## 1. 内存不足
– 症状:JVM堆内存使用过高,频繁GC
– 解决方案:
– 调整JVM堆大小
– 优化查询,减少内存使用
– 增加节点内存
## 2. I/O性能瓶颈
– 症状:磁盘I/O使用率高,索引速度慢
– 解决方案:
– 使用SSD存储
– 调整索引刷新间隔
– 优化合并策略
– 增加数据节点
## 3. 集群不稳定
– 症状:集群状态频繁变化,节点频繁加入/退出
– 解决方案:
– 检查网络连接
– 配置合适的发现设置
– 确保所有节点时间同步
– 调整集群故障检测参数
## 4. 查询性能差
– 症状:查询响应时间长
– 解决方案:
– 优化查询语句
– 增加查询线程池大小
– 优化索引结构
– 增加协调节点
## 5. 分片分配失败
– 症状:分片无法分配,集群状态为yellow或red
– 解决方案:
– 检查磁盘空间
– 检查节点状态
– 调整分片分配策略
– 手动分配分片
5.3 调优检查清单
ElasticSearch调优检查清单:
## 1. 硬件配置
– [ ] 内存是否足够(至少16GB)
– [ ] 是否使用SSD存储
– [ ] CPU核心数是否足够(至少8核)
– [ ] 网络带宽是否足够(至少1Gbps)
## 2. 系统配置
– [ ] 内存锁定是否启用
– [ ] 文件描述符是否足够(至少65536)
– [ ] 最大虚拟内存区域是否足够(至少262144)
– [ ] 透明大页是否关闭
## 3. JVM配置
– [ ] 堆大小是否合理(物理内存的50%)
– [ ] 是否使用G1GC垃圾回收器
– [ ] 堆转储是否启用
– [ ] GC日志是否配置
## 4. 集群配置
– [ ] 集群名称是否设置
– [ ] 节点发现配置是否正确
– [ ] 磁盘水位线是否设置
– [ ] 分片分配策略是否优化
## 5. 索引配置
– [ ] 分片数是否合理
– [ ] 副本数是否设置
– [ ] 刷新间隔是否优化
– [ ] 合并策略是否配置
## 6. 监控与维护
– [ ] 是否配置监控
– [ ] 是否设置告警
– [ ] 日志是否正常轮转
– [ ] 定期备份是否配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
