我想用新的配置重新启动一个 elasticsearch 节点。优雅关闭节点的最佳方法是什么?
杀死进程是关闭服务器的最佳方式,还是有一些神奇的 URL 可以用来关闭节点?
我想用新的配置重新启动一个 elasticsearch 节点。优雅关闭节点的最佳方法是什么?
杀死进程是关闭服务器的最佳方式,还是有一些神奇的 URL 可以用来关闭节点?
更新了答案。
_shutdown
在 elasticsearch 2.x 中删除了 API。
一些选项:
在您的终端(基本上是开发模式)中,只需键入“Ctrl-C”
如果您将它作为守护进程启动 ( -d
) 找到 PID 并终止进程:SIGTERM
将彻底关闭 Elasticsearch ( kill -15 PID
)
如果作为服务运行,运行类似service elasticsearch stop
:
上一个答案。它现在已从 1.6 中弃用。
是的。请参阅管理员集群节点关闭文档
基本上:
# Shutdown local node
$ curl -XPOST 'http://localhost:9200/_cluster/nodes/_local/_shutdown'
# Shutdown all nodes in the cluster
$ curl -XPOST 'http://localhost:9200/_shutdown'
如果您只想应用新配置,则无需将其关闭。
$ sudo service elasticsearch restart
但是,如果您仍然想将其关闭:
$ sudo service elasticsearch stop
或者
$ sudo systemctl stop elasticsearch.service
$ sudo systemctl restart elasticsearch.service
码头工人:
docker restart <elasticsearch-container-name or id>
这适用于我在 OSX 上。
pkill -f elasticsearch
停止服务并杀死守护进程确实是关闭节点的正确方法。但是,如果您想关闭节点进行维护,不建议直接这样做。事实上,如果您没有副本,您将丢失数据。
当你直接关闭一个节点时,Elasticsearch 会等待 1m(默认时间)让它重新上线。如果没有,那么它将开始将分片从该节点分配给其他节点,从而浪费大量 IO。
一种典型的方法是通过发出以下命令暂时禁用分片分配:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
现在,当您关闭一个节点时,ES 不会尝试从该节点分配分片到其他节点,您可以执行维护活动,然后一旦节点启动,您可以再次启用分片分配:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
来源:https ://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html
如果您没有所有索引的副本,则执行此类活动将导致某些索引停机。在这种情况下,一种更简洁的方法是在关闭节点之前将所有分片迁移到其他节点:
PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}
这会将所有分片从10.0.0.1
其他节点移动(需要时间,具体取决于数据)。一切完成后,您可以终止节点,执行维护并使其重新上线。这是一个较慢的操作,如果您有副本则不需要。
(用通配符代替 _ip、_id、_name 就可以了。)
更多信息:https ://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html
其他答案已经解释了如何杀死一个进程。
对于使用Homebrew (Brew) 安装和管理服务的 Mac 用户:
列出您的 Brew 服务:
brew services
用服务做一些事情:
brew services start elasticsearch-full
brew services restart elasticsearch-full
brew services stop elasticsearch-full
Elasticsearch 的 Head 插件为 Elasticsearch 管理提供了一个很棒的基于 Web 的前端,包括关闭节点。它也可以运行任何 Elasticsearch 命令。
使用以下命令可以知道已经运行的节点的 pid。
curl -XGET ' http://localhost:9200/_nodes/process '
我花了一个小时才找到杀死节点的方法,在终端窗口中使用这个命令后终于可以做到了。
如果您找不到在 windows 机器上运行 elasticsearch 的进程,您可以尝试在控制台中运行:
netstat -a -n -o
查找端口 elasticsearch 是否正在运行,默认为9200
. 最后一列是使用该端口的进程的 PID。您可以在控制台中使用简单的命令将其关闭
taskkill /PID here_goes_PID /F
如果您在 localhost 上运行节点,请尝试使用brew service stop elasticsearch
我在 iOS localhost 上运行 elasticsearch。
考虑到您有 3 个节点。
export ES_HOST=localhost:9200
# Disable shard allocation
curl -X PUT "$ES_HOST/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
'
# Stop non-essential indexing and perform a synced flush
curl -X POST "$ES_HOST/_flush/synced"
# check nodes
export ES_HOST=localhost:9200
curl -X GET "$ES_HOST/_cat/nodes"
# node 1
systemctl stop elasticsearch.service
# node 2
systemctl stop elasticsearch.service
# node 3
systemctl stop elasticsearch.service
# start
systemctl start elasticsearch.service
# Reenable shard allocation once the node has joined the cluster
curl -X PUT "$ES_HOST/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
'
在 Elasticseach 6.5 上测试
资源:
以防万一您想查找实例的 PID 并终止进程,假设节点正在侦听端口 9300(默认端口),您可以运行以下命令:
kill -9 $(netstat -nlpt | grep 9200 | cut -d ' ' -f 58 | cut -d '/' -f 1)
您可能不得不玩弄上述代码中的数字,例如 58 和 1
Docker 内 Elasticsearch 的答案:
只需停止 docker 容器。它似乎优雅地停止,因为它记录:
[INFO ][o.e.n.Node ] [elastic] stopping ...
$ ps aux | grep java
$ jps | grep Elasticsearch
上述命令的输出应该是 PID 和进程名称,如下所示,就像在 Java 示例中一样:1 12345 Elasticsearch
获得 Elasticsearch 的 PID 号后,可以使用 kill 命令结束进程,如下所示:
$ Kill -9 pid