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

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

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

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

Это результат работы CLUSTER NODES:

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

person nickdnk    schedule 09.07.2018    source источник


Ответы (2)


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

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

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

person Jeff Jo    schedule 12.07.2018
comment
Я думаю, что причина, по которой мы не можем выполнять операции с несколькими ключами с ключами, которые не принадлежат одному и тому же слоту в режиме кластера, заключается в том, что вы не можете быть уверены в том, что ключи находятся внутри тот же узел. Это, конечно, всегда имеет место при использовании одного осколка, но кластер не предназначен для работы только с одним осколком. Вы можете внезапно разделить его на две части, и тогда у вас возникнут проблемы, если вы будете выполнять операции с несколькими клавишами с ключами, которые больше не находятся в одном узле. - person nickdnk; 14.07.2018

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

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

person Itamar Haber    schedule 11.07.2018
comment
Так казалось бы. Меня смутила разница между слотами и осколками. - person nickdnk; 14.07.2018