ElasticSearch教程FG031-ElasticSearch性能调优与监控实战
内容简介:本文档风哥主要介绍ElasticSearch性能调优与监控的概念、实现方法以及最佳实践,包括系统级调优、JVM调优、索引调优、查询调优和监控配置等内容。通过学习本文,您将掌握如何优化ElasticSearch集群性能并建立完善的监控体系。风哥教程参考ElasticSearch官方文档Performance Tuning和Monitoring部分。
Part01-基础概念与理论知识
1.1 性能调优概述
性能调优是指通过优化系统配置、硬件资源和应用代码,提高ElasticSearch集群的性能和稳定性。性能调优的目标包括:
- 提高查询响应速度
- 增加索引吞吐量
- 提高集群稳定性
- 降低资源使用
1.2 监控指标
ElasticSearch的监控指标包括:
- 集群健康:集群状态、节点数量、分片状态
- 节点性能:CPU使用率、内存使用率、磁盘I/O
- 索引性能:索引吞吐量、索引延迟
- 查询性能:查询吞吐量、查询延迟
- JVM状态:堆内存使用、垃圾回收情况
1.3 调优策略
常见的调优策略包括:
- 系统级调优:优化操作系统参数
- JVM调优:优化JVM堆内存和垃圾回收
- 索引调优:优化索引结构和分片策略
- 查询调优:优化查询语句和缓存
- 硬件优化:选择合适的硬件配置
Part02-生产环境规划与建议
2.1 硬件规划
硬件规划建议:
- CPU:选择多核、高主频的CPU
- 内存:根据数据量和查询需求配置足够的内存
- 存储:使用SSD存储提高I/O性能
- 网络:使用万兆网络提高节点间通信速度
- 节点数量:根据数据量和高可用性要求配置足够的节点
2.2 配置规划
配置规划建议:
- 集群配置:合理设置集群名称、节点角色和发现机制
- 索引配置:根据数据量和查询需求设置合理的分片数和副本数
- JVM配置:根据服务器内存设置合理的堆内存大小
- 系统配置:优化操作系统参数,如文件描述符、内存限制等
2.3 监控规划
监控规划建议:
- 监控工具:使用Elasticsearch Monitoring、Kibana、Prometheus等
- 监控指标:监控集群健康、节点性能、索引性能、查询性能等
- 告警策略:设置合理的告警阈值和通知方式
- 监控频率:根据业务需求设置合适的监控频率
Part03-生产环境项目实施方案
3.1 系统级调优
系统级调优:
vi /etc/security/limits.conf
# 添加以下配置
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
# 优化虚拟内存
vi /etc/sysctl.conf
# 添加以下配置
vm.max_map_count=262144
fs.file-max=65536
# 应用配置
sysctl -p
# 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 关闭NUMA
vi /etc/default/grub
# 在GRUB_CMDLINE_LINUX中添加
numa=off
# 更新grub
grub2-mkconfig -o /boot/grub2/grub.cfg
3.2 JVM调优
JVM调优:
vi /es/app/elasticsearch-8.10.0/config/jvm.options
# 设置堆内存大小(建议为物理内存的50%,最大不超过32GB)
-Xms16g
-Xmx16g
# 启用G1垃圾回收器
-XX:+UseG1GC
# 设置G1垃圾回收器参数
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
-XX:InitiatingHeapOccupancyPercent=75
# 禁用显式GC
-XX:+DisableExplicitGC
# 启用堆内存溢出日志
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/es/app/elasticsearch-8.10.0/logs/heapdump.hprof
3.3 索引调优
索引调优:
curl -X PUT “http://192.168.1.10:9200/fgedu-products” -H “Content-Type: application/json” -d ‘{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 2,
“refresh_interval”: “30s”,
“index.translog.durability”: “async”,
“index.translog.sync_interval”: “5s”
},
“mappings”: {
“properties”: {
“name”: {
“type”: “text”,
“analyzer”: “standard”
},
“price”: {
“type”: “float”
},
“category”: {
“type”: “keyword”
}
}
}
}’
# 优化现有索引
curl -X PUT “http://192.168.1.10:9200/fgedu-products/_settings” -H “Content-Type: application/json” -d ‘{
“index”: {
“refresh_interval”: “60s”,
“number_of_replicas”: 1
}
}’
3.4 查询调优
查询调优:
curl -X PUT “http://192.168.1.10:9200/fgedu-products/_settings” -H “Content-Type: application/json” -d ‘{
“index”: {
“query”: {
“cache”: {
“enabled”: true,
“size”: “1%”
}
}
}
}’
# 优化查询语句
# 避免使用wildcard查询
# 避免使用script查询
# 使用filter替代query
# 合理使用聚合
# 示例:优化前的查询
curl -X POST “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“name”: “iphone”
}
},
{
“range”: {
“price”: {
“lte”: 10000
}
}
}
]
}
}
}’
# 示例:优化后的查询
curl -X POST “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“name”: “iphone”
}
}
],
“filter”: [
{
“range”: {
“price”: {
“lte”: 10000
}
}
}
]
}
}
}’
3.5 监控配置
监控配置:
curl -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“xpack.monitoring.collection.enabled”: true
}
}’
# 配置Kibana监控
# 在kibana.yml中添加
# xpack.monitoring.ui.container.elasticsearch.enabled: true
# 使用Prometheus监控
# 安装elasticsearch_exporter
wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.5.0/elasticsearch_exporter-1.5.0.linux-amd64.tar.gz
tar -xzf elasticsearch_exporter-1.5.0.linux-amd64.tar.gz
mv elasticsearch_exporter-1.5.0.linux-amd64/elasticsearch_exporter /usr/local/bin/
# 创建systemd服务
vi /etc/systemd/system/elasticsearch_exporter.service
[Unit]
Description=Elasticsearch Exporter
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/bin/elasticsearch_exporter –es.uri=http://192.168.1.10:9200
Restart=always
[Install]
WantedBy=multi-user.target
# 启动服务
systemctl daemon-reload
systemctl start elasticsearch_exporter
systemctl enable elasticsearch_exporter
Part04-生产案例与实战讲解
4.1 系统级调优实战
系统级调优:
vi /etc/security/limits.conf
# 添加以下配置
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
# 2. 优化虚拟内存
vi /etc/sysctl.conf
# 添加以下配置
vm.max_map_count=262144
fs.file-max=65536
# 3. 应用配置
sysctl -p
# 4. 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 5. 验证配置
sysctl vm.max_map_count
ulimit -n
cat /sys/kernel/mm/transparent_hugepage/enabled
4.2 JVM调优实战
JVM调优:
vi /es/app/elasticsearch-8.10.0/config/jvm.options
# 2. 设置堆内存大小
-Xms16g
-Xmx16g
# 3. 启用G1垃圾回收器
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
-XX:InitiatingHeapOccupancyPercent=75
# 4. 禁用显式GC
-XX:+DisableExplicitGC
# 5. 启用堆内存溢出日志
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/es/app/elasticsearch-8.10.0/logs/heapdump.hprof
# 6. 重启ElasticSearch
systemctl restart elasticsearch
# 7. 验证JVM配置
curl -X GET “http://192.168.1.10:9200/_nodes/stats/jvm?pretty”
4.3 索引调优实战
索引调优:
curl -X PUT “http://192.168.1.10:9200/fgedu-products” -H “Content-Type: application/json” -d ‘{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 2,
“refresh_interval”: “30s”,
“index.translog.durability”: “async”,
“index.translog.sync_interval”: “5s”,
“index.merge.policy.max_merged_segment”: “5gb”,
“index.codec”: “best_compression”
},
“mappings”: {
“properties”: {
“name”: {
“type”: “text”,
“analyzer”: “standard”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}
},
“price”: {
“type”: “float”
},
“category”: {
“type”: “keyword”
},
“timestamp”: {
“type”: “date”
}
}
}
}’
# 2. 插入测试数据
curl -X POST “http://192.168.1.10:9200/fgedu-products/_bulk” -H “Content-Type: application/json” -d ‘{
“index”: {}
{“name”: “iPhone 14”, “price”: 5999, “category”: “手机”, “timestamp”: “2024-01-01T00:00:00Z”}
{“index”: {}
{“name”: “iPhone 14 Pro”, “price”: 7999, “category”: “手机”, “timestamp”: “2024-01-01T00:01:00Z”}
{“index”: {}
{“name”: “iPhone 14 Pro Max”, “price”: 8999, “category”: “手机”, “timestamp”: “2024-01-01T00:02:00Z”}
}’
# 3. 执行forcemerge
curl -X POST “http://192.168.1.10:9200/fgedu-products/_forcemerge?max_num_segments=1”
4.4 查询调优实战
查询调优:
curl -X PUT “http://192.168.1.10:9200/fgedu-products/_settings” -H “Content-Type: application/json” -d ‘{
“index”: {
“query”: {
“cache”: {
“enabled”: true,
“size”: “1%”
}
}
}
}’
# 2. 优化查询语句
# 示例:使用filter替代query
curl -X POST “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“name”: “iphone”
}
}
],
“filter”: [
{
“range”: {
“price”: {
“lte”: 10000
}
}
},
{
“term”: {
“category”: “手机”
}
}
]
}
},
“size”: 10,
“sort”: [
{
“price”: {
“order”: “desc”
}
}
]
}’
# 3. 使用聚合时设置合理的size
curl -X POST “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“size”: 0,
“aggs”: {
“categories”: {
“terms”: {
“field”: “category”,
“size”: 10
}
}
}
}’
4.5 监控配置实战
监控配置:
curl -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“xpack.monitoring.collection.enabled”: true
}
}’
# 2. 安装并配置Prometheus
# 下载Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.43.0/prometheus-2.43.0.linux-amd64.tar.gz
tar -xzf prometheus-2.43.0.linux-amd64.tar.gz
mv prometheus-2.43.0.linux-amd64 /usr/local/prometheus
# 配置Prometheus
vi /usr/local/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘elasticsearch’
static_configs:
– targets: [‘192.168.1.10:9114’]
# 3. 启动Prometheus
systemctl start prometheus
# 4. 安装并配置Grafana
# 下载Grafana
wget https://dl.grafana.com/oss/release/grafana-9.5.2.linux-amd64.tar.gz
tar -xzf grafana-9.5.2.linux-amd64.tar.gz
mv grafana-9.5.2 /usr/local/grafana
# 启动Grafana
systemctl start grafana-server
# 5. 导入Elasticsearch监控面板
# 在Grafana中导入面板ID:14192
Part05-风哥经验总结与分享
5.1 性能调优最佳实践
- 硬件选择:根据业务需求选择合适的硬件配置
- 系统优化:优化操作系统参数,如文件描述符、虚拟内存等
- JVM调优:合理设置堆内存大小,选择合适的垃圾回收器
- 索引优化:根据数据量和查询需求设置合理的分片数和副本数
- 查询优化:优化查询语句,使用filter替代query,合理使用缓存
- 监控体系:建立完善的监控体系,及时发现和解决性能问题
- 定期维护:定期执行forcemerge、清理过期数据等维护操作
5.2 常见问题与解决方案
- 查询延迟高:优化查询语句,增加缓存,调整分片数
- 索引速度慢:调整refresh_interval,使用bulk API,优化硬件
- 内存使用率高:调整JVM堆内存大小,优化缓存配置
- 磁盘I/O高:使用SSD存储,优化索引配置,减少磁盘操作
- CPU使用率高:优化查询语句,减少聚合操作,增加节点数
5.3 监控与告警建议
- 监控指标:重点监控集群健康、节点性能、索引性能、查询性能等指标
- 告警阈值:设置合理的告警阈值,如CPU使用率超过80%、内存使用率超过90%等
- 告警方式:使用邮件、短信、Slack等多种告警方式
- 监控频率:根据业务需求设置合适的监控频率,如15秒一次
- 监控面板:使用Grafana创建直观的监控面板,方便查看集群状态
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
学习交流加群风哥QQ113257174
风哥提示:性能调优是一个持续的过程,需要根据业务需求和集群状态不断调整
更多学习教程公众号风哥教程itpux_com
from ElasticSearch视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
