Как кластер Redis с одним осколком может выдавать ошибки CROSSSLOT?

Я не понимаю, как кластер Redis с одним осколком может привести к ошибке CROSSSLOT. Согласно документации, эта ошибка возникает, когда вы запускаете команду, которая воздействует на несколько ключей, которые не все находятся в одном и том же слоте хэша (то есть в узле в защищенной среде). Учитывая, что один осколок имеет только один слот; 0-16383 - и, следовательно, все данные - как это может произойти?

В моем случае у меня есть один осколок с одной репликой чтения (раб).

Я обошел проблему, используя хеш-теги, как описано здесь: https://redis.io/topics/cluster-spec - однако это не отвечает на вопрос.

Это вывод от узлов кластера:

e51c5f84e60116be3cb9d6734fc0c4deb1fde4c4 172.31.6.149:6379@1122 slave c07ed67b7df1a9d4475702c944a43ad38c6954ba 0 1531143884198 1 connected
c07ed67b7df1a9d4475702c944a43ad38c6954ba 172.31.21.122:6379@1122 myself,master - 0 0 1 connected 0-16383

Я могу воспроизвести ошибку следующим образом:

telnet 172.31.21.122 6379

SETEX redis-test-1 3600 whatever
+OK
SETEX redis-test-2 3600 whatever
+OK

KEYS redis-test*
*2
$12
redis-test-2
$12
redis-test-1

DEL redis-test-1 redis-test-2
-CROSSSLOT Keys in request don't hash to the same slot

2 ответа

Это меня тоже смутило. Код Redis требует, чтобы ключи хешировались в одном и том же слоте (а не в одном и том же узле), и я не понимаю, почему это так, поскольку спецификация кластера говорит следующее (выделено мое):

Redis Cluster реализует все команды с одним ключом, доступные в нераспределенной версии Redis. Команды, выполняющие сложные многоключевые операции, такие как объединения или пересечения типа Set, реализуются так же, как все ключи принадлежат одному и тому же узлу.

Я открыл вопрос о GH: https://github.com/antirez/redis/issues/5118

Учитывая, что один осколок имеет только один слот; 0-16383

Этот единственный осколок содержит все 16384 слота, каждый из которых является "одним"...

Другие вопросы по тегам