Elasticsearch 写入性能优化有哪些常见手段?
Elasticsearch 写入性能优化常见手段主要有以下 10 个方向,建议根据具体业务场景组合使用:
- 批量写入优化
- 使用
_bulk
API 批量提交文档 - 建议每批次 5-15MB 数据量
- 并发执行多个批量请求
- 索引配置调优
PUT /my_index
{"settings": {"index.refresh_interval": "30s", // 降低刷新频率"index.number_of_replicas": 0, // 写入时禁用副本"index.translog.durability": "async" // 异步translog}
}
- 硬件资源优化
- 使用 SSD 磁盘(IOPS 提升 10 倍+)
- 预留 50% 内存给文件系统缓存
- 设置合理的 JVM 堆内存(建议不超过 32GB)
- 文档结构优化
- 避免嵌套文档(Nested)类型
- 禁用不需要的字段索引
"my_field": { "type": "keyword","index": false // 不索引该字段
}
- 分片策略优化
- 单个分片大小控制在 20-50GB
- 分片数 = 节点数 × 1.5(写入密集型场景)
- 使用 routing 路由写入
- 线程池调整
thread_pool:write:size: 16 # 根据 CPU 核数调整queue_size: 1000
- 存储优化
- 禁用 _source 字段(节省 30%+ 存储)
PUT /my_index
{"_source": {"enabled": false}
}
- 合并策略优化
"index.merge.policy": {"max_merged_segment": "5gb","segments_per_tier": 10
}
- 集群架构优化
- 专用协调节点处理写入请求
- 冷热分离架构(Hot-Warm)
- 使用 Ingest Pipeline 预处理数据
- 监控与诊断
# 查看写入延迟
GET _nodes/hot_threads# 监控 segment 状态
GET /_cat/segments?v
典型优化效果对比:
优化项 | 默认配置 | 优化配置 | 吞吐提升 |
---|---|---|---|
批量写入 | 单文档 | 5MB批次 | 10x+ |
刷新间隔 | 1s | 30s | 3x |
副本数 | 1 | 0 | 2x |
线程池队列 | 200 | 1000 | 5x |
注意事项:
- 日志类场景建议禁用副本,搜索类场景保留副本
- 调优后需持续监控 CPU/IO 使用率
- 定期执行 _forcemerge 减少 segment 数量
- 7.x+ 版本建议使用时序模式(Time Series)