Elasticsearch双节点集群:安全关闭单个节点的最佳方式
安全关闭Elasticsearch单节点的方法(6.2.1版本,RHEL系统)
针对你的2节点集群(1个候选主节点+1个数据节点),以下是几种比直接杀死进程更安全的关闭方式:
1. 使用系统服务管理命令(推荐)
如果你的Elasticsearch是通过RPM包安装的,默认会注册为systemd服务或传统SysV服务,直接用系统命令停止即可触发优雅关闭:
- 对于systemd系统(RHEL7+):
sudo systemctl stop elasticsearch - 对于SysV系统(RHEL6及更早):
sudo service elasticsearch stop
这个过程中,节点会先完成正在处理的请求,将自身分片迁移到集群中其他运行的节点,然后再平稳退出,不会导致数据丢失或集群分片异常。
2. 通过Elasticsearch REST API优雅关闭
利用ES提供的关闭节点API,可精准控制单个节点的下线流程,步骤如下:
- 临时禁用分片自动分配(避免关闭过程中集群频繁触发分片迁移,节省资源):
curl -XPUT 'http://<集群任意节点IP>:9200/_cluster/settings' -H 'Content-Type: application/json' -d '{ "persistent": {"cluster.routing.allocation.enable": "none"} }' - 关闭目标节点:
如果你在要关闭的节点本地操作,可使用_local指代当前节点;也可以指定节点ID或IP:# 关闭本地节点 curl -XPOST 'http://localhost:9200/_cluster/nodes/_local/_shutdown' # 或指定节点IP关闭 curl -XPOST 'http://<目标节点IP>:9200/_cluster/nodes/<目标节点IP>/_shutdown' - 节点关闭后恢复分片分配:
curl -XPUT 'http://<集群剩余节点IP>:9200/_cluster/settings' -H 'Content-Type: application/json' -d '{ "persistent": {"cluster.routing.allocation.enable": "all"} }'
3. 使用kill发送优雅终止信号
如果一定要通过进程ID操作,不要用强制杀死的kill -9,而是发送TERM信号让ES进程执行优雅关闭:
# 先找到ES进程ID(比如用ps命令) PID=$(ps aux | grep elasticsearch | grep -v grep | awk '{print $2}') # 发送优雅终止信号 kill -TERM $PID
ES进程捕获到TERM信号后,会自动完成请求处理、分片迁移等收尾工作再退出。
注意事项
如果要关闭的是候选主节点,需先确保集群有其他可选举的主节点:
- 将另一个数据节点临时设置为候选主节点:
节点ID可通过curl -XPUT 'http://<该节点IP>:9200/_cluster/settings' -H 'Content-Type: application/json' -d '{ "transient": {"nodes.<该节点ID>.master": true} }'curl http://<节点IP>:9200/_cat/nodes?v查看。 - 确认集群状态正常(
curl http://<集群IP>:9200/_cluster/health显示green或yellow)后,再关闭原候选主节点,避免集群失去主节点导致不可用。
内容的提问来源于stack exchange,提问作者user21742699
相关产品推荐
相关产品推荐

