es性能优化
先思考
1,硬件
至少4C8G
多节点
2,索引
分片合理 比如5主1副,根据数据量计算分片
刷新时机30s
3,写入
批量
多线程并行
4,查询
并行查询
补充
2,
mapping 优化
Doc Values优化
-
聚合/排序必须依赖doc_values
-
对纯过滤字段可禁用节省空间:
选择合适text keyword
3,写入
刷新30s
4,查询
只查询需要的
用filter代替query,filter不计算评分,可走缓存
深分页:search_after代替 from size
DS
Elasticsearch 性能优化全面指南
Elasticsearch 性能优化需要从多个维度进行综合考虑。以下是系统化的优化方案,按照优先级排序:
一、硬件与基础设施优化
1. 节点配置
-
内存分配:
-
JVM堆内存不超过物理内存的50%(最大不超过32GB)
-
剩余内存留给文件系统缓存
-
示例配置:
-Xms16g -Xmx16g
-
-
磁盘选择:
-
使用SSD(特别是高IOPS场景)
-
避免使用NFS等网络存储
-
推荐配置:RAID 0或单块高性能SSD
-
-
CPU核心:
-
每个节点至少4-8核
-
搜索密集型场景需要更多核心
-
2. 集群规划
-
分片策略:
-
单个分片大小控制在10-50GB
-
分片数 = 数据总量(GB)/30GB
-
示例:500GB数据 → 17个分片
-
-
节点角色分离:
yaml
复制
下载
node.master: true node.data: false node.ingest: false
-
专用master节点(3-5个)
-
专用data节点
-
专用coordinating节点
二、索引设计优化
1. 映射优化
-
字段精简:
-
禁用不需要的字段:
"enabled": false
-
排除不需要返回的字段:
"store": false
-
-
类型选择:
-
数值类型选择最小够用的类型(如byte代替integer)
-
文本搜索使用
text
,精确匹配使用keyword
-
-
多字段配置:
json
复制
下载
{"product_name": {"type": "text","fields": {"raw": { "type": "keyword" }}} }
2. 索引设置
json
复制
下载
{"settings": {"index": {"number_of_shards": 10,"number_of_replicas": 1,"refresh_interval": "30s","translog": {"sync_interval": "5s","durability": "async"}}} }
三、查询性能优化
1. 查询DSL优化
-
使用filter代替query:
-
filter不计算评分,可利用缓存
-
json
复制
下载
{"query": {"bool": {"filter": [{"term": { "status": "active" }}]}} }
-
避免深度分页:
-
使用
search_after
代替from/size
-
对于TOP N结果使用
"size": 0
+ 聚合
-
-
字段数据加载:
-
禁用不需要排序/聚合字段的doc_values:
json
复制
下载
{"price": {"type": "integer","doc_values": false} }
-
2. 搜索模板
-
使用预编译查询模板:
json
复制
下载
POST _scripts/search_template_1 {"script": {"lang": "mustache","source": {"query": {"match": {"{{field}}": "{{value}}"}}}} }
四、写入性能优化
1. 批量操作
-
合理的bulk大小:
-
建议5-15MB/请求
-
通过测试找到最佳值
-
-
并行化写入:
-
多线程发送bulk请求
-
根据集群规模调整并发数
-
2. 刷新与合并优化
json
复制
下载
PUT /my_index/_settings {"index": {"refresh_interval": "30s","merge": {"scheduler": {"max_thread_count": 1}}} }
五、监控与维护
1. 关键监控指标
-
集群健康:
-
GET _cluster/health
-
关注unassigned_shards和pending_tasks
-
-
节点状态:
-
GET _nodes/stats
-
重点监控JVM堆内存、GC时间、IO等待
-
2. 定期维护
-
冷数据归档:
-
使用ILM(Index Lifecycle Management)
-
示例策略:
-
json
复制
下载
PUT _ilm/policy/cold_data_policy {"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50gb"}}},"delete": {"min_age": "30d","actions": {"delete": {}}}}} }
-
定期force merge:
bash
复制
下载
POST /my_index/_forcemerge?max_num_segments=1