Elasticsearch 分片驱逐(Shard Exclusion)方式简析:`_name`、`_ip`、`_host`
在日常运维 Elasticsearch 集群过程中,常常需要将某个节点上的分片迁移出去,例如下线节点、腾出资源或进行维护操作。Elasticsearch 提供了简单直观的 shard exclusion 参数来实现这一目的,主要通过以下三个配置项:
cluster.routing.allocation.exclude._name
cluster.routing.allocation.exclude._ip
cluster.routing.allocation.exclude._host
本文将简要说明这三种方式的用途与使用方法。
一、基础原理
Elasticsearch 支持通过集群设置控制 路由分配行为(routing allocation),其中 exclude
参数可以指定不允许分片分配到的节点。设置这些参数后,Elasticsearch 会主动将目标节点上的分片迁移至其他节点(前提是集群健康允许这么做)。
二、使用方式详解
1. cluster.routing.allocation.exclude._name
通过节点名称进行驱逐,适用于你明确知道节点名称的情况。
PUT _cluster/settings
{"transient": {"cluster.routing.allocation.exclude._name": "es-node-1"}
}
说明:
- 节点名称通常为
node.name
,可通过_cat/nodes
查看。 - 所有分片将从
es-node-1
迁出,新的分片将不会再分配至该节点。
2. cluster.routing.allocation.exclude._ip
通过 IP 地址驱逐目标节点的分片,适用于跨机房、跨网段部署场景。
PUT _cluster/settings
{"transient": {"cluster.routing.allocation.exclude._ip": "192.168.1.10"}
}
说明:
-
可支持多个 IP(用逗号分隔):
"cluster.routing.allocation.exclude._ip": "192.168.1.10,192.168.1.11"
-
需要确保 IP 与节点的绑定一致性。
3. cluster.routing.allocation.exclude._host
通过主机名进行驱逐,适合在主机名规范统一、变化不大的情况下使用。
PUT _cluster/settings
{"transient": {"cluster.routing.allocation.exclude._host": "host-01"}
}
说明:
- 主机名可以在
_cat/nodes?h=host
中查看。 - 同样支持多个主机名的逗号拼接。
三、清除驱逐设置
如果驱逐操作已经完成并需要恢复节点分配,可通过清空设置来取消限制:
PUT _cluster/settings
{"transient": {"cluster.routing.allocation.exclude._name": ""}
}
驱逐完成的验证方式:
curl -k -X GET \-H 'content-Type:application/json' \-u "admin:$ES_SEC" \https://$ES_IP:9200/_cat/allocation?vshards disk.indices disk.used disk.avail disk.total disk.percent node40 98.2mb 4.5gb 103.4gb 107.9gb 4 es-340 97.2mb 8.6gb 99.3gb 107.9gb 7 es-01 31.8kb 4.6gb 103.3gb 107.9gb 4 es-2 41 99.3mb 5.4gb 102.5gb 107.9gb 5 es-1---## 五、总结| 参数项 | 说明 | 推荐场景 |
| ------- | ---------- | ------------- |
| `_name` | 通过节点名称驱逐 | 节点命名规范良好、便于识别 |
| `_ip` | 通过 IP 地址驱逐 | 跨网络规划,节点名称不统一 |
| `_host` | 通过主机名驱逐 | 主机名固定、命名清晰 |这三种方式均适用于集群维护、节点下线等操作,是 Elasticsearch 运维工作中的常用工具。合理使用它们可以大幅提升操作效率和集群稳定性。