98

我想用新的配置重新启动一个 elasticsearch 节点。优雅关闭节点的最佳方法是什么?

杀死进程是关闭服务器的最佳方式,还是有一些神奇的 URL 可以用来关闭节点?

4

13 回答 13

134

更新了答案。

_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'
于 2013-06-19T13:12:00.393 回答
25

如果您只想应用新配置,则无需将其关闭。

$ 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>

于 2017-01-08T19:13:44.377 回答
13

这适用于我在 OSX 上。

pkill -f elasticsearch
于 2017-11-28T16:48:46.353 回答
10

停止服务并杀死守护进程确实是关闭节点的正确方法。但是,如果您想关闭节点进行维护,不建议直接这样做。事实上,如果您没有副本,您将丢失数据。

当你直接关闭一个节点时,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

其他答案已经解释了如何杀死一个进程。

于 2017-12-09T05:13:19.757 回答
5

对于使用Homebrew (Brew) 安装和管理服务的 Mac 用户:

列出您的 Brew 服务:

brew services

用服务做一些事情:

brew services start elasticsearch-full
brew services restart elasticsearch-full
brew services stop elasticsearch-full
于 2021-01-29T23:55:53.270 回答
4

Elasticsearch 的 Head 插件为 Elasticsearch 管理提供了一个很棒的基于 Web 的前端,包括关闭节点。它也可以运行任何 Elasticsearch 命令。

于 2014-01-27T20:43:58.227 回答
3

使用以下命令可以知道已经运行的节点的 pid。

curl -XGET ' http://localhost:9200/_nodes/process '

我花了一个小时才找到杀死节点的方法,在终端窗口中使用这个命令后终于可以做到了。

于 2017-07-09T12:05:23.210 回答
2

如果您找不到在 windows 机器上运行 elasticsearch 的进程,您可以尝试在控制台中运行:

netstat -a -n -o

查找端口 elasticsearch 是否正在运行,默认为9200. 最后一列是使用该端口的进程的 PID。您可以在控制台中使用简单的命令将其关闭

taskkill /PID here_goes_PID /F
于 2017-05-04T10:46:13.273 回答
1

如果您在 localhost 上运行节点,请尝试使用brew service stop elasticsearch

我在 iOS localhost 上运行 elasticsearch。

于 2018-07-11T05:41:26.673 回答
0

考虑到您有 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"

停止每个节点的 elasticsearch 服务

# 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 上测试

资源:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/6.5/stopping-elasticsearch.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/6.5/rolling-upgrades.html
于 2019-04-11T18:59:13.157 回答
0

以防万一您想查找实例的 PID 并终止进程,假设节点正在侦听端口 9300(默认端口),您可以运行以下命令:

kill -9  $(netstat -nlpt | grep 9200 | cut -d ' ' -f 58 | cut -d '/' -f 1)

您可能不得不玩弄上述代码中的数字,例如 58 和 1

于 2017-01-04T14:54:01.527 回答
0

Docker 内 Elasticsearch 的答案:

只需停止 docker 容器。它似乎优雅地停止,因为它记录:

[INFO ][o.e.n.Node               ] [elastic] stopping ...
于 2017-11-29T11:43:51.790 回答
-1
$ ps aux | grep java
$ jps | grep Elasticsearch

上述命令的输出应该是 PID 和进程名称,如下所示,就像在 Java 示例中一样:1 12345 Elasticsearch

获得 Elasticsearch 的 PID 号后,可以使用 kill 命令结束进程,如下所示:

$ Kill -9 pid
于 2021-09-16T10:15:12.827 回答