Как кластер 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 слота, каждый из которых является "одним"...