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

配置项作用 #

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:新索引无法创建

检查是否设置为 nonenew_primaries

注意事项 #

  1. 动态更新:此配置为动态配置,可通过 API 修改
  2. 优先级:索引级别配置会覆盖集群级别配置
  3. 手动分配:使用 reroute API 时会忽略此限制
  4. 恢复操作:完成维护后务必恢复为 all
  5. 数据可用性:设置为 none 可能影响数据可用性