CLUSTER
CLUSTER SETSLOT
CLUSTER SETSLOT slot <IMPORTING node-id | MIGRATING node-id | NODE node-id | STABLE>
- Доступно с версии:
- 3.0.0
- Временная сложность:
- O(1)
- Категории ACL:
-
@admin,@slow,@dangerous,
CLUSTER SETSLOT отвечает за изменение состояния слота хэша в узле-получателе различными способами. В зависимости от используемой подкоманды, она может:
-
MIGRATINGподкоманда: Установить слот хэша в состояние перемещения. -
IMPORTINGподкоманда: Установить слот хэша в состояние импорта. -
STABLEподкоманда: Очистить состояние импорта/перемещения из слота хэша. -
NODEподкоманда: Связать слот хэша с другим узлом.
Команда с набором подкоманд полезна для запуска и завершения операций решардинга кластера в реальном времени, которые выполняются путем установки слота хэша в состояние перемещения в узле-источнике и состояния импорта в узле-получателе.
Каждая подкоманда документирована ниже. В конце вы найдете описание того, как выполняется решардинг кластера в реальном времени с использованием этой команды и других связанных команд.
CLUSTER SETSLOT <slot> ПЕРЕМЕЩЕНИЕ <destination-node-id>
Эта подкоманда устанавливает слот в состояние перемещения. Для установки слота в это состояние узел, получающий команду, должен быть владельцем слота хэша, в противном случае возвращается ошибка.
Когда слот устанавливается в состояние перемещения, поведение узла меняется следующим образом:
- Если получена команда об уже существующем ключе, она обрабатывается как обычно.
- Если получена команда об отсутствующем ключе, узел отправляет перенаправление
ASK, прося клиента повторить запрос только для этого конкретного запроса вdestination-node. В этом случае клиент не должен обновлять сопоставление слотов хэша с узлами. - Если команда содержит несколько ключей, если ни один не существует, поведение такое же, как в пункте 2. Если все существуют, поведение такое же, как в пункте 1. Однако, если существует только частичное количество ключей, команда возвращает ошибку
TRYAGAIN, чтобы ключи, которые необходимо перенести в целевой узел, закончили перемещение, чтобы команда с несколькими ключами могла быть выполнена.
CLUSTER SETSLOT <slot> ИМПОРТИРОВАНИЕ <source-node-id>
Эта подкоманда является обратной MIGRATING, и подготавливает узел-получатель к импорту ключей из указанного узла-источника. Команда работает только в том случае, если узел не является уже владельцем указанного слота хэша.
Когда слот устанавливается в состояние импорта, поведение узла меняется следующим образом:
- Команды, относящиеся к этому слоту хэша, отклоняются, и генерируется перенаправление
MOVED, как обычно, но если команда следует за командойASKING, в этом случае команда выполняется.
Таким образом, когда узел в состоянии перемещения генерирует перенаправление ASK, клиент обращается к целевому узлу, отправляет ASKING, а сразу после этого отправляет команду. Таким образом, команды об отсутствующих ключах в старом узле или ключах, уже перенесенных в целевой узел, выполняются в целевом узле, так что:
- Новые ключи всегда создаются в целевом узле. Во время миграции слотов хэша нам нужно будет переместить только старые ключи, а не новые.
- Команды о ключах, которые уже были перенесены, правильно обрабатываются в контексте узла, который является целью миграции, нового владельца слота хэша, для обеспечения согласованности.
- Без
ASKINGповедение такое же, как обычно. Это гарантирует, что клиенты с поврежденным сопоставлением слотов хэша не будут писать ошибки в целевой узел, создавая новую версию ключа, который еще не был перенесен.
CLUSTER SETSLOT <slot> УСТОЙЧИВЫЙ
Эта подкоманда просто очищает состояние перемещения/импорта из слота. Она в основном используется для исправления кластера, застрявшего в неправильном состоянии из-за redis-cli --cluster fix. Обычно оба состояния очищаются автоматически в конце миграции с помощью подкоманды SETSLOT ... NODE ..., как объясняется в следующем разделе.
CLUSTER SETSLOT <slot> УЗЕЛ <node-id>
Подкоманда NODE имеет наиболее сложную семантику. Она связывает слот хэша с указанным узлом, однако команда работает только в определенных ситуациях и имеет разные побочные эффекты в зависимости от состояния слота. Ниже приведен набор предварительных условий и побочных эффектов команды:
- Если текущий владелец слота хэша — узел, получающий команду, но в результате выполнения команды слот будет назначен другому узлу, команда вернет ошибку, если в узле, получающем команду, все еще есть ключи для этого слота хэша.
- Если слот находится в состоянии перемещения, состояние очищается, когда слот назначается другому узлу.
- Если слот находился в состоянии импорта в узле, получающем команду, и команда назначает слот этому узлу (что происходит в целевом узле в конце решардинга слота хэша из одного узла в другой), команда имеет следующие побочные эффекты: A) состояние импорта очищается. B) Если эпоха конфигурации узла не является самой большой в кластере, она генерирует новую эпоху и назначает новую эпоху конфигурации себе. Таким образом, ее новое владение слотом хэша будет превосходить любую предыдущую конфигурацию, созданную предыдущими сбоями или миграциями слотов.
Важно отметить, что шаг 3 — единственный случай, когда узел Redis Cluster создаст новую эпоху конфигурации без согласования с другими узлами. Это происходит только при ручном конфигурировании. Однако невозможно, чтобы это создало непостоянную ситуацию, где у двух узлов одинаковая эпоха конфигурации, так как Redis Cluster использует алгоритм разрешения коллизий эпохи конфигурации.
Возврат
Простой строковый ответ: Все подкоманды возвращают OK если команда выполнена успешно. В противном случае возвращается ошибка.
Объяснение решардинга кластера Redis в реальном времени
Команда CLUSTER SETSLOT — важная часть, используемая Redis Cluster для миграции всех ключей, содержащихся в одном слоте хэша, из одного узла в другой. Вот как организуется миграция, с помощью других команд. Будем называть узел, который имеет текущее владение слотом хэша, узлом source, а узел, в который мы хотим мигрировать ключи, узлом destination.
- Установите слот целевого узла в состояние импорта, используя
CLUSTER SETSLOT <slot> IMPORTING <source-node-id>. - Установите слот узла-источника в состояние перемещения, используя
CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>. - Получите ключи из узла-источника с помощью команды
CLUSTER GETKEYSINSLOTи перенесите их в узел-получатель с помощью командыMIGRATE. - Отправьте
CLUSTER SETSLOT <slot> NODE <destination-node-id>в узел-получатель. - Отправьте
CLUSTER SETSLOT <slot> NODE <destination-node-id>в узел-источник. - Отправьте
CLUSTER SETSLOT <slot> NODE <destination-node-id>в другие узлы-мастера (необязательно).
Примечания:
- Порядок шагов 1 и 2 важен. Мы хотим, чтобы целевой узел был готов принимать перенаправления
ASK, когда узел-источник настроен на отправку перенаправлений. - Порядок шагов 4 и 5 важен. Целевой узел отвечает за распространение изменения в остальной части кластера. Если узел-источник получает информацию до узла-получателя, и узел-получатель выходит из строя до того, как он устанавливается новым владельцем слота, слот остается без владельца, даже после успешного восстановления.
- Шаг 6, отправка
SETSLOTв узлы, не участвующие в решардинге, технически не является необходимым, так как конфигурация в конечном итоге распространится сама. Однако это хорошая идея, чтобы как можно скорее остановить узлы от указания на неправильный узел для перемещенного слота хэша, что приведет к меньшему количеству перенаправлений для поиска нужного узла.
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/cluster-setslot/