Jak zatrzymać / zamknąć węzeł elastyczne wyszukiwanie?

86

Chcę ponownie uruchomić węzeł Flexiblesearch z nową konfiguracją. Jaki jest najlepszy sposób na bezpieczne zamknięcie węzła?

Czy zabicie procesu jest najlepszym sposobem na zamknięcie serwera, czy też istnieje jakiś magiczny adres URL, którego mogę użyć do zamknięcia węzła?

Michael_Scharf
źródło

Odpowiedzi:

126

Zaktualizowana odpowiedź.

_shutdown API zostało usunięte w elasticsearch 2.x.

Niektóre opcje:

  • W swoim terminalu (w zasadzie w trybie programisty), po prostu naciśnij „Ctrl-C”

  • Jeśli uruchomiłeś go jako demon ( -d), znajdź PID i zabij proces: SIGTERMzamknie Elasticsearch czysto ( kill -15 PID)

  • Jeśli działa jako usługa, uruchom coś takiego service elasticsearch stop:

Poprzednia odpowiedź. Jest teraz przestarzały z wersji 1.6.

Tak. Zobacz dokumentację dotyczącą zamykania węzłów klastra administratora

Gruntownie:

# 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
źródło
2
Wygląda więc na to, że interfejs API zamykania jest przestarzały od wersji Flexiblesearch 1.6 (zgodnie z podanym linkiem). Jaki jest zalecany nowy sposób wyłączania?
Mike
2
Myślę, że jest przestarzały, ponieważ można go teraz zainstalować jako usługę i uruchomić elastyczne wyszukiwanie zatrzymania usługi. Jeśli uruchomisz go tylko dla testów, naciśnij CTRL + C i gotowe.
dadoonet
"gracefull" => możesz przenieść swój fragment wcześniej za pomocą interfejsu API przekierowania elast.co/guide/en/elasticsearch/reference/2.4/…
Thomas Decaux,
23

Jeśli chcesz tylko zastosować nową konfigurację, nie musisz jej wyłączać.

$ sudo service elasticsearch restart

Ale jeśli mimo wszystko chcesz go wyłączyć:

$ sudo service elasticsearch stop

LUB

$ sudo systemctl stop elasticsearch.service

$ sudo systemctl restart elasticsearch.service

Doker:

docker restart <elasticsearch-container-name or id>

Ijaz Ahmad Khan
źródło
1
pytanie dotyczy zatrzymania usługi, a nie ponownego jej uruchamiania.
Jean-François Fabre
1
doenst musi zamknąć serwer, aby zastosować nową konfigurację. to nie jest odpowiedź, to rozwiązanie jego problemu :)
Ijaz Ahmad Khan
10

To działa dla mnie na OSX.

pkill -f elasticsearch
mnishiguchi
źródło
7

Zatrzymanie usługi i zabicie demona to rzeczywiście właściwy sposób na zamknięcie węzła. Jednak nie zaleca się robienia tego bezpośrednio, jeśli chcesz wyłączyć węzeł w celu konserwacji. W rzeczywistości, jeśli nie masz replik, utracisz dane.

Gdy bezpośrednio zamkniesz węzeł, Elasticsearch będzie czekał 1 min (czas domyślny), aż wróci do trybu online. Jeśli tak się nie stanie, zacznie przydzielać fragmenty z tego węzła do innych węzłów, marnując dużo IO.

Typowym podejściem byłoby tymczasowe wyłączenie alokacji fragmentów przez wydanie:

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

Teraz, gdy usuniesz węzeł, ES nie będzie próbować alokować fragmentu z tego węzła do innych węzłów i możesz wykonać czynności konserwacyjne, a gdy węzeł zostanie uruchomiony, możesz ponownie włączyć alokację fragmentu:

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

Źródło: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html

Jeśli nie masz replik dla wszystkich indeksów, wykonanie tego typu czynności spowoduje przestoje w przypadku niektórych indeksów. W tym przypadku czystszym sposobem byłoby migrowanie wszystkich fragmentów do innych węzłów przed usunięciem węzła:

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

Spowoduje to przeniesienie wszystkich fragmentów z 10.0.0.1innych węzłów (zajmie to trochę czasu w zależności od danych). Gdy wszystko zostanie zrobione, możesz zabić węzeł, przeprowadzić konserwację i przywrócić go do trybu online. Jest to wolniejsza operacja i nie jest wymagana, jeśli masz repliki.

(Zamiast _ip, _id, _name z symbolami wieloznacznymi będą działać dobrze.)

Więcej informacji: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html

Inne odpowiedzi wyjaśniają, jak zabić proces.

SureshS
źródło
4

Wtyczka Head dla Elasticsearch zapewnia świetny interfejs sieciowy do administrowania Elasticsearch, w tym do zamykania węzłów. Może również uruchamiać dowolne polecenia Elasticsearch.

Serge Meunier
źródło
3

użyj następującego polecenia, aby poznać numer pid już uruchomionego węzła.

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

Znalezienie sposobu na zabicie węzła zajęło mi godzinę i wreszcie mogłem to zrobić po użyciu tego polecenia w oknie terminala.

akshit bhatia
źródło
2

Jeśli nie możesz znaleźć procesu, który uruchamia elastyczne wyszukiwanie na komputerze z systemem Windows, możesz spróbować uruchomić w konsoli:

netstat -a -n -o

Poszukaj portu Elasticsearch jest uruchomiony, domyślnie 9200. Ostatnia kolumna to PID dla procesu używającego tego portu. Możesz go zamknąć za pomocą prostego polecenia w konsoli

taskkill /PID here_goes_PID /F
Augustas
źródło
1

Na wszelki wypadek, gdybyś chciał znaleźć PID instancji i zabić proces, zakładając, że węzeł nasłuchuje na porcie 9300 (port domyślny), możesz uruchomić następujące polecenie:

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

Być może będziesz musiał grać liczbami z powyższego kodu, takimi jak 58 i 1

Mohammad-Ali
źródło
Domyślny port to 9200.
slhck
0

Odpowiedź na Elasticsearch wewnątrz Dockera:

Po prostu zatrzymaj kontener docker. Wydaje się, że zatrzymuje się wdzięcznie, ponieważ rejestruje:

[INFO ][o.e.n.Node               ] [elastic] stopping ...
Risadinha
źródło
0

Biorąc pod uwagę, że masz 3 węzły.

Przygotuj swój klaster

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"

Zatrzymaj usługę elastycznego wyszukiwania w każdym węźle

# 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

Ponownie uruchamiam klaster

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

Testowane na Elasticseach 6.5

Źródło:

  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
źródło
0

Jeśli używasz węzła na hoście lokalnym, spróbuj użyć brew service stop elasticsearch

Uruchamiam elastyczne wyszukiwanie na lokalnym hoście iOS.

Ahmer Malik
źródło