L'arresto del servizio e l'uccisione del daemon sono in effetti i modi corretti per arrestare un nodo. Tuttavia, non è consigliabile farlo direttamente se si desidera disattivare un nodo per la manutenzione. Infatti, se non hai repliche perderai i dati.
Quando arresti direttamente un nodo, Elasticsearch attenderà 1 m (tempo predefinito) per tornare online. In caso contrario, inizierà ad allocare i frammenti da quel nodo ad altri nodi sprecando un sacco di IO.
Un approccio tipico sarebbe disabilitare temporaneamente l'allocazione degli shard emettendo:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
Ora, quando rimuovi un nodo, ES non proverà ad allocare frammenti da quel nodo ad altri nodi e puoi eseguire la tua attività di manutenzione e quindi una volta che il nodo è attivo, puoi abilitare nuovamente l'allocazione di frammenti:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
Fonte: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html
Se non disponi di repliche per tutti gli indici, l'esecuzione di questo tipo di attività avrà tempi di inattività su alcuni degli indici. Un modo più pulito in questo caso sarebbe migrare tutti i frammenti su altri nodi prima di rimuovere il nodo:
PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}
Questo sposterà tutti i frammenti da 10.0.0.1
ad altri nodi (richiederà tempo a seconda dei dati). Una volta terminato, puoi uccidere il nodo, eseguire la manutenzione e rimetterlo online. Questa è un'operazione più lenta e non è necessaria se si dispone di repliche.
(Invece di _ip, _id, _name con caratteri jolly funzioneranno perfettamente.)
Maggiori informazioni: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html
Altre risposte hanno spiegato come uccidere un processo.