--- title: "分片分配启用配置" date: 2026-03-21 lastmod: 2026-03-21 description: "控制分片分配和重新分配行为的配置项说明" tags: ["分片管理", "集群配置", "负载均衡"] summary: "配置项作用 # cluster.routing.allocation.enable 配置项控制集群中分片(shard)的分配行为,包括新分片的分配和现有分片的重新分配。此配置用于控制分片在节点之间的移动和分配策略。 配置项类型 # 该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。 默认值 # all(允许所有分片分配) 是否必需 # 可选配置项 配置值说明 # 值 说明 all 允许所有分片分配(主分片和副本分片) primaries 只允许主分片分配 new_primaries 只允许新建索引的主分片分配 none 禁止所有分片分配 使用场景 # 1. 正常运行(默认) # cluster.routing.allocation.enable: all 所有分片可以正常分配和重新分配。 2. 节点下线维护 # # 禁止重新分配,准备节点维护 cluster.routing.allocation.enable: primaries 允许主分片分配(确保数据可用) 禁止副本分片重新分配(减少维护期间的负载) 3." --- ## 配置项作用 `cluster.routing.allocation.enable` 配置项控制集群中分片(shard)的分配行为,包括新分片的分配和现有分片的重新分配。此配置用于控制分片在节点之间的移动和分配策略。 ## 配置项类型 该配置项为**动态配置**,可以在运行时通过集群设置 API 进行修改。 ## 默认值 ``` all(允许所有分片分配) ``` ## 是否必需 **可选配置项** ## 配置值说明 | 值 | 说明 | |---|---| | `all` | 允许所有分片分配(主分片和副本分片) | | `primaries` | 只允许主分片分配 | | `new_primaries` | 只允许新建索引的主分片分配 | | `none` | 禁止所有分片分配 | ## 使用场景 ### 1. 正常运行(默认) ```yaml cluster.routing.allocation.enable: all ``` 所有分片可以正常分配和重新分配。 ### 2. 节点下线维护 ```yaml # 禁止重新分配,准备节点维护 cluster.routing.allocation.enable: primaries ``` - 允许主分片分配(确保数据可用) - 禁止副本分片重新分配(减少维护期间的负载) ### 3. 紧急情况 ```yaml # 完全禁止分配 cluster.routing.allocation.enable: none ``` - 禁止所有分片分配 - 用于紧急情况防止分片移动 ### 4. 恢复模式 ```yaml # 只允许新索引的主分片 cluster.routing.allocation.enable: new_primaries ``` - 用于集群恢复时只分配新索引 - 现有分片保持不动 ## 使用示例 **通过 API 动态修改:** ```bash # 禁止分片分配 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "none" } } # 恢复分片分配 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "all" } } ``` **持久化配置:** ```bash # 永久配置(需要谨慎) PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.enable": "primaries" } } ``` ## 节点维护流程 推荐的节点维护流程: ``` 1. 禁止分片分配 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "none" } } │ ▼ 2. 关闭节点 │ ▼ 3. 执行维护操作 │ ▼ 4. 启动节点 │ ▼ 5. 恢复分片分配 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "all" } } │ ▼ 6. 集群自动恢复平衡 ``` ## 配置值详解 ### all(全部允许) 允许所有类型的分片分配: - 新建索引的主分片分配 - 已有主分片的重新分配 - 副本分片的分配和重新分配 **适用场景**:正常运行状态 ### primaries(仅主分片) 只允许主分片相关操作: - 新建索引的主分片分配 ✅ - 已有主分片的重新分配 ✅ - 副本分片分配 ❌ - 副本分片重新分配 ❌ **适用场景**: - 节点维护期间减少负载 - 确保数据可用的同时控制副本重建 ### new_primaries(仅新主分片) 最严格的分配策略: - 新建索引的主分片分配 ✅ - 已有主分片重新分配 ❌ - 副本分片操作 ❌ **适用场景**: - 集群恢复阶段 - 紧急状态下的数据保护 ### none(全部禁止) 完全禁止分片分配: - 所有分片分配操作 ❌ **适用场景**: - 紧急故障处理 - 节点下线前的准备 ## 推荐设置建议 **生产环境**:使用默认值 `all` | 状态 | 推荐值 | 说明 | |-----|-------|------| | 正常运行 | `all` | 允许所有分片分配 | | 节点维护 | `primaries` | 减少维护期间的分配操作 | | 紧急情况 | `none` | 完全禁止分配 | | 集群恢复 | `new_primaries` | 只允许新索引 | ## 与相关配置的关系 | 配置项 | 作用域 | 默认值 | |-------|-------|-------| | `cluster.routing.allocation.enable` | 集群级别 | all | | `cluster.routing.rebalance.enable` | 集群级别的重新平衡 | all | | `index.routing.allocation.enable` | 索引级别 | all | 索引级别配置会覆盖集群级别配置: ```bash # 集群级别:禁止分配 PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.enable": "none" } } # 某个索引:允许分配 PUT /my-index/_settings { "index.routing.allocation.enable": "all" } ``` ## 监控分配状态 ```bash # 查看未分配的分片 GET /_cat/shards?v&h=index,shard,prirep,state,node # 查看集群健康状态 GET /_cluster/health # 查看分配解释 GET /_cluster/allocation/explain ``` ## 常见问题 **问题 1:分片未分配** 检查集群分配设置: ```bash GET /_cluster/settings?flat_settings=true ``` **问题 2:节点维护后副本未恢复** 确保分配已启用: ```bash PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "all" } } ``` **问题 3:新索引无法创建** 检查是否设置为 `none` 或 `new_primaries`。 ## 注意事项 1. **动态更新**:此配置为动态配置,可通过 API 修改 2. **优先级**:索引级别配置会覆盖集群级别配置 3. **手动分配**:使用 reroute API 时会忽略此限制 4. **恢复操作**:完成维护后务必恢复为 `all` 5. **数据可用性**:设置为 `none` 可能影响数据可用性