Elasticsearch 集群节点下线方案
Elasticsearch 集群节点下线方案
在 Elasticsearch(ES)集群中,节点(Node)下线可能会影响数据的可用性和集群的健康状态。因此,正确的下线步骤需要确保数据不会丢失,并且不会影响查询或写入。
🔍 1. 确定要下线的节点
首先,找到即将下线的节点:
curl -XGET "http://<ES_HOST>:9200/_cat/nodes?v"
示例输出:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.101 65 50 3 0.12 0.15 0.20 mdi * node-1
192.168.1.102 70 55 2 0.10 0.12 0.18 mdi node-2
192.168.1.103 60 48 1 0.08 0.10 0.15 mdi node-3
📌 注意:
mdi
:m(Master-Eligible),d(Data Node),i(Ingest Node)*
表示当前的 Master 节点
确保不要误下线 Master 节点,除非你计划先选举新的 Master。
🔍 2. 将节点标记为不再接收新数据
在集群中下线节点前,应该避免它继续接收新数据:
curl -XPUT "http://<ES_HOST>:9200/_cluster/settings" -H "Content-Type: application/json" -d '
{"persistent": {"cluster.routing.allocation.exclude._name": "node-2"}
}'
📌 这个操作会让 Elasticsearch 逐步把 node-2
上的分片(Shard)迁移到其他节点。
🔍 3. 监控分片迁移进度
使用以下命令查看分片是否已经迁移完毕:
curl -XGET "http://<ES_HOST>:9200/_cat/health?v"
curl -XGET "http://<ES_HOST>:9200/_cat/shards?v"
当所有分片的 STARTED
状态不再显示 node-2
,说明数据已安全迁移。
🔍 4. 移除节点
当数据迁移完成后,可以让节点主动退出集群:
curl -XPOST "http://<NODE_IP>:9200/_cluster/nodes/_local/_shutdown"
或者直接停止该节点的 Elasticsearch 进程:
systemctl stop elasticsearch
如果是 Kubernetes 部署:
kubectl delete pod <node-2-pod> -n <namespace>
🔍 5. 确保集群健康
下线后,检查集群状态:
curl -XGET "http://<ES_HOST>:9200/_cat/health?v"
如果状态仍然是 green
,则说明集群已经成功完成节点下线过程。
🔍 6. 清理下线节点信息
如果 node-2
永久下线,不再加入集群,可以清理它的配置:
curl -XPUT "http://<ES_HOST>:9200/_cluster/settings" -H "Content-Type: application/json" -d '
{"persistent": {"cluster.routing.allocation.exclude._name": null}
}'
📌 这样可以让 Elasticsearch 允许新节点加入,并重新平衡分片。
🚀 总结
步骤 | 操作 |
---|---|
确认节点 | curl -XGET "http://<ES_HOST>:9200/_cat/nodes?v" |
迁移数据 | curl -XPUT ... exclude._name": "node-2" |
监控迁移 | curl -XGET "http://<ES_HOST>:9200/_cat/shards?v" |
停止节点 | systemctl stop elasticsearch 或 kubectl delete pod |
检查健康 | curl -XGET "http://<ES_HOST>:9200/_cat/health?v" |
清理信息 | curl -XPUT ... exclude._name": null |
📌 建议:如果你的集群只有 1-3 个节点,建议谨慎操作,确保至少有 2 个 Master-Eligible 节点保持在线!