1. 首页 > ElasticSearch教程 > 正文

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调优的基本原则:

  • 了解工作负载:根据实际使用场景调整配置
  • 监控性能:定期监控集群性能指标
  • 渐进式调整:小步调整,观察效果
  • 测试验证:在测试环境验证调优效果
  • 文档化配置:记录配置变更和效果
风哥提示:ElasticSearch的配置调优需要根据实际硬件环境和业务需求进行,没有放之四海而皆准的配置方案。学习交流加群风哥微信: itpux-com

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核心数调整线程池大小
生产环境建议:JVM堆大小设置为物理内存的50%,预留足够的内存给操作系统和文件系统缓存。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 elasticsearch.yml配置实战

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配置实战:

# 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配置实战:

# 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优化实战:

# 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

风哥提示:I/O优化是ElasticSearch性能调优的重要部分,建议使用SSD存储,并合理配置索引刷新间隔和合并策略,以减少I/O操作。更多学习教程公众号风哥教程itpux_com

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. 监控与维护
– [ ] 是否配置监控
– [ ] 是否设置告警
– [ ] 日志是否正常轮转
– [ ] 定期备份是否配置

持续调优:ElasticSearch的配置调优是一个持续的过程,需要根据业务需求和硬件环境的变化不断调整。建议建立定期性能评估和调优的机制。from ElasticSearch视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息