¿Cómo detener / cerrar un nodo de elasticsearch?

85

Quiero reiniciar un nodo de elasticsearch con una nueva configuración. ¿Cuál es la mejor manera de cerrar correctamente un nodo?

¿Acabar con el proceso es la mejor manera de cerrar el servidor o hay alguna URL mágica que pueda usar para cerrar el nodo?

Michael_Scharf
fuente

Respuestas:

126

Respuesta actualizada.

_shutdown La API se ha eliminado en elasticsearch 2.x.

Algunas opciones:

  • En su terminal (básicamente en modo dev), simplemente escriba "Ctrl-C"

  • Si lo inició como un demonio ( -d) busque el PID y finalice el proceso: SIGTERMcerrará Elasticsearch limpiamente ( kill -15 PID)

  • Si se ejecuta como un servicio, ejecute algo como service elasticsearch stop:

Respuesta anterior. Ahora está en desuso de 1.6.

Si. Consulte la documentación de cierre de los nodos del clúster de administración

Básicamente:

# Shutdown local node
$ curl -XPOST 'http://localhost:9200/_cluster/nodes/_local/_shutdown'

# Shutdown all nodes in the cluster
$ curl -XPOST 'http://localhost:9200/_shutdown'
dadoonet
fuente
2
Por lo tanto, parece que la API de cierre está obsoleta a partir de elasticsearch 1.6 (según el enlace proporcionado). ¿Cuál es la nueva forma recomendada de apagar?
Mike
2
Creo que está obsoleto porque ahora puede instalarlo como un servicio y ejecutar service stop elasticsearch. Si lo ejecuta solo para pruebas, presione CTRL + C y listo.
dadoonet
"gracefull" => puede mover su fragmento antes con la API de redireccionamiento elastic.co/guide/en/elasticsearch/reference/2.4/…
Thomas Decaux
23

Si solo desea aplicar una nueva configuración, no es necesario que la apague.

$ sudo service elasticsearch restart

Pero si quieres cerrarlo de todos modos:

$ sudo service elasticsearch stop

O

$ sudo systemctl stop elasticsearch.service

$ sudo systemctl restart elasticsearch.service

Estibador:

docker restart <elasticsearch-container-name or id>

Ijaz Ahmad Khan
fuente
1
la cuestión es detener el servicio, no reiniciarlo.
Jean-François Fabre
1
Doenst necesita apagar el servidor para aplicar la nueva configuración. no es una respuesta, es una solución a su problema :)
Ijaz Ahmad Khan
10

Esto me funciona en OSX.

pkill -f elasticsearch
mnishiguchi
fuente
7

Detener el servicio y matar el demonio son de hecho las formas correctas de cerrar un nodo. Sin embargo, no se recomienda hacerlo directamente si desea eliminar un nodo para su mantenimiento. De hecho, si no tiene réplicas, perderá datos.

Cuando apaga directamente un nodo, Elasticsearch esperará 1 m (tiempo predeterminado) para que vuelva a estar en línea. Si no es así, comenzará a asignar los fragmentos de ese nodo a otros nodos, desperdiciando muchos IO.

Un enfoque típico sería deshabilitar la asignación de fragmentos temporalmente emitiendo:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}

Ahora, cuando elimina un nodo, ES no intentará asignar fragmentos de ese nodo a otros nodos y puede realizar su actividad de mantenimiento y luego, una vez que el nodo está activo, puede habilitar la asignación de fragmentos nuevamente:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}

Fuente: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html

Si no tiene réplicas para todos sus índices, entonces realizar este tipo de actividad tendrá tiempo de inactividad en algunos de los índices. Una forma más limpia en este caso sería migrar todos los fragmentos a otros nodos antes de eliminar el nodo:

PUT _cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
  }
}

Esto moverá todos los fragmentos de 10.0.0.1otros nodos (tomará tiempo dependiendo de los datos). Una vez que todo esté hecho, puede matar el nodo, realizar el mantenimiento y volver a ponerlo en línea. Esta es una operación más lenta y no es necesaria si tiene réplicas.

(En lugar de _ip, _id, _name con comodines funcionará bien).

Más información: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html

Otras respuestas han explicado cómo matar un proceso.

Seguro
fuente
4

El complemento Head para Elasticsearch proporciona una excelente interfaz basada en web para la administración de Elasticsearch, incluido el cierre de nodos. También puede ejecutar cualquier comando de Elasticsearch.

Serge Meunier
fuente
3

utilice el siguiente comando para conocer el pid del nodo que ya se está ejecutando.

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

Me tomó una hora encontrar la forma de matar el nodo y finalmente pude hacerlo después de usar este comando en la ventana del terminal.

akshit bhatia
fuente
2

Si no puede encontrar qué proceso está ejecutando elasticsearch en la máquina con Windows, puede intentar ejecutarlo en la consola:

netstat -a -n -o

Busque el puerto que se está ejecutando elasticsearch, el valor predeterminado es 9200. La última columna es el PID para el proceso que utiliza ese puerto. Puede apagarlo con un simple comando en la consola

taskkill /PID here_goes_PID /F
Augustas
fuente
1

En caso de que desee encontrar el PID de la instancia y finalizar el proceso, asumiendo que el nodo está escuchando el puerto 9300 (el puerto predeterminado), puede ejecutar el siguiente comando:

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

Es posible que tenga que jugar con los números en el código mencionado anteriormente, como 58 y 1

Mohammad-Ali
fuente
El puerto predeterminado es 9200.
slhck
0

Respuesta para Elasticsearch dentro de Docker:

Simplemente detenga el contenedor Docker. Parece detenerse con gracia porque registra:

[INFO ][o.e.n.Node               ] [elastic] stopping ...
Risadinha
fuente
0

Considerando que tienes 3 nodos.

Prepara tu clúster

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"

Detenga el servicio de elasticsearch en cada nodo

# 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

Reiniciando el clúster nuevamente

# 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
  }
}
'

Probado en Elasticseach 6.5

Fuente:

  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
Thiago Falcao
fuente
0

Si está ejecutando un nodo en localhost, intente usar brew service stop elasticsearch

Ejecuto elasticsearch en iOS localhost.

Ahmer Malik
fuente