Полная перезагрузка кластера и поэтапная перезагрузка
Возможно, вам потребуется выполнить полную перезагрузку всего кластера или поэтапную перезагрузку. В случае полной перезагрузки вы выключаете и перезапускаете все узлы кластера, а в случае поэтапной перезагрузки вы отключаете по одному узлу за раз, чтобы служба оставалась непрерывной.
Узлы, превышающие порог низкого уровня, будут перезапускаться медленно. Снизьте использование дискового пространства ниже порогового значения низкого уровня перед перезапуском узлов.
Полная перезагрузка кластера
-
Отключить распределение фрагментов.
При выключении узла данных процесс распределения ожидает
index.unassigned.node_left.delayed_timeout(по умолчанию, одну минуту) перед началом репликации фрагментов на этом узле на другие узлы кластера, что может потребовать значительного ввода-вывода. Поскольку узел вскоре будет перезапущен, этот ввод-вывод не нужен. Вы можете избежать гонки со временем, отключив распределение реплик перед выключением узлов данных:resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.enable": "primaries" }, ) print(resp)response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.enable' => 'primaries' } } ) puts responseconst response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.enable": "primaries", }, }); console.log(response);PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "primaries" } }При перезапуске больших кластеров также можно рассмотреть настройки шлюза, чтобы уменьшить начальную нагрузку во время обработки узлами процесса обнаружения.
-
Остановить индексацию и выполнить сброс.
Выполнение сброса ускоряет восстановление фрагментов.
resp = client.indices.flush() print(resp)
response = client.indices.flush puts response
const response = await client.indices.flush(); console.log(response);
POST /_flush
-
Временно остановить задачи, связанные с активными заданиями машинного обучения и каналами данных. (Необязательно)
Для функций машинного обучения требуются определённые подписки.
У вас есть два варианта обработки задач машинного обучения и каналов данных при выключении кластера:
-
Временно приостановить задачи, связанные с вашими заданиями машинного обучения и каналами данных, и предотвратить открытие новых заданий, используя API установки режима обновления:
resp = client.ml.set_upgrade_mode( enabled=True, ) print(resp)response = client.ml.set_upgrade_mode( enabled: true ) puts response
const response = await client.ml.setUpgradeMode({ enabled: "true", }); console.log(response);POST _ml/set_upgrade_mode?enabled=true
При отключении режима обновления задачи возобновляются, используя последнее состояние модели, которое было автоматически сохранено. Этот вариант позволяет избежать накладных расходов на управление активными задачами во время выключения и быстрее, чем явное прекращение работы каналов данных и закрытие заданий.
- Остановить все каналы данных и закрыть все задания. Этот вариант сохраняет состояние модели на момент закрытия. При повторном открытии заданий после перезапуска кластера они используют точно такое же состояние модели. Однако сохранение последнего состояния модели занимает больше времени, чем использование режима обновления, особенно если у вас много заданий или задания с большими состояниями моделей.
-
-
Выключить все узлы.
-
Если Elasticsearch работает с
systemd:sudo systemctl stop elasticsearch.service
-
Если Elasticsearch работает с SysV
init:sudo -i service elasticsearch stop
-
Если Elasticsearch работает в качестве демона:
kill $(cat pid)
-
- Выполнить все необходимые изменения.
-
Перезапустить узлы.
Если у вас есть выделенные узлы мастера, сначала запустите их и подождите, пока они сформируют кластер и выберут мастера, прежде чем приступать к узлам данных. Вы можете отслеживать процесс, просматривая журналы.
Как только достаточно узлов, способных стать мастерами, обнаружат друг друга, они сформируют кластер и выберут мастера. В этот момент вы можете использовать API cat health и cat nodes для мониторинга присоединения узлов к кластеру:
resp = client.cat.health() print(resp) resp1 = client.cat.nodes() print(resp1)
response = client.cat.health puts response response = client.cat.nodes puts response
const response = await client.cat.health(); console.log(response); const response1 = await client.cat.nodes(); console.log(response1);
GET _cat/health GET _cat/nodes
Столбец
status, возвращаемый_cat/health, показывает состояние каждого узла в кластере:red,yellowилиgreen. -
Подождите, пока все узлы присоединятся к кластеру и покажут состояние желтого.
Когда узел присоединяется к кластеру, он начинает восстанавливать все первичные фрагменты, которые хранятся локально. API
_cat/healthизначально показывает состояниеstatusred, указывая на то, что не все первичные фрагменты были назначены.Как только узел восстановит свои локальные фрагменты, кластер
statusпереключится наyellow, указывая на то, что все первичные фрагменты были восстановлены, но не все реплицированные фрагменты назначены. Это ожидаемо, так как вы пока не включили распределение. Отложенное назначение реплик до тех пор, пока все узлы не будутyellow, позволяет мастеру назначать реплики узлам, которые уже имеют локальные копии фрагментов. -
Включить распределение.
Когда все узлы присоединятся к кластеру и восстановят свои первичные фрагменты, включите распределение, восстановив
cluster.routing.allocation.enableдо значения по умолчанию:resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.enable": None }, ) print(resp)response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.enable' => nil } } ) puts responseconst response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.enable": null, }, }); console.log(response);PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": null } }После включения распределения кластер начнёт назначать реплицированные фрагменты узлам данных. В этот момент безопасно возобновить индексацию и поиск, но ваш кластер восстановится быстрее, если вы сможете подождать, пока все первичные и реплицированные фрагменты не будут успешно назначены, а состояние всех узлов будет
green.Вы можете отслеживать процесс с помощью API
_cat/healthи_cat/recovery:resp = client.cat.health() print(resp) resp1 = client.cat.recovery() print(resp1)
response = client.cat.health puts response response = client.cat.recovery puts response
const response = await client.cat.health(); console.log(response); const response1 = await client.cat.recovery(); console.log(response1);
GET _cat/health GET _cat/recovery
-
Перезапустить задания машинного обучения. (Необязательно)
Если вы временно приостановили задачи, связанные с вашими заданиями машинного обучения, используйте API установки режима обновления, чтобы вернуть их в активное состояние:
resp = client.ml.set_upgrade_mode( enabled=False, ) print(resp)response = client.ml.set_upgrade_mode( enabled: false ) puts response
const response = await client.ml.setUpgradeMode({ enabled: "false", }); console.log(response);POST _ml/set_upgrade_mode?enabled=false
Если вы закрыли все задания машинного обучения перед выключением узлов, откройте задания и запустите каналы данных из Kibana или с помощью API открытия заданий и запуска каналов данных.
Поэтапная перезагрузка
-
Отключить распределение фрагментов.
При выключении узла данных процесс распределения ожидает
index.unassigned.node_left.delayed_timeout(по умолчанию, одну минуту) перед началом репликации фрагментов на этот узел на другие узлы кластера, что может включать большое количество операций ввода-вывода. Поскольку узел вскоре будет перезапущен, эти операции ввода-вывода не нужны. Можно избежать гонки со временем, отключив распределение реплик перед выключением узлов данных:resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.enable": "primaries" }, ) print(resp)response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.enable' => 'primaries' } } ) puts responseconst response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.enable": "primaries", }, }); console.log(response);PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "primaries" } }Также можно учесть настройки шлюза при перезапуске больших кластеров, чтобы уменьшить начальную нагрузку, пока узлы обрабатывают дисковери.
-
Остановить неважные индексирования и выполнить сброс. (Необязательно)
Хотя можно продолжать индексирование во время плавного перезапуска, восстановление фрагментов может быть быстрее, если временно остановить неважные индексирования и выполнить сброс.
resp = client.indices.flush() print(resp)
response = client.indices.flush puts response
const response = await client.indices.flush(); console.log(response);
POST /_flush
-
Временно остановить задачи, связанные с активными заданиями машинного обучения и каналами данных. (Необязательно)
Для функций машинного обучения требуются определенные подписки.
У вас есть два варианта для обработки заданий машинного обучения и каналов данных при выключении кластера:
-
Временно приостановить задачи, связанные с вашими заданиями машинного обучения и каналами данных, и предотвратить открытие новых заданий, используя API установки режима обновления:
resp = client.ml.set_upgrade_mode( enabled=True, ) print(resp)response = client.ml.set_upgrade_mode( enabled: true ) puts response
const response = await client.ml.setUpgradeMode({ enabled: "true", }); console.log(response);POST _ml/set_upgrade_mode?enabled=true
При отключении режима обновления задания возобновляются с последнего состояния модели, которое было автоматически сохранено. Этот вариант позволяет избежать накладных расходов на управление активными заданиями во время выключения и быстрее, чем явное прекращение работы каналов данных и закрытие заданий.
- Остановите все каналы данных и закройте все задания. Этот вариант сохраняет состояние модели на момент закрытия. При повторном открытии заданий после перезапуска кластера они будут использовать точно такое же состояние модели. Однако сохранение последнего состояния модели занимает больше времени, чем использование режима обновления, особенно если у вас много заданий или задания с большими состояниями моделей.
- Если вы выполняете плавный перезапуск, вы также можете оставить свои задания машинного обучения работающими. При выключении узла машинного обучения его задания автоматически перемещаются на другой узел и восстанавливают состояния моделей. Этот вариант позволяет вашим заданиям продолжать работу во время выключения, но он накладывает большую нагрузку на кластер.
-
-
Выключение отдельного узла в случае плавного перезапуска.
-
Если вы запускаете Elasticsearch с
systemd:sudo systemctl stop elasticsearch.service
-
Если вы запускаете Elasticsearch с SysV
init:sudo -i service elasticsearch stop
-
Если вы запускаете Elasticsearch как демон:
kill $(cat pid)
-
- Выполните необходимые изменения.
-
Перезапустите узел, который вы изменили.
Запустите узел и подтвердите, что он присоединяется к кластеру, проверив файл журнала или отправив запрос
_cat/nodes:resp = client.cat.nodes() print(resp)
response = client.cat.nodes puts response
const response = await client.cat.nodes(); console.log(response);
GET _cat/nodes
-
Включить распределение фрагментов.
Для узлов данных, после того как узел присоединился к кластеру, удалите параметр
cluster.routing.allocation.enable, чтобы включить распределение фрагментов, и начните использовать узел:resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.enable": None }, ) print(resp)response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.enable' => nil } } ) puts responseconst response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.enable": null, }, }); console.log(response);PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": null } } -
Повторите в случае плавного перезапуска.
Когда узел восстановился и кластер стабилен, повторите эти шаги для каждого узла, который нужно изменить.
-
Перезапустить задания машинного обучения. (Необязательно)
Если вы временно приостановили задачи, связанные с вашими заданиями машинного обучения, используйте API установки режима обновления, чтобы вернуть их в активное состояние:
resp = client.ml.set_upgrade_mode( enabled=False, ) print(resp)response = client.ml.set_upgrade_mode( enabled: false ) puts response
const response = await client.ml.setUpgradeMode({ enabled: "false", }); console.log(response);POST _ml/set_upgrade_mode?enabled=false
Если вы закрыли все задания машинного обучения перед остановкой узлов, откройте задания и запустите каналы данных из Kibana или с помощью API открытия заданий и API запуска каналов данных.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/restart-cluster.html