--- title: "分片分配感知属性配置" date: 2026-02-17 lastmod: 2026-02-17 description: "控制基于节点属性的分片分配感知功能配置说明" tags: ["集群配置", "分片分配", "高可用", "容灾"] summary: "配置项作用 # 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." --- ## 配置项作用 `cluster.routing.allocation.awareness.attributes` 配置项用于启用分片分配感知(Allocation Awareness)功能。通过感知节点的物理或逻辑属性(如机架、可用区、数据中心等),确保分片尽可能均匀地分布到不同的故障域,提高集群的容错能力。 ## 配置项类型 该配置项为**动态配置**,可以在运行时通过集群设置 API 进行修改。 ## 默认值 ``` [](空数组,不启用感知功能) ``` ## 是否必需 **可选配置项**(有默认值) ## 取值范围 ``` 字符串或字符串数组,表示节点属性名称 ``` ## 配置格式 ```yaml # 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) 确保分片尽可能均匀分布到不同的属性值上。 ```yaml # 节点配置 # 节点 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) 要求每个属性值都有足够节点才能分配分片。 ```yaml cluster.routing.allocation.awareness.attributes: zone cluster.routing.allocation.awareness.force.zone.values: ["zone-a", "zone-b"] ``` **特点:** - 确保每个 zone 都有完整的数据副本 - 当某个 zone 的节点全部故障时,该 zone 的分片会变成未分配状态 - 提供更强的数据安全保障 ## 使用场景 ### 1. 多可用区部署 ```yaml # 节点配置 # 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. 多机架部署 ```yaml # 节点配置 # 节点 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. 多数据中心部署 ```yaml # 节点配置 # 北京节点: node.attr.data_center: beijing # 上海节点: node.attr.data_center: shanghai # 广州节点: node.attr.data_center: guangzhou # 集群配置 cluster.routing.allocation.awareness.attributes: data_center ``` ### 4. 多级感知 ```yaml # 同时感知区域和机架 cluster.routing.allocation.awareness.attributes: ["zone", "rack_id"] # 节点配置示例 # node.attr.zone: east # node.attr.rack_id: rack1 ``` ## 节点属性配置示例 ```yaml # 方式 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:双机房部署 ```yaml # 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:三可用区云部署 ```yaml # 节点配置(通过标签或元数据获取) 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"] ``` ## 监控与验证 ```bash # 查看当前感知配置 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. 副本数与属性值数量不匹配 **解决方案:** ```bash # 查看分配失败原因 GET /_cluster/allocation/explain # 临时禁用强制感知 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.awareness.force.zone.values": null } } ``` **问题:分片分布不均匀** **可能原因:** 1. 某些属性值的节点资源不足 2. 分片正在迁移中 **解决方案:** ```bash # 检查各属性值的节点资源 GET /_cat/allocation?v # 手动重新平衡分片 POST /_cluster/reroute?retry_failed=true ``` ## 注意事项 1. **动态配置**:此配置为动态配置,可在线修改 2. **节点属性一致性**:确保所有节点都配置了感知属性 3. **副本数与区域数匹配**:使用强制感知时,副本数应小于或等于属性值数量 4. **资源平衡**:确保每个属性值的节点有足够的存储和计算资源 5. **渐进式启用**:建议先启用基础感知,确认正常后再考虑强制感知 6. **网络延迟**:跨区域部署时需考虑网络延迟对性能的影响