CLUSTER
CLUSTER MEET
CLUSTER MEET ip port [cluster-bus-port]
- Доступно с версии:
- 3.0.0
- Сложность по времени:
- O(1)
- Категории ACL:
-
@admin,@slow,@dangerous,
CLUSTER MEET используется для подключения различных узлов Redis с включённой поддержкой кластера в рабочем кластере.
Основная идея заключается в том, что узлы по умолчанию не доверяют друг другу и считаются неизвестными, чтобы избежать случайного объединения различных узлов кластера из-за ошибок системного администрирования или изменений сетевых адресов.
Таким образом, чтобы данный узел принял другой узел в список узлов, составляющих кластер Redis, существуют только два способа:
- Системный администратор отправляет команду
CLUSTER MEETдля принудительного установления связи между узлами. - Уже известный узел отправляет список узлов в разделе сплетен, о которых мы не знаем. Если принимающий узел доверяет отправляющему узлу как известному узлу, он обработает раздел сплетен и отправит рукопожатие узлам, которые всё ещё неизвестны.
Обратите внимание, что Redis Cluster должен образовать полную сеть (каждый узел соединён с каждым другим узлом), но для создания кластера нет необходимости отправлять все CLUSTER MEET команды, необходимые для образования полной сети. Важно отправить достаточно CLUSTER MEET сообщений, чтобы каждый узел мог достичь каждого другого узла через цепь известных узлов. Благодаря обмену информацией о сплетнях в пакетах сердечных ударов, недостающие связи будут созданы.
Таким образом, если мы соединяем узел A с узлом B через CLUSTER MEET, а B с C, то A и C найдут способ пожать друг другу руки и создать связь.
Ещё один пример: если мы представим кластер, образованный четырьмя узлами, которые называются A, B, C и D, мы можем отправить только следующий набор команд узлу A:
CLUSTER MEET B-ip B-portCLUSTER MEET C-ip C-portCLUSTER MEET D-ip D-port
В качестве побочного эффекта A знает и известен всем другим узлам, он будет отправлять разделы сплетен в пакетах сердечных ударов, что позволит каждому другому узлу создать связь друг с другом, сформировав полную сеть в считанные секунды, даже если кластер большой.
Более того, CLUSTER MEET не обязательно должен быть взаимным. Если я отправляю команду узлу A для присоединения узла B, мне не нужно отправлять её также и узлу B для присоединения узла A.
Если необязательный аргумент cluster_bus_port не указан, будет использовано значение по умолчанию порт + 10000.
Реализация деталей: пакеты MEET и PING
Когда данный узел получает сообщение CLUSTER MEET, узел, указанный в команде, ещё не знает узел, которому мы отправили команду. Поэтому для того, чтобы узел вынудил получателя принять его как доверенный узел, он отправляет пакет MEET вместо пакета PING. Эти два пакета имеют точно такой же формат, но первый заставляет получателя признать узел доверенным.
Возврат
Простой строковый ответ: OK если команда выполнена успешно. Если указанный адрес или порт неверны, возвращается ошибка.
История
- Начиная с версии Redis 4.0.0: добавлен необязательный аргумент
cluster_bus_port.
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/cluster-meet/