跳转到内容

分片、副本与路由

用途:规划集群容量与分片数,避免“分片过多”这一最常见的性能问题

  • 主分片(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 权威指南》扩容与容量规划章节