背景
Elasticsearch 版本 7.4.0
1. 禁用自动分配分片
PUT _cluster/settings
{
"persistent": {
"cluster": {
"routing": {
"allocation.enable": "none"
}
}
}
}
cluster.routing.allocation.enable
的默认值为all
;
persistent
表示当前修改的配置永久生效;
先禁用 ES 的自动分片调整功能, 防止在手动调整分片的时候, 又触发自动调整机制, 导致分片分配混乱;
2. 手动移动分片
2.0. 移动单个分片
POST _cluster/reroute
{
"commands": [
{
"move": {
"index": "<my-index>",
"shard": <shard-number>,
"from_node": "node_01",
"to_node": "node_02"
}
}
]
}
注意:
index
不可以用索引的别名alias
, 必须用实际索引名称
将分片<shard-number>
从节点node_01
移动到node_02
, 会触发cluster.routing.allocation.enable
自动将node_02
的其他一个分片移动到node_01
; 所以手动移动分片时, 需要先禁用自动分配分片;
2.1. 根据 IP 禁用分片
PUT _cluster/settings
{
"persistent": {
"cluster": {
"routing": {
"allocation.exclude": {
"_ip": "<ip1>,<ip2>"
}
}
}
}
}
如果原来这些 ip 机器上已经有分片数据了, 执行该命令后, 这些分片数据会自动移动到其他机器上;
_ip
可配置多个 IP 地址, 以逗号分隔; 支持*
匹配符;
2.2. 根据 IP 分配分片
PUT _cluster/settings
{
"persistent": {
"cluster": {
"routing": {
"allocation.include": {
"_ip": "<ip1>,<ip2>"
}
}
}
}
}
与 2.1 相反,
include._ip
要求索引分配的节点必须满足其中一个条件(逗号分隔);