CLUSTER
CLUSTER FAILOVER
CLUSTER FAILOVER [FORCE | TAKEOVER]
- Доступно с версии:
- 3.0.0
- Сложность по времени:
- O(1)
- Категории ACL:
-
@admin,@slow,@dangerous,
Эта команда, которую можно отправлять только на реплику узла Redis Cluster, заставляет реплику начать ручное переключение своего мастер-узла.
Ручное переключение — это особый вид переключения, который обычно выполняется, когда фактических сбоев нет, но мы хотим безопасно заменить текущего мастера одной из его реплик (узлом, которому мы отправляем команду), без каких-либо прерываний в работе и потери данных. Оно работает следующим образом:
- Реплика сообщает мастеру остановить обработку запросов от клиентов.
- Мастер отвечает реплике текущим смещением репликации.
- Реплика ожидает, пока смещение репликации совпадет с её стороной, чтобы убедиться, что она обработала все данные с мастера, прежде чем продолжить.
- Реплика запускает переключение, получает новую эпоху конфигурации от большинства мастеров и транслирует новую конфигурацию.
- Старый мастер получает обновление конфигурации: разблокирует своих клиентов и начинает отвечать сообщениями перенаправления, чтобы они продолжили взаимодействие с новым мастером.
Таким образом, клиенты переключаются со старого мастера на нового мастера атомарно и только тогда, когда реплика, которая превращается в нового мастера, обработала весь поток репликации со старого мастера.
Вариант FORCE: ручное переключение при отключении мастера
Поведение команды можно изменить с помощью двух вариантов: FORCE и TAKEOVER.
Если задан вариант FORCE, реплика не выполняет никакого рукопожатия с мастером, который может быть недоступен, а вместо этого сразу начинает переключение с пункта 4. Это полезно, когда мы хотим начать ручное переключение, пока мастер больше недоступен.
Однако, для использования FORCE все равно необходимо, чтобы большинство мастеров были доступны, чтобы авторизовать переключение и сгенерировать новую эпоху конфигурации для реплики, которая станет мастером.
Вариант TAKEOVER: ручное переключение без согласования кластера
Есть ситуации, когда этого недостаточно, и мы хотим, чтобы реплика переключилась без согласия с остальной частью кластера. Практический пример — массовое назначение реплик в другом дата-центре мастерами для переключения дата-центров, пока все мастера отключены или изолированы.
Вариант TAKEOVER подразумевает всё, что подразумевает FORCE, но также не использует авторизацию кластера для переключения. Реплика, получившая CLUSTER FAILOVER TAKEOVER, вместо этого:
- Генерирует новую
configEpochединолично, просто взяв текущую наибольшую доступную эпоху и увеличив её, если её локальная эпоха конфигурации ещё не является наибольшей. - Назначает себе все хеш-слоты своего мастера и распространяет новую конфигурацию на каждый доступный узел как можно быстрее, и в конечном итоге на каждый другой узел.
Обратите внимание, что TAKEOVER нарушает принцип последнего переключения в Redis Cluster, поскольку эпоха конфигурации, сгенерированная репликой, нарушает обычное формирование эпох конфигурации по нескольким причинам:
- Нет гарантии, что это фактически самая высокая эпоха конфигурации, поскольку, например, мы можем использовать TAKEOVER в меньшинстве, и не происходит никакого обмена сообщениями для генерации новой эпохи конфигурации.
- Если мы сгенерируем эпоху конфигурации, которая совпадает с другой установкой, в конечном счёте наша эпоха конфигурации или эпоха другой установки с нашей эпохой будет удалена с использованием алгоритма разрешения коллизий эпох конфигурации.
Поэтому вариант TAKEOVER следует использовать с осторожностью.
Подробности реализации и замечания
-
CLUSTER FAILOVER, если не указан вариант TAKEOVER, не выполняет переключение синхронно. Он только планирует ручное переключение, минуя этап обнаружения сбоев. - Ответ
OKне гарантирует, что переключение пройдёт успешно. - Реплика может быть повышена до мастера только если она известна как реплика большинством мастеров в кластере. Если реплика — новый узел, который был только что добавлен в кластер (например, после обновления), она может быть ещё неизвестна всем мастерам в кластере. Чтобы проверить, что мастера знают о новой реплике, можно отправить
CLUSTER NODESилиCLUSTER REPLICASкаждому из мастер-узлов и проверить, что она отображается как реплика, прежде чем отправлятьCLUSTER FAILOVERреплике. - Чтобы проверить, что переключение действительно произошло, можно использовать
ROLE,INFO REPLICATION(что указывает «роль:мастер» после успешного переключения) илиCLUSTER NODES, чтобы проверить, что состояние кластера изменилось в какой-то момент после отправки команды. - Чтобы проверить, закончилось ли переключение неудачно, проверьте журнал реплики на наличие сообщения «Ручное переключение истекло», которое записывается, если реплика прекратила попытку через несколько секунд.
Возвращаемое значение
Ответ в виде простой строки: OK если команда была принята и будет попытка ручного переключения. Ошибка, если операция не может быть выполнена, например, если мы общаемся с узлом, который уже является мастером.
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/cluster-failover/