Redis: почему ПЕРЕЕХАЛ на другой мастер

У меня есть кластер Redis - 3 мастера и 3 раба. Этот кластер содержит ~300 ключей (foo0 - foo300). Я понимаю, что каждый мастер отвечает за определенное подмножество данных и может перенаправить клиента на правильный узел с ошибкой MOVED.

Но если я отправлю запрос на получение несуществующих ключей (например, klsdkaso, qwerty123 ...) от мастера, я также переместился на другой узел . Я смущен. Кто может объяснить, почему так?


person c ccx    schedule 22.02.2018    source источник


Ответы (2)


Ключ, независимо от того, существует он на самом деле или нет, отображается путем хэширования его имени (или его частей, т. е. тегов) в слот. Слоты назначаются мастерам, и мастер сначала проверяет «принадлежность» ему ключа (с точки зрения текущих назначений диапазонов слотов) и только потом выполняет какие-либо другие операции.

person Itamar Haber    schedule 22.02.2018

Чтобы было понятно, давайте определим два вида мастер-узлов:

  1. Подключенный узел: узел, к которому подключается ваш клиент, и вы отправляете GET команду этому узлу.
  2. Узел назначения: узел, в котором ДОЛЖЕН находиться указанный ключ, т. е. тот, на который вы перенаправлены или перемещены.

Поскольку Подключенный узел имеет только информацию о сопоставлении слотов, то есть данный ключ ДОЛЖЕН находиться на Узле назначения. Однако он НЕ знает, существует ли данный ключ на узле назначения.

Таким образом, подключенный узел должен сначала перенаправить клиента на узел назначения, т. е. использовать сообщение об ошибке MOVED, чтобы предоставить информацию об IP-адресе и порте на узле назначения< /сильный>. Затем клиент отправляет еще одну команду GET на ноду назначения, чтобы проверить, действительно ли существует данный ключ.

person for_stack    schedule 22.02.2018