Как остановить / выключить узел elasticsearch?

87

Я хочу перезапустить узел elasticsearch с новой конфигурацией. Как лучше всего завершить работу узла?

Убить процесс - лучший способ выключить сервер, или есть какой-то волшебный URL-адрес, который я могу использовать для выключения узла?

Michael_Scharf
источник

Ответы:

127

Обновленный ответ.

_shutdown API был удален в elasticsearch 2.x.

Некоторые варианты:

  • В вашем терминале (в основном в режиме разработки) просто введите "Ctrl-C"

  • Если вы запустили его как демон ( -d), найдите PID и SIGTERMзавершите процесс: завершит работу Elasticsearch ( kill -15 PID)

  • Если работает как служба, запустите что-то вроде service elasticsearch stop:

Предыдущий ответ. Теперь он устарел с версии 1.6.

Да уж. См. Документацию по завершению работы узлов административного кластера

В принципе:

# 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
Итак, похоже, что API выключения устарел с elasticsearch 1.6 (согласно предоставленной ссылке). Какой новый способ завершения работы рекомендуется?
Майк
2
Я думаю, что он устарел, потому что теперь вы можете установить его как службу и запустить service stop elasticsearch. Если вы запускаете его только для тестов, нажмите CTRL + C, и все готово.
dadoonet
"gracefull" => вы можете переместить свой сегмент раньше с помощью API перенаправления elastic.co/guide/en/elasticsearch/reference/2.4/…
Thomas Decaux
23

Если вы просто хотите применить новую конфигурацию, вам не нужно закрывать ее.

$ sudo service elasticsearch restart

Но если вы все равно хотите его выключить:

$ sudo service elasticsearch stop

ИЛИ ЖЕ

$ sudo systemctl stop elasticsearch.service

$ sudo systemctl restart elasticsearch.service

Докер:

docker restart <elasticsearch-container-name or id>

Иджаз Ахмад Хан
источник
1
вопрос в том, чтобы остановить службу, а не перезапустить ее.
Жан-Франсуа Фабр
1
вам нужно выключить сервер, чтобы применить новую конфигурацию. это не ответ, это решение его проблемы :)
Иджаз Ахмад Хан
10

У меня это работает на OSX.

pkill -f elasticsearch
mnishiguchi
источник
7

Остановка службы и уничтожение демона действительно являются правильными способами выключения узла. Однако не рекомендуется делать это напрямую, если вы хотите отключить узел для обслуживания. Фактически, если у вас нет реплик, вы потеряете данные.

Когда вы закрываете узел напрямую, Elasticsearch будет ждать 1 мин (время по умолчанию), чтобы он вернулся в онлайн. Если этого не произойдет, он начнет распределять шарды с этого узла другим узлам, тратя много операций ввода-вывода.

Типичный подход - временно отключить выделение сегментов, выполнив:

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

Теперь, когда вы снимаете узел, ES не будет пытаться выделить шард с этого узла другим узлам, и вы можете выполнять действия по обслуживанию, а затем, когда узел будет запущен, вы можете снова включить выделение сегментов:

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

Источник: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html

Если у вас нет реплик для всех ваших индексов, то выполнение этого типа действий приведет к простоям некоторых индексов. Более чистый способ в этом случае - это перенести все шарды на другие узлы перед отключением узла:

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

Это переместит все шарды с 10.0.0.1других узлов (это займет время, в зависимости от данных). Как только все будет сделано, вы можете убить узел, выполнить обслуживание и вернуть его в оперативный режим. Это более медленная операция и не требуется, если у вас есть реплики.

(Вместо _ip, _id, _name с подстановочными знаками будет работать нормально.)

Дополнительная информация: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html

Другие ответы объяснили, как убить процесс.

Суреш
источник
4

Плагин Head для Elasticsearch предоставляет отличный веб-интерфейс для администрирования Elasticsearch, включая отключение узлов. Он также может запускать любые команды Elasticsearch.

Серж Менье
источник
3

используйте следующую команду, чтобы узнать pid уже запущенного узла.

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

Мне потребовался час, чтобы найти способ убить узел, и я наконец смог это сделать после использования этой команды в окне терминала.

акшит бхатия
источник
2

Если вы не можете найти, какой процесс запускает elasticsearch на компьютере с Windows, вы можете попробовать запустить его в консоли:

netstat -a -n -o

Ищите порт, который работает elasticsearch, по умолчанию 9200. Последний столбец - это PID для процесса, использующего этот порт. Вы можете выключить его с помощью простой команды в консоли

taskkill /PID here_goes_PID /F
Августа
источник
1

На всякий случай, если вы хотите найти PID экземпляра и убить процесс, предполагая, что узел прослушивает порт 9300 (порт по умолчанию), вы можете выполнить следующую команду:

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

Возможно, вам придется поиграть с числами в вышеупомянутом коде, такими как 58 и 1.

Мохаммад-Али
источник
Порт по умолчанию - 9200.
slhck
1

Если вы запускаете узел на локальном хосте, попробуйте использовать brew service stop elasticsearch

Я запускаю elasticsearch на локальном хосте iOS.

Ахмер Малик
источник
0

Ответ для Elasticsearch внутри Docker:

Просто остановите контейнер докеров. Кажется, что он изящно останавливается, потому что регистрирует:

[INFO ][o.e.n.Node               ] [elastic] stopping ...
Рисадинья
источник
0

Учитывая, что у вас есть 3 узла.

Подготовьте свой кластер

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"

Остановить службу elasticsearch на каждом узле

# 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

Повторный перезапуск кластера

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

Проверено на Elasticseach 6.5

Источник:

  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
Тьяго Фалькао
источник