Spec-Zone.ru › Redis

CLUSTER

CLUSTER FAILOVER
Синтаксис
CLUSTER FAILOVER [FORCE | TAKEOVER]
Доступно с версии:
3.0.0
Сложность по времени:
O(1)
Категории ACL:
@admin, @slow, @dangerous,

Эта команда, которую можно отправлять только на реплику узла Redis Cluster, заставляет реплику начать ручное переключение своего мастер-узла.

Ручное переключение — это особый вид переключения, который обычно выполняется, когда фактических сбоев нет, но мы хотим безопасно заменить текущего мастера одной из его реплик (узлом, которому мы отправляем команду), без каких-либо прерываний в работе и потери данных. Оно работает следующим образом:

  1. Реплика сообщает мастеру остановить обработку запросов от клиентов.
  2. Мастер отвечает реплике текущим смещением репликации.
  3. Реплика ожидает, пока смещение репликации совпадет с её стороной, чтобы убедиться, что она обработала все данные с мастера, прежде чем продолжить.
  4. Реплика запускает переключение, получает новую эпоху конфигурации от большинства мастеров и транслирует новую конфигурацию.
  5. Старый мастер получает обновление конфигурации: разблокирует своих клиентов и начинает отвечать сообщениями перенаправления, чтобы они продолжили взаимодействие с новым мастером.

Таким образом, клиенты переключаются со старого мастера на нового мастера атомарно и только тогда, когда реплика, которая превращается в нового мастера, обработала весь поток репликации со старого мастера.

Вариант FORCE: ручное переключение при отключении мастера

Поведение команды можно изменить с помощью двух вариантов: FORCE и TAKEOVER.

Если задан вариант FORCE, реплика не выполняет никакого рукопожатия с мастером, который может быть недоступен, а вместо этого сразу начинает переключение с пункта 4. Это полезно, когда мы хотим начать ручное переключение, пока мастер больше недоступен.

Однако, для использования FORCE все равно необходимо, чтобы большинство мастеров были доступны, чтобы авторизовать переключение и сгенерировать новую эпоху конфигурации для реплики, которая станет мастером.

Вариант TAKEOVER: ручное переключение без согласования кластера

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

Вариант TAKEOVER подразумевает всё, что подразумевает FORCE, но также не использует авторизацию кластера для переключения. Реплика, получившая CLUSTER FAILOVER TAKEOVER, вместо этого:

  1. Генерирует новую configEpoch единолично, просто взяв текущую наибольшую доступную эпоху и увеличив её, если её локальная эпоха конфигурации ещё не является наибольшей.
  2. Назначает себе все хеш-слоты своего мастера и распространяет новую конфигурацию на каждый доступный узел как можно быстрее, и в конечном итоге на каждый другой узел.

Обратите внимание, что TAKEOVER нарушает принцип последнего переключения в Redis Cluster, поскольку эпоха конфигурации, сгенерированная репликой, нарушает обычное формирование эпох конфигурации по нескольким причинам:

  1. Нет гарантии, что это фактически самая высокая эпоха конфигурации, поскольку, например, мы можем использовать TAKEOVER в меньшинстве, и не происходит никакого обмена сообщениями для генерации новой эпохи конфигурации.
  2. Если мы сгенерируем эпоху конфигурации, которая совпадает с другой установкой, в конечном счёте наша эпоха конфигурации или эпоха другой установки с нашей эпохой будет удалена с использованием алгоритма разрешения коллизий эпох конфигурации.

Поэтому вариант 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API