我想使用新配置重新启动elasticsearch节点。优雅地关闭节点的最佳方法是什么?
杀死进程是关闭服务器的最佳方法,还是有一些神奇的URL我可以用来关闭节点?
答案 0 :(得分:120)
更新了答案。
_shutdown
API已在elasticsearch 2.x中删除。
一些选项:
在您的终端(基本上是开发模式)中,只需输入“Ctrl-C”
如果您以守护进程(-d
)启动它,请找到PID并终止进程:SIGTERM
将彻底关闭Elasticsearch(kill -15 PID
)
如果作为服务运行,请运行service elasticsearch stop
:
以前的答案。它现在已从1.6推荐使用。
呀。见admin cluster nodes shutdown documentation
基本上:
# Shutdown local node
$ curl -XPOST 'http://localhost:9200/_cluster/nodes/_local/_shutdown'
# Shutdown all nodes in the cluster
$ curl -XPOST 'http://localhost:9200/_shutdown'
答案 1 :(得分:14)
如果您只想应用新配置,则无需关闭它。
$ sudo service elasticsearch restart
但是如果你想要关闭它:
$ sudo service elasticsearch stop
OR
$ sudo systemctl stop elasticsearch.service
$ sudo systemctl restart elasticsearch.service
泊坞:
docker restart <elasticsearch-container-name or id>
答案 2 :(得分:5)
这适用于OSX。
pkill -f elasticsearch
答案 3 :(得分:4)
停止服务并终止守护进程确实是关闭节点的正确方法。但是,如果要删除节点进行维护,则不建议直接执行此操作。事实上,如果您没有副本,则会丢失数据。
当您直接关闭节点时,Elasticsearch将等待1米(默认时间)以使其重新联机。如果没有,那么它将开始将该节点的分片分配给浪费大量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
其他答案解释了如何杀死进程。
答案 4 :(得分:3)
Elasticsearch的Head插件为Elasticsearch管理提供了一个很棒的基于Web的前端,包括关闭节点。它也可以运行任何Elasticsearch命令。
答案 5 :(得分:1)
如果您想查找实例的PID并终止进程,假设该节点正在侦听端口9300(默认端口),您可以运行以下命令:
kill -9 $(netstat -nlpt | grep 9300 | cut -d ' ' -f 58 | cut -d '/' -f 1)
您可能需要使用上述代码中的数字,例如58和1
答案 6 :(得分:1)
如果您无法在Windows机器上找到正在运行elasticsearch的进程,您可以尝试在控制台中运行:
keys = ['a','b','c']
current_level = code # Top level
for key in keys:
current_level = current_level.get(key) # Descent next level
print current_level # Value of the 'c' dict
查找端口elasticsearch正在运行,默认为netstat -a -n -o
。最后一列是使用该端口的进程的PID。您可以在控制台
9200
答案 7 :(得分:1)
使用以下命令来了解已在运行的节点的pid。
curl -XGET&#39; http://localhost:9200/_nodes/process&#39;
我花了一个小时才找到杀死节点的方法,最后在终端窗口中使用此命令后可以这样做。
答案 8 :(得分:1)
对于使用 Homebrew (Brew) 安装和管理服务的 Mac 用户:
列出您的 Brew 服务:
brew services
用服务做点什么:
brew services start elasticsearch-full
brew services restart elasticsearch-full
brew services stop elasticsearch-full
答案 9 :(得分:0)
如果您在本地主机上运行节点,请使用“ brew service stop elasticsearch”
我在iOS本地主机上运行elasticsearch。
答案 10 :(得分: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"
# 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上测试
来源: