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.1
otros 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.