8.2 分片路由、副本与再平衡 本节摘要:分片分配器决定每个分片住在哪个节点:新索引建分片、节点增减触发再平衡、磁盘水位划出居住红线。本节讲分配决策的四个因素、再平衡的触发时机、搬迁的代价模型,以及"控制搬家"的三个参数(分片总数、过滤规则、平衡因子)。第 1 章那张静态分片地图,这一节让它动起来。 分片的搬家日志 分配器想什么 一个分片该住哪个节点,分配器(allocator)按加权评分做决定,核心考虑四件事:磁盘水位(低水位八十五、高水位九成、洪水位九十五,百分比可调)——超低水位的节点不再接收新分片,超高水位的节点开始往外搬;分片数均衡——各节点的分片数(按磁盘容量加权)尽量拉平;副本隔离——副本不能与自己的主分片同节点;
本节摘要:分片分配器决定每个分片住在哪个节点:新索引建分片、节点增减触发再平衡、磁盘水位划出居住红线。本节讲分配决策的四个因素、再平衡的触发时机、搬迁的代价模型,以及"控制搬家"的三个参数(分片总数、过滤规则、平衡因子)。第 1 章那张静态分片地图,这一节让它动起来。
一个分片该住哪个节点,分配器(allocator)按加权评分做决定,核心考虑四件事:磁盘水位(低水位八十五、高水位九成、洪水位九十五,百分比可调)——超低水位的节点不再接收新分片,超高水位的节点开始往外搬;分片数均衡——各节点的分片数(按磁盘容量加权)尽量拉平;副本隔离——副本不能与自己的主分片同节点;过滤规则——冷热分层、专用节点上的属性匹配(比如 SSD 节点只放热索引)。
GET _cat/allocation?v # 节点维度的分片数 磁盘用量 水位一目了然 GET _cluster/settings?include_defaults=true # allocation 相关的现行参数 全在这里
三种事件惊动分配器:新索引创建(一批主副本要安家)、节点增减(节点掉线副本要补、新节点加入要匀)、手动干预(手动移动分片、改设置)。再平衡的目标是均衡,但均衡不是免费的——搬迁要走网络复制整个分片,顺带吃掉两端节点的 IO。所以有专门的"意识"参数让搬迁克制:集群层面的分片总数上限、单节点同索引分片数上限,都在防"为了均衡而均衡"。

限速与并发是高峰期的护栏:
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.cluster_concurrent_rebalance": 2, "cluster.routing.allocation.node_initial_primaries_recoveries": 4, "indices.recovery.max_bytes_per_sec": "40mb" } }
三条参数分别管:同时再平衡的分片数、节点初始主分片恢复数、恢复带宽上限。搬迁期间业务照常读写(目标分片建好后原子切换归属),但 IO 竞争是实打实的——大搬迁放在低峰,是运维常识不是教条。
节点下线前还有个体面动作:先把该节点的分片匀走再停机(分配过滤把该节点排除),避免停机瞬间集群抖动与副本补齐风暴。
PUT _cluster/settings { "transient": { "cluster.routing.allocation.exclude._name": "node-3" } }
背景:日志集群三节点,磁盘用到七成八,写入高峰查询延迟抬升三成,决定扩一个节点。操作:新节点上线(同版本、同配置,加入集群名);分配器自动把六个分片匀过去,期间把恢复带宽限到四十兆每秒,避免挤压晚高峰查询;搬迁两小时完成。结果:四节点各六块分片,磁盘水位回落到六成,查询延迟回到基线。解读:扩容的本质是把分片摊薄到更多磁盘与核上——前提是分片数足够摊(第 1 章的分片规划在此兑现);若当初只建一个主分片,加节点帮不上忙。变式:临时救急不扩容时,把冷索引副本降零、或把冷索引进生命周期管理搬到低配存储,同样能腾水位。
⚠️ 常见坑:分片规划过大过碎——一万个小分片让主节点的元数据管理与分配决策变慢,集群状态同步开销剧增。单分片十几到几十 GB、总分数百以内,是多数场景的舒适区;小索引用少分片,别一律默认三。
💡 关键直觉:分片数是"并行的门票":节点数多于主分片数时,多出来的节点只能陪跑副本。规划分片时先想清楚最多会扩到几个节点。
| 考核点 | 达标标准 |
|---|---|
| 分配四因素 | 说出磁盘水位、均衡、副本隔离、过滤规则的含义 |
| 水位三线 | 背出八十五、九十、九十五三档水位线的触发行为 |
| 再平衡三触发 | 建索引、节点增减、手动干预各自引起什么搬迁 |
| 搬迁代价 | 说出源读、网络传、目标建的三段成本模型 |
| 护栏参数 | 写出并发与带宽限制的设置请求并说明生效时机 |
| 下线流程 | 说明先匀盘再停机的顺序与理由 |
双节点集群里再起第三个节点,反复执行分片目录观察搬迁全程:
GET _cat/shards?v&s=index,shard # 每两秒执行一次 观察分片从 INITIALIZING 走到绿 # 新节点的分片行从无到有 老节点行数逐步减少
状态列的变化序列就是再平衡的可视化:某分片显示搬迁中时,新旧两处并存,目标端建好并校验完才切换归属、拆掉旧摊位——"业务无感"四个字从此有机理层面的注脚。看懂这一轮,第 1 章那张静态地图就动起来了。
分片的"住址"讲完了,下一节钻进时间维度:refresh、translog 与段合并的幕后动画。