Elasticsearch 索引设计
数据存储584 字预计 2 分钟阅读
全方位探讨 Elasticsearch(ES)分片规划、Mapping 定义以及写入性能调优实战。
引言
Elasticsearch(ES)因其出色的全文检索和日志分析能力被广泛采用。然而,ES 的性能高度依赖于前期的“索引设计(Index Design)”。由于 ES 的分片数量一旦设定后无法直接修改(修改需要 Reindex 重建),一旦前期规划失误,后期运维将举步维艰。
分片与副本规划原则
主分片 (Primary Shard)
- 定义:数据物理分割的最小单位,包含一部分数据。
- 规划原则:每个主分片的大小建议控制在 20GB - 50GB 之间。过大(如 >100GB)会导致故障恢复或重平衡时网络传输极慢;过小则会产生海量的碎片文件,耗尽 JVM 内存。
副本分片 (Replica Shard)
- 定义:主分片的完整备份。
- 规划原则:一般生产环境建议设置
1个副本,既能保障高可用和容灾,又可以通过副本分片并发承载读取请求,提升读取吞吐量。
Mapping 的显式定义规范
在生产环境中,千万不要依赖 ES 默认的动态 Mapping 自动推断。必须使用显式 API 定义索引字段的数据结构:
Keyword 与 Text 的选择
- Text:会对输入的文本进行分词(Analyzer),建立倒排索引,用于全文模糊搜索。它不支持聚合计算和排序。
- Keyword:不分词,直接将整个字符串作为一个词项。它适合精确查询(Term Query)、聚合(Aggregations)和排序操作。
禁用 doc_values 与 _source
- 如果某个大文本字段只需要被搜索,而永远不需要参与排序或聚合,可以关闭该字段的
doc_values以节省磁盘空间。 - 如果是极大规模的纯分析型索引,甚至可以关闭
_source,但通常不建议这么做,因为会导致更新或 Reindex 时无法读取原数据。
高频写入性能优化
在面临海量日志(如每秒数万条写入)时,必须做出优化:
- 加大 refresh_interval:默认 1 秒。可以修改为 30 秒,将内存中的 segment 写入磁盘的频率降低,减轻磁盘 I/O 压力。
- 禁用副本写入:在进行大批量历史数据冷导入时,可以先将副本数
number_of_replicas设置为 0,导入完毕后再改回 1。