Elasticsearch 分片迁移与移除集群节点操作
问题背景
在单台服务器上部署了 7 个 Elasticsearch 节点,分别为 es-node1 到 es-node7,端口从 9201 到 9207。每个节点都承载大量数据,但没有设置副本分片。由于多个节点共享同一台服务器的硬件资源,复杂查询时会导致 CPU 占用率达到 100%,查询响应时间也超过 8 秒。
当前的索引配置为 30 个主分片,0 副本分片:
{
"aliases": {
"cqu_dev_journal_thesis": {}
},
"settings": {
"number_of_shards": 30,
"number_of_replicas": 0,
"index": {
"refresh_interval": "5s",
"max_inner_result_window": "10000",
"max_result_window": "20000"
}
},
"mappings": {
"dynamic": "strict"
}
}
由于 es-node6 和 es-node7 节点负担较重,计划停止并移除这两个节点以优化系统性能。
操作步骤
1. 确认集群健康状态
首先,需要确保当前数据的健康状态。通过以下命令检查集群状态:
http://<es-node1-ip>:9201/_cluster/health?pretty
该命令会返回集群的健康状态,如果返回的状态为 green
,说明所有分片都已正常分配。如果状态是 yellow
或 red
,需要小心操作确保不会影响数据。
2. 重新分配分片
由于计划停止的两个节点上持有主分片,首先需要将它们上的分片迁移到其他节点。
- 防止新分片分配到 es-node6 和 es-node7:通过以下命令将分片迁移到其他节点,并防止新的分片分配到这两个节点上:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.exclude._name": "es-node6,es-node7"
}
}
此设置会告诉集群不再将分片分配到 es-node6 和 es-node7 上,现有的分片也会开始自动迁移到 es-node1 到 es-node5。
3. 监控分片迁移
可以通过以下命令查看分片的迁移状态:
http://<es-node1-ip>:9201/_cat/shards?v
- 分片状态:当分片迁移完成后,
state
字段会从RELOCATING
变为STARTED
,表示分片已成功迁移并在新节点上运行。 - 等待迁移完成:在所有分片都迁移完毕后,集群健康状态应为
green
。
4. 停止节点
确保所有分片迁移成功后,可以通过命令停止节点,此操作会安全地关闭 es-node6 和 es-node7 节点,不会影响其他节点的正常运行