📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

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

故障排查 #

问题:分片无法分配

可能原因:

  1. 启用强制感知,但某个属性值的节点数量不足
  2. 副本数与属性值数量不匹配

解决方案:

# 查看分配失败原因
GET /_cluster/allocation/explain

# 临时禁用强制感知
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.awareness.force.zone.values": null
  }
}

问题:分片分布不均匀

可能原因:

  1. 某些属性值的节点资源不足
  2. 分片正在迁移中

解决方案:

# 检查各属性值的节点资源
GET /_cat/allocation?v

# 手动重新平衡分片
POST /_cluster/reroute?retry_failed=true

注意事项 #

  1. 动态配置:此配置为动态配置,可在线修改
  2. 节点属性一致性:确保所有节点都配置了感知属性
  3. 副本数与区域数匹配:使用强制感知时,副本数应小于或等于属性值数量
  4. 资源平衡:确保每个属性值的节点有足够的存储和计算资源
  5. 渐进式启用:建议先启用基础感知,确认正常后再考虑强制感知
  6. 网络延迟:跨区域部署时需考虑网络延迟对性能的影响