ES-模型-分片与副本设计
定位:系统搞懂 Primary/Replica、分片数量如何规划、以及这些决策对性能与稳定性的长期影响。本页是索引与集群设计的基础必修课。
大纲
- Shard 基本概念:Primary / Replica
- 分片在读写流程中的作用
- 分片数量如何规划(经验法则与反例)
- 副本数量如何设置与常见策略
- 小分片过多 / 大分片过肥 的典型问题
- 与索引生命周期、时间分区的关系
- 与后续「集群架构」「性能优化」章节的关联
Todo 要点(查漏补缺清单)
1. Shard 基本概念
- 定义:
- Primary Shard:索引数据的主分片,负责写入。
- Replica Shard:主分片的副本,提供冗余和读扩展。
- 说明:
- 一个索引由 N 个 primary shard + R 个 replica 组成。
- 分片是 ES 水平扩展的最小单元。
2. 读写流程中的作用
- 写入流程:
- 写操作先到 Primary,再同步到 Replica。
- 与 refresh/flush/acknowledged 设置的关系。
- 查询流程:
- 读请求可以在 Primary 和 Replica 上分摊。
- 通过副本增加读吞吐、提高可用性。
- Todo:
- 用简单图或伪代码描述「client → coord node → shard → merge」流程。
3. 分片数量规划
- 原则:在创建索引时就要慎重,后期调整成本高(需要 reindex)。
- 影响因素:
- 预计总数据量(TB / 年)。
- 单个分片推荐大小(如 10~50GB 作为经验区间,根据版本和硬件微调)。
- 集群节点数量与扩容计划。
- 常见经验:
- 不要为小数据量索引设置太多分片(如几 GB 数据却 10+ 分片)。
- 对于时间分区索引,按天/周/月权衡分片大小。
- Todo:
- 写出「以 1TB 日志为例」的分片数量规划演算过程。
4. 副本数量策略
- 说明:
- 副本数至少为 1 可防单点,生产集群推荐。
- 增加副本数可以提高读取能力,但会增加存储与写入成本。
- 场景:
- 开发/测试环境可设为 0 副本以节省资源(仅限非关键场景)。
- 生产环境根据节点数和可用区部署,一般配置 1-2 副本。
- Todo:
- 给出「3 节点集群,1 副本」和「多 AZ 部署」的示意与原因说明。
5. 小分片过多 / 大分片过肥 问题
- 小分片过多:
- 每个分片都有内存和文件句柄开销。
- 集群状态变大,协调成本上升。
- 查询需要 fan-out 到大量分片,延迟飙升。
- 分片过大:
- Recovery 和 Rebalance 成本高。
- 单分片热度过高,负载不均。
- Todo:
- 总结几条「反模式警告」作为 checklist,写在页尾以便上线前自查。
6. 与索引生命周期和时间分区的关系
- 说明:
- 对于日志/时序数据,常用「按时间分索引」+ ILM 策略。
- 分片数量要结合索引生命周期(active → warm → cold → delete)设计。
- Todo:
- 在后续 ES-性能-索引与时间分区设计 中引用本页,形成闭环。
- 给出「日活写入量变化后如何调整新索引分片配置」的建议。
7. 与后续章节的关联
- 标注关联:
- 与 ES-集群-节点角色与拓扑设计:分片如何分布到不同角色节点。
- 与 ES-性能-资源规划与Segment管理:分片大小影响 segment 行为。
- 与 ES-稳定性-常见故障与排查思路:unassigned shards 等问题往往源于不当分片策略。
- Todo:
- 后续在这些章节中回链本页,确保「分片策略」贯穿整体设计决策。