5月29日 00:50
Elasticsearch 如何优化写入性能?
核心思路是减少刷新频率、批量提交、降低副本开销。具体操作:将 refresh_interval 设为 -1 禁用自动刷新,写入完成后手动 refresh;使用 Bulk API 批量提交文档(建议 5-15MB 一批);写入期间将 number_of_replicas 设为 0,写完后恢复;调大 translog.flush_threshold_size 减少 flush 次数;合理路由使热点数据集中写入少数分片,避免跨节点协调开销。
追问
bulk 请求多大合适?
建议单次 bulk 请求体 5-15MB,文档数不超 10000。过大易触发 GC 甚至 OOM,过小则网络开销占比高。用 BulkProcessor 可自动攒批提交。
refresh_interval=-1 写完忘改回来怎么办?
新写入文档对搜索不可见,但不丢数据。生产中可在索引模板中设置正常值,仅写入任务启动时临时覆盖。
副本数为 0 风险多大?
单节点故障会丢分片数据。建议仅在大批量初始导入时使用,写完立即恢复副本并等待 allocation 完成。
translog 配置怎么调?
将 translog.durability 改为 async,translog.sync_interval 设为 30s,flush_threshold_size 从默认 512MB 调到 1GB,减少磁盘 fsync 次数。
冷热数据如何隔离写入?
用 ILM 策略将新数据写入热节点(SSD),rollover 后迁移到冷节点(HDD)。hot 阶段设短 refresh_interval,cold 阶段恢复默认。
写段代码
jsonPUT /logs-write { "settings": { "refresh_interval": "-1", "number_of_replicas": 0, "translog": { "durability": "async", "sync_interval": "30s" } } }