配置项作用 #
cluster.routing.allocation.awareness.attributes 配置项用于启用分片分配感知(Allocation Awareness)功能。通过感知节点的物理或逻辑属性(如机架、可用区、数据中心等),确保分片尽可能均匀地分布到不同的故障域,提高集群的容错能力。
配置项类型 #
该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。
默认值 #
[](空数组,不启用感知功能)
是否必需 #
可选配置项(有默认值)
取值范围 #
字符串或字符串数组,表示节点属性名称
配置格式 #
# easysearch.yml(静态配置)
cluster.routing.allocation.awareness.attributes: rack_id
# 或通过 API(动态配置)
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.awareness.attributes": "rack_id"
}
}
# 多属性感知
cluster.routing.allocation.awareness.attributes: ["zone", "rack_id"]
工作原理 #
┌─────────────────────────────────────────────────────────────────┐
│ 分片分配感知机制 │
└─────────────────────────────────────────────────────────────────┘
无感知配置:
索引: 3 个主分片,1 个副本
节点 A (rack1): [主0, 副1, 副2]
节点 B (rack1): [主1, 副0, 副2]
节点 C (rack2): [主2, 副0, 副1]
问题: rack1 故障时,可能丢失数据
启用 rack_id 感知:
索引: 3 个主分片,1 个副本
节点 A (rack1): [主0, 副1, 副2]
节点 B (rack1): [主1, 副0, 副2]
节点 C (rack2): [主2, 副0, 副1]
优化后:
节点 A (rack1): [主0, 主1, 副2]
节点 B (rack1): [副0, 副1, 主2]
节点 C (rack2): [主2, 副0, 副1]
好处: rack1 故障时,rack2 仍持有所有数据副本
感知类型 #
1. 基础感知(Awareness) #
确保分片尽可能均匀分布到不同的属性值上。
# 节点配置
# 节点 1, 2: node.attr.zone: zone-a
# 节点 3, 4: node.attr.zone: zone-b
# 集群配置
cluster.routing.allocation.awareness.attributes: zone
分配结果:
- 主分片均匀分布在 zone-a 和 zone-b
- 副本分片分配到与主分片不同的 zone
2. 强制感知(Forced Awareness) #
要求每个属性值都有足够节点才能分配分片。
cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: ["zone-a", "zone-b"]
特点:
- 确保每个 zone 都有完整的数据副本
- 当某个 zone 的节点全部故障时,该 zone 的分片会变成未分配状态
- 提供更强的数据安全保障
使用场景 #
1. 多可用区部署 #
# 节点配置
# AWS 节点: node.attr.availability_zone: us-east-1a
# AWS 节点: node.attr.availability_zone: us-east-1b
# AWS 节点: node.attr.availability_zone: us-east-1c
# 集群配置
cluster.routing.allocation.awareness.attributes: availability_zone
cluster.routing.allocation.awareness.force.availability_zone.values: ["us-east-1a", "us-east-1b", "us-east-1c"]
2. 多机架部署 #
# 节点配置
# 节点 1-2: node.attr.rack_id: rack1
# 节点 3-4: node.attr.rack_id: rack2
# 节点 5-6: node.attr.rack_id: rack3
# 集群配置
cluster.routing.allocation.awareness.attributes: rack_id
cluster.routing.allocation.awareness.force.rack_id.values: ["rack1", "rack2", "rack3"]
3. 多数据中心部署 #
# 节点配置
# 北京节点: node.attr.data_center: beijing
# 上海节点: node.attr.data_center: shanghai
# 广州节点: node.attr.data_center: guangzhou
# 集群配置
cluster.routing.allocation.awareness.attributes: data_center
4. 多级感知 #
# 同时感知区域和机架
cluster.routing.allocation.awareness.attributes: ["zone", "rack_id"]
# 节点配置示例
# node.attr.zone: east
# node.attr.rack_id: rack1
节点属性配置示例 #
# 方式 1: 在 easysearch.yml 中配置
node.attr.zone: zone-a
node.attr.rack_id: rack1
node.attr.data_center: beijing
# 方式 2: 通过命令行启动
./bin/easysearch -Enode.attr.zone=zone-a -Enode.attr.rack_id=rack1
# 方式 3: 通过环境变量
export ES_NODE_ATTR_ZONE=zone-a
export ES_NODE_ATTR_RACK_ID=rack1
分配决策逻辑 #
┌─────────────────────────────────────────────────────────────────┐
│ 感知分配决策流程 │
└─────────────────────────────────────────────────────────────────┘
1. 收集节点属性
└── 获取所有节点的感知属性值
2. 统计分片分布
├── 计算每个属性值的节点数量
└── 计算每个属性值的分片数量
3. 分配决策
├── maximumNodeCount = ceil(shardCount / numberOfAttributes)
└── 确保每个属性值的分片数 ≤ maximumNodeCount
4. 副本分配
└── 优先分配到与主分片不同属性值的节点
推荐设置指南 #
| 部署场景 | 推荐配置 | 说明 |
|---|---|---|
| 单机架 | 不启用 | 无需感知 |
| 多机架 | rack_id | 基础感知 |
| 多可用区 | zone | 强制感知 |
| 多数据中心 | data_center | 强制感知 |
| 云环境 | availability_zone | 强制感知 |
完整配置示例 #
示例 1:双机房部署 #
# easysearch.yml
# 机房 A 节点配置
node.attr.zone: zone-a
# 集群配置
cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: ["zone-a", "zone-b"]
# 分配策略:
# - 每个分片在 zone-a 和 zone-b 各有一个副本
# - 任一机房故障,另一机房仍持有完整数据
示例 2:三可用区云部署 #
# 节点配置(通过标签或元数据获取)
node.attr.az: us-east-1a
# 或 us-east-1b, us-east-1c
# 集群配置
cluster.routing.allocation.awareness.attributes: az
cluster.routing.allocation.awareness.force.az.values: ["us-east-1a", "us-east-1b", "us-east-1c"]
监控与验证 #
# 查看当前感知配置
GET /_cluster/settings?filter_path=*.cluster.routing.allocation.awareness.*
# 查看节点属性
GET /_cat/nodeattrs?v
# 查看分片分配情况
GET /_cat/shards?v&h=index,shard,prirep,state,node
# 查看分片在各属性的分布
GET /_cat/allocation?v
# 解释分片分配决策
GET /_cluster/allocation/explain
故障排查 #
问题:分片无法分配
可能原因:
- 启用强制感知,但某个属性值的节点数量不足
- 副本数与属性值数量不匹配
解决方案:
# 查看分配失败原因
GET /_cluster/allocation/explain
# 临时禁用强制感知
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.awareness.force.zone.values": null
}
}
问题:分片分布不均匀
可能原因:
- 某些属性值的节点资源不足
- 分片正在迁移中
解决方案:
# 检查各属性值的节点资源
GET /_cat/allocation?v
# 手动重新平衡分片
POST /_cluster/reroute?retry_failed=true
注意事项 #
- 动态配置:此配置为动态配置,可在线修改
- 节点属性一致性:确保所有节点都配置了感知属性
- 副本数与区域数匹配:使用强制感知时,副本数应小于或等于属性值数量
- 资源平衡:确保每个属性值的节点有足够的存储和计算资源
- 渐进式启用:建议先启用基础感知,确认正常后再考虑强制感知
- 网络延迟:跨区域部署时需考虑网络延迟对性能的影响





