在Elasticsearch中,分片(shard)和副本(replica) 的设置直接影响集群性能、容错能力和扩展性。以下是最佳实践指南:
核心概念
类型 | 描述 | 是否可修改 |
---|---|---|
主分片(Primary Shard) | 数据的最小存储单元,每个索引被拆分成多个主分片 | ❌ 索引创建后不可修改 |
副本分片(Replica Shard) | 主分片的完整拷贝,提供数据冗余和读取负载均衡 | ✅ 随时动态调整 |
配置原则
1. 分片数设置规则
- 黄金法则:每个分片大小控制在 10-50GB 之间
- 计算公式:
主分片数 = 总数据量 / 单分片容量(建议30GB)
例如:1TB数据 → 1000GB / 30GB ≈ 33个分片 - 最大限制:
单个节点建议不超过 20-25个分片/GB堆内存
(如32GB内存节点,最多600-800个分片)
2. 副本数设置规则
场景 | 推荐副本数 | 说明 |
---|---|---|
开发/测试环境 | 0-1 | 节省资源 |
生产环境(常规) | 1-2 | 平衡冗余和存储成本 |
高可用关键业务 | 2-3 | 允许同时宕机2个节点 |
海量读取场景 | 3-5 | 提升查询吞吐量 |
配置示例
创建索引时指定(关键步骤!)
PUT /your_index { "settings": { "number_of_shards": 5, // 主分片数 "number_of_replicas": 2 // 每个主分片的副本数 } }
动态调整副本数(无需停机)
PUT /your_index/_settings { "index.number_of_replicas": 1 }
高级优化策略
热温架构(Hot-Warm)
{ "index.routing.allocation.require.data_type": "hot" // 热节点存放新数据 }
分片自动平衡
# elasticsearch.yml cluster.routing.allocation.balance.shard: 0.3 # 分片均衡因子(默认0.45)
分片分布约束
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.awareness.attributes": "rack_id" } }
监控与诊断命令
查看分片分布:
GET _cat/allocation?v&s=node
定位大分片:
GET _cat/indices/*?v&h=index,pri,rep,shards,store.size&s=store.size:desc
分片移动记录:
GET _cat/recovery?active_only=true
常见问题解决方案
问题1:分片过大(>50GB)
👉 解决方案:
- 创建新索引时增加主分片数
- 使用Reindex API拆分数据
问题2:节点间分片不均衡
👉 解决方案:
PUT _cluster/settings { "transient": { "cluster.routing.rebalance.enable": "all" } }
问题3:副本同步延迟
👉 优化方案:
- 增加
index.translog.sync_interval
- 升级硬件(SSD提升IOPS)
分片容量计算器(示例)
预估数据量 | 数据增长率 | 节点数 | 推荐分片数 | 推荐副本数 |
---|---|---|---|---|
500GB | 低(5%/月) | 3 | 10-15 | 1-2 |
5TB | 中(10%/月) | 8 | 100-150 | 2-3 |
50TB | 高(20%/月) | 20+ | 500+ | 2-3 |