用途:规划集群容量与分片数,避免“分片过多”这一最常见的性能问题
- 主分片(primary):文档按
hash(_routing) % number_of_primary_shards 落片;主分片数创建后不可改(改需 reindex 或 split/shrink)。
- 副本分片(replica):高可用 + 读扩展;副本数可动态调整。
- 每个分片是一个 Lucene 索引:独立段文件、独立缓存、独立事务日志(translog)。分片数不是越多越好。
| 约束 |
说明 |
| 单分片大小 |
搜索类业务常取 10-50GB;日志类可到 30-50GB(依硬件与查询模式) |
| 分片总数 |
与堆内存挂钩:每分片有固定开销(段、词典、集群元数据),常见经验值每 GB 堆不超过 ~20 个分片 |
| 小分片危害 |
大量小分片导致查询扇出、合并、集群状态广播开销剧增 |
| 过热分片 |
单分片承载热点写入/查询,成为瓶颈 |
过度分片是 ES 集群最常见的性能问题,症状:CPU 高但吞吐低、集群状态更新慢、查询延迟毛刺。
- 写入路由:
_routing 参数决定落片,自定义路由可让同租户/同实体数据同片。
- 查询时带
routing 只查目标分片,显著降低扇出(多租户场景收益大)。
- 注意:路由值变更需 reindex;倾斜路由会造成分片不均。
| 配置 |
效果 |
number_of_replicas: 1 |
默认,可容忍单分片所在节点故障 |
0(写入期间) |
批量导入提速,完成后恢复副本 |
wait_for_active_shards |
控制写请求对副本可用性的要求 |
| 跨机架/可用区分配 |
用 shard allocation awareness 防同机房全灭 |
- 节点上下线触发自动再平衡,可用
cluster.routing.allocation.* 控制速率,避免白天大规模搬迁。
- 磁盘水位(默认 85%/90%)触发:禁止分配 → 只读索引(
index.blocks.read_only_allow_delete)。只读锁是常见“突然写不进去”的原因,清理磁盘后需手动解除。
- 冷热架构:hot(SSD、写入与近期查询)→ warm(大容量、低频)→ cold/frozen(对象存储搜索),用 ILM 自动迁移。
| 误区 |
修正 |
| 分片越多并发越好 |
扇出与元数据开销上升,通常相反 |
| 按 CPU 核数决定分片数 |
应按数据量、查询模式与堆容量综合规划 |
| 忘记主分片数不可改 |
上线前压测确定,或用别名 + reindex 方案 |
| 副本设 0 后忘记恢复 |
故障即丢数据 |
| 磁盘满导致索引只读后只重启 |
必须清理并解除 read_only 块 |
用 cat indices 不看分片大小分布 |
倾斜无法发现 |
- Elasticsearch 官方文档:Shard allocation、Disk-based shard allocation、ILM
- 《Elasticsearch 权威指南》扩容与容量规划章节