Задержка распределения при уходе узла
Когда узел по какой-либо причине покидает кластер (намеренно или непреднамеренно), мастер реагирует следующим образом:
- Превращает фрагмент реплики в первичный для замены первичных фрагментов, которые находились на узле.
- Распределяет фрагменты реплик для замены отсутствующих реплик (при условии, что на это достаточно узлов).
- Перераспределяет фрагменты равномерно по оставшимся узлам.
Эти действия направлены на защиту кластера от потери данных, гарантируя, что каждый фрагмент будет полностью дублирован как можно скорее.
Несмотря на то, что мы ограничиваем одновременные восстановления как на уровне узла, так и на уровне кластера, такое «перемешивание» фрагментов может всё ещё нагрузить кластер, что может быть излишне, если отсутствующий узел скоро вернётся. Представьте себе следующую ситуацию:
- Узел 5 теряет сетевое соединение.
- Мастер превращает фрагмент реплики в первичный для каждого первичного фрагмента, который был на узле 5.
- Мастер распределяет новые реплики на другие узлы в кластере.
- Каждая новая реплика создаёт полную копию первичного фрагмента по сети.
- Больше фрагментов перемещается на разные узлы для перебалансировки кластера.
- Узел 5 возвращается через несколько минут.
- Мастер перераспределяет кластер, распределяя фрагменты на узел 5.
Если бы мастер просто подождал несколько минут, то отсутствующие фрагменты могли бы быть перераспределены на узел 5 с минимальным трафиком в сети. Этот процесс был бы ещё быстрее для простаивающих фрагментов (фрагментов, не получающих запросов индексирования), которые были автоматически синхронизированы.
Распределение фрагментов реплик, которые становятся неназначенными из-за ухода узла, можно задерживать с помощью динамического параметра index.unassigned.node_left.delayed_timeout, который по умолчанию установлен на 1m.
Этот параметр может быть обновлён для активного индекса (или для всех индексов):
PUT _all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
} При включённой задержке распределения описанный выше сценарий изменится следующим образом:
- Узел 5 теряет сетевое соединение.
- Мастер превращает фрагмент реплики в первичный для каждого первичного фрагмента, который был на узле 5.
- Мастер записывает сообщение о задержке распределения неназначенных фрагментов и на какой срок.
- Кластер остаётся в жёлтом состоянии, так как есть неназначенные фрагменты реплик.
- Узел 5 возвращается через несколько минут, прежде чем истечёт
timeout. - Отсутствующие реплики перераспределяются на узел 5 (и синхронизированные фрагменты восстанавливаются практически мгновенно).
Этот параметр не повлияет на преобразование реплик в первичные, а также не повлияет на назначение реплик, которые не были назначены ранее. В частности, задержка распределения не вступает в силу после полного перезапуска кластера. Кроме того, в случае переключения мастера время задержки забывается (то есть сбрасывается до полного начального значения).
Отмена перемещения фрагментов
Если время задержки распределения истечёт, мастер назначит отсутствующие фрагменты другому узлу, который начнёт восстановление. Если отсутствующий узел присоединится к кластеру, и его фрагменты по-прежнему имеют тот же идентификатор синхронизации, что и первичные, перемещение фрагментов будет отменено, и синхронизированный фрагмент будет использован для восстановления вместо него.
По этой причине значение по умолчанию timeout установлено всего на одну минуту: даже если перемещение фрагментов начнётся, отмена восстановления в пользу синхронизированного фрагмента будет несложной.
Мониторинг задержанных неназначенных фрагментов
Количество фрагментов, распределение которых задерживается с помощью этого параметра таймаута, можно увидеть с помощью API состояния кластера:
GET _cluster/health
| Этот запрос вернёт значение |
Постоянное удаление узла
Если узел не собирается возвращаться, и вы хотите, чтобы Elasticsearch сразу распределил отсутствующие фрагменты, просто установите таймаут в ноль:
PUT _all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "0"
}
} Вы можете сбросить таймаут, как только отсутствующие фрагменты начнут восстанавливаться.
© 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/7.17/delayed-allocation.html