Elasticsearch 生产级核心原理:Shard Allocation Awareness 工作机制与实战配置详解
-
- 前言
- [一、什么是 Shard Allocation Awareness?](#一、什么是 Shard Allocation Awareness?)
-
- [1.1 官方定义](#1.1 官方定义)
- [1.2 解决的核心问题](#1.2 解决的核心问题)
- [1.3 核心作用](#1.3 核心作用)
- [二、Shard Allocation Awareness 核心工作原理](#二、Shard Allocation Awareness 核心工作原理)
-
- [2.1 工作流程(极简理解)](#2.1 工作流程(极简理解))
- [2.2 核心分配规则(最重要)](#2.2 核心分配规则(最重要))
- [三、Shard Allocation Awareness 工作流程图](#三、Shard Allocation Awareness 工作流程图)
- [四、生产环境实战配置(机架感知 + 可用区感知)](#四、生产环境实战配置(机架感知 + 可用区感知))
-
- [4.1 集群拓扑示例](#4.1 集群拓扑示例)
- [4.2 修改每个节点的 `elasticsearch.yml`](#4.2 修改每个节点的
elasticsearch.yml) -
- [节点组 1(rack1)](#节点组 1(rack1))
- [节点组 2(rack2)](#节点组 2(rack2))
- [4.3 重启所有节点](#4.3 重启所有节点)
- 五、分配效果(直观展示)
- 六、云环境(AWS/阿里云/腾讯云)可用区感知配置
- [七、强制感知:Forced Awareness(高级生产配置)](#七、强制感知:Forced Awareness(高级生产配置))
-
- [7.1 作用](#7.1 作用)
- 配置
- [八、Shard Allocation Awareness 重要规则(生产避坑)](#八、Shard Allocation Awareness 重要规则(生产避坑))
-
- [8.1 副本数不能超过感知分组数](#8.1 副本数不能超过感知分组数)
- [8.2 支持多个感知属性(rack + zone)](#8.2 支持多个感知属性(rack + zone))
- [8.3 主节点必须能感知所有节点属性](#8.3 主节点必须能感知所有节点属性)
- [8.4 不影响写入性能,只影响分片分配](#8.4 不影响写入性能,只影响分片分配)
- 九、常见问题与解决方案
-
- [9.1 集群变黄,副本无法分配](#9.1 集群变黄,副本无法分配)
- [9.2 主副分片仍在同一机架](#9.2 主副分片仍在同一机架)
- [9.3 新增节点,分片不迁移](#9.3 新增节点,分片不迁移)
- 十、总结
- 十一、最终结论
|-----------------------------|
| 🌺The Begin🌺点点关注,收藏不迷路🌺 |
前言
在生产环境部署 Elasticsearch 集群时,我们通常会将节点部署在不同机架、不同可用区(AZ)、不同物理机 上。如果没有合理的分片分配策略,ES 可能会把主分片和副本分片分配到同一机架、同一交换机下,一旦发生机架掉电、网络分区,就会导致数据丢失、集群变红,服务不可用。
为了解决这个问题,ES 提供了 Shard Allocation Awareness(分片分配感知) 功能,它可以让 ES 感知节点的物理位置信息 (机架、可用区、机房),从而将主副分片强制分散在不同位置,最大限度保证集群高可用。
本文将从 原理、工作流程、配置方式、生产场景、容错机制 全方位讲解,帮助你彻底理解并落地 Shard Allocation Awareness,让你的 ES 集群具备机架感知、可用区感知、物理机感知能力。
一、什么是 Shard Allocation Awareness?
1.1 官方定义
Shard Allocation Awareness(分片分配感知) 是 Elasticsearch 的一种集群感知能力 ,允许你为节点配置自定义属性(如 rack、az、zone),让 ES 主节点在分配分片时,根据这些属性将分片均匀、隔离地分布在不同物理位置,避免单点故障。
1.2 解决的核心问题
- ❌ 未开启:主分片 + 副本分片可能在同一机架,机架故障 → 数据丢失
- ✅ 开启:主分片与副本分片强制跨机架/跨AZ分配,单机架故障不影响数据可用性
1.3 核心作用
- 提高集群可用性:避免单点故障影响数据
- 负载均衡:分片均匀分布在不同机架
- 提升读写性能:就近访问副本
- 符合生产高可用规范:云服务器多 AZ 部署必备
二、Shard Allocation Awareness 核心工作原理
2.1 工作流程(极简理解)
- 给每个节点打上标签(rack=rack1、az=az1 等)
- 主节点感知所有节点的标签
- 创建索引、分配分片时,优先将主副分片分配到不同标签的节点上
- 保证:同一个分片的主、副本绝不放在同一属性的节点中
2.2 核心分配规则(最重要)
- ES 会尽量将同一个分片的主、副本分配到不同的 awareness 属性组中
- awareness 属性可以是:机架、可用区、机房、物理机
- 副本数不能超过 awareness 分组数(否则副本无法分配,集群变黄)
三、Shard Allocation Awareness 工作流程图
给节点配置感知属性 rack/az
节点启动上报属性给主节点
主节点维护节点拓扑地图
创建索引/分片重分配
主节点按感知属性分配分片
主分片 → rack1
副本分片 → rack2
主副分片强制跨机架
集群高可用、无单点故障
四、生产环境实战配置(机架感知 + 可用区感知)
下面以最常用的机架感知(rack awareness) 为例,一步步配置。
4.1 集群拓扑示例
假设我们有 6 个节点,分布在 2 个机架:
- rack1:node-1、node-2、node-3
- rack2:node-4、node-5、node-6
4.2 修改每个节点的 elasticsearch.yml
节点组 1(rack1)
yaml
node.attr.rack: rack1
cluster.routing.allocation.awareness.attributes: rack
节点组 2(rack2)
yaml
node.attr.rack: rack2
cluster.routing.allocation.awareness.attributes: rack
关键配置解释:
node.attr.rack: rack1:给当前节点打上 rack 标签cluster.routing.allocation.awareness.attributes: rack:开启 rack 感知
4.3 重启所有节点
配置生效后,主节点就会按照 rack 分配分片。
五、分配效果(直观展示)
创建一个索引:
- 主分片:3
- 副本:1
分配结果(完美高可用)
- rack1:主1、主2、副本3
- rack2:主3、副本1、副本2
任何一个机架宕机,另一个机架仍有完整数据!
六、云环境(AWS/阿里云/腾讯云)可用区感知配置
云上 ES 集群必须开启 AZ 感知,保证跨可用区高可用。
配置示例
yaml
node.attr.az: az1
cluster.routing.allocation.awareness.attributes: az
az1、az2、az3 为云服务器可用区。
七、强制感知:Forced Awareness(高级生产配置)
7.1 作用
如果某个机架/可用区全部宕机 ,不允许 ES 将分片分配到其他机架,防止数据集中。
配置
yaml
cluster.routing.allocation.awareness.attributes: rack
cluster.routing.allocation.awareness.force.rack.values: rack1,rack2
效果:
- rack1 挂了 → 副本不会分配到 rack2
- 避免 rack2 压力过大、数据集中
八、Shard Allocation Awareness 重要规则(生产避坑)
8.1 副本数不能超过感知分组数
例如:只有 2 个机架 → 副本数最多设置为 1
如果副本数=2 → 第二个副本无法分配 → 集群变黄
8.2 支持多个感知属性(rack + zone)
yaml
cluster.routing.allocation.awareness.attributes: rack,zone
8.3 主节点必须能感知所有节点属性
主节点负责分配,所以所有节点都必须配置属性。
8.4 不影响写入性能,只影响分片分配
感知功能无性能损耗。
九、常见问题与解决方案
9.1 集群变黄,副本无法分配
原因:副本数 > 感知分组数
解决:减少副本数,或增加机架/AZ节点
9.2 主副分片仍在同一机架
原因:配置未生效、节点未重启、标签写错
解决:检查 node.attr 配置
9.3 新增节点,分片不迁移
解决:手动触发分片均衡
json
POST /_cluster/reroute?pretty
十、总结
Shard Allocation Awareness 一句话总结
分片分配感知让 ES 能够识别节点的物理位置,将主副分片强制分散在不同机架、不同可用区,实现机架级、AZ级高可用,是生产环境必须开启的核心功能。
核心价值
✅ 彻底避免机架/可用区故障导致的数据丢失
✅ 分片均匀分布,负载均衡
✅ 云上部署必备(多 AZ 高可用)
✅ 配置简单、零成本、零性能损耗
生产环境建议
- 所有集群必须开启机架感知 / AZ 感知
- 副本数 ≤ 感知分组数
- 配合 forced awareness 防止数据集中
- 机架/AZ 数量 ≥ 2
十一、最终结论
Shard Allocation Awareness 不是可选功能,而是 ES 生产级高可用的基石!
只要你的集群跑在生产环境,就必须配置。

|---------------------------|
| 🌺The End🌺点点关注,收藏不迷路🌺 |