Come arrestare / chiudere un nodo di ricerca elastica?


87

Voglio riavviare un nodo elasticsearch con una nuova configurazione. Qual è il modo migliore per chiudere con grazia un nodo?

Interrompere il processo è il modo migliore per arrestare il server o c'è qualche URL magico che posso usare per chiudere il nodo?

Risposte:


127

Risposta aggiornata.

_shutdown L'API è stata rimossa in elasticsearch 2.x.

Alcune opzioni:

  • Nel tuo terminale (in pratica in modalità sviluppatore), digita semplicemente "Ctrl-C"

  • Se lo hai avviato come daemon ( -d) trova il PID e termina il processo: SIGTERMchiuderà Elasticsearch in modo pulito ( kill -15 PID)

  • Se viene eseguito come servizio, esegui qualcosa come service elasticsearch stop:

Risposta precedente. Ora è deprecato dalla 1.6.

Si. Vedere documentazione relativa all'arresto dei nodi del cluster di amministrazione

Fondamentalmente:

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

# Shutdown all nodes in the cluster
$ curl -XPOST 'http://localhost:9200/_shutdown'

2
Quindi, sembra che l'API di arresto sia deprecata a partire da elasticsearch 1.6 (come da collegamento fornito). Qual è il nuovo modo consigliato per l'arresto?
Mike

2
Penso che sia deprecato perché ora puoi installarlo come servizio ed eseguire service stop elasticsearch. Se lo esegui solo per i test, premi CTRL + C e il gioco è fatto.
dadoonet

"gracefull" => puoi spostare lo shard prima con l'API di reindirizzamento elastic.co/guide/en/elasticsearch/reference/2.4/…
Thomas Decaux

23

Se vuoi solo applicare una nuova configurazione non è necessario spegnerlo.

$ sudo service elasticsearch restart

Ma se vuoi spegnerlo comunque:

$ sudo service elasticsearch stop

O

$ sudo systemctl stop elasticsearch.service

$ sudo systemctl restart elasticsearch.service

Docker:

docker restart <elasticsearch-container-name or id>


1
la domanda riguarda l'arresto del servizio, non il riavvio.
Jean-François Fabre

1
Non è necessario arrestare il server per applicare la nuova configurazione. non è una risposta, è una soluzione al suo problema :)
Ijaz Ahmad Khan


7

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


4

Il plug-in Head per Elasticsearch fornisce un ottimo front-end basato sul Web per l'amministrazione di Elasticsearch, inclusa la chiusura dei nodi. Può anche eseguire qualsiasi comando Elasticsearch.



2

Se non riesci a trovare quale processo sta eseguendo elasticsearch su una macchina Windows, puoi provare a eseguire in console:

netstat -a -n -o

Cerca la porta elasticsearch è in esecuzione, l'impostazione predefinita è 9200. L'ultima colonna è il PID per il processo che utilizza quella porta. Puoi spegnerlo con un semplice comando nella console

taskkill /PID here_goes_PID /F

1

Nel caso in cui desideri trovare il PID dell'istanza e terminare il processo, supponendo che il nodo stia ascoltando la porta 9300 (la porta predefinita) puoi eseguire il seguente comando:

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

Potrebbe essere necessario giocare con i numeri nel codice sopra menzionato come 58 e 1


La porta predefinita è 9200.
slhck

1

Se stai eseguendo un nodo su localhost, prova a usare brew service stop elasticsearch

Eseguo elasticsearch su iOS localhost.


0

Risposta per Elasticsearch all'interno di Docker:

Basta fermare il docker container. Sembra fermarsi con grazia perché registra:

[INFO ][o.e.n.Node               ] [elastic] stopping ...

0

Considerando che hai 3 nodi.

Prepara il tuo cluster

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"

Interrompi il servizio elasticsearch in ogni 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

Riavvio di nuovo cluster

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

Testato su Elasticseach 6.5

Fonte:

  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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.