配置项作用 #
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: none
- 禁止所有分片分配
- 用于紧急情况防止分片移动
4. 恢复模式 #
# 只允许新索引的主分片
cluster.routing.allocation.enable: new_primaries
- 用于集群恢复时只分配新索引
- 现有分片保持不动
使用示例 #
通过 API 动态修改:
# 禁止分片分配
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}
# 恢复分片分配
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}
持久化配置:
# 永久配置(需要谨慎)
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 |
索引级别配置会覆盖集群级别配置:
# 集群级别:禁止分配
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
# 某个索引:允许分配
PUT /my-index/_settings
{
"index.routing.allocation.enable": "all"
}
监控分配状态 #
# 查看未分配的分片
GET /_cat/shards?v&h=index,shard,prirep,state,node
# 查看集群健康状态
GET /_cluster/health
# 查看分配解释
GET /_cluster/allocation/explain
常见问题 #
问题 1:分片未分配
检查集群分配设置:
GET /_cluster/settings?flat_settings=true
问题 2:节点维护后副本未恢复
确保分配已启用:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}
问题 3:新索引无法创建
检查是否设置为 none 或 new_primaries。
注意事项 #
- 动态更新:此配置为动态配置,可通过 API 修改
- 优先级:索引级别配置会覆盖集群级别配置
- 手动分配:使用 reroute API 时会忽略此限制
- 恢复操作:完成维护后务必恢复为
all - 数据可用性:设置为
none可能影响数据可用性





