一.数据安全迁移
在 Elasticsearch 中设置某个节点临时不可用(例如进行维护或升级),可以通过以下步骤安全地操作,避免数据丢失或集群状态异常
-
1: 排除节点分片分配,触发分片迁移到其他节点
PUT /_cluster/settings { "transient": { #"cluster.routing.allocation.exclude._ip": "目标节点的IP", # 或使用节点名称 "cluster.routing.allocation.exclude._name": "节点名称" # 或使用节点ID # "cluster.routing.allocation.exclude._id": "节点ID" } }
执行后,Elasticsearch 会开始将此节点上的分片迁移到其他节点。
使用 GET /_cluster/settings 检查设置是否生效。
-
2: 等待分片迁移完成
检查分片分配状态,直到目标节点的分片数为 0:
GET /_cat/shards?h=index,shard,prirep,state,node&format=json
-
3.停止节点服务
#切换到es用户,查询elasticsearch进程 ps aux|grep elasticsearch #停止es kill -9 pid
-
4.修改配置文件
修改安装目录/config/elasticsearch.yml文件
path.data: /es/data
-
5.维护完成后恢复节点
启动节点服务,进入安装目录,执行命令:bin/elasticsearch -d
移除分片分配排除规则:
PUT /_cluster/settings { "transient": { "cluster.routing.allocation.exclude._name": null } }
-
注意事项
-
主节点(Master Node):如果目标节点是主节点,确保集群中还有其他可用主节点。
-
强制停机风险:直接关闭节点而不迁移分片可能导致集群变黄/红(部分数据不可用)。
-
大集群耗时:分片迁移可能较慢,取决于数据量和网络。
二. 数据不安全方式迁移
2.1 设置集群不自动恢复分片
-
查询集群设置:
GET _cluster/settings
-
设置集群不自动恢复分片:
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "none" } }
说明:禁用分片自动分配,避免节点下线时触发数据迁移。
2.2. 停止当前节点服务
#切换到es用户,查询elasticsearch进程
ps aux|grep elasticsearch
#停止es
kill -9 pid
2.3 复制数据并修改配置
复制数据:
sudo cp -rp /原数据目录/* /新数据目录/
确保 Elasticsearch 配置中 path.data 已指向新目录,否则需修改 elasticsearch.yml:
path.data: /es/data
2.4 维护完成后恢复节点:
启动节点服务,进入安装目录,执行命令:
bin/elasticsearch -d
设置集群自动恢复分片:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
说明:恢复分片自动分配,允许集群重新平衡数据。