Ir para o conteúdo

Como resolvo o erro CROSSSLOT que recebo quando uso operações com várias chaves em um cluster autoprojetado pelo ElastiCache (Redis OSS)?

3 minuto de leitura
0

Quero usar operações com várias chaves em um cluster autoprojetado do Amazon ElastiCache (Redis OSS) com o modo de cluster ativado. Mas recebo o erro “CROSSSLOT Keys in request don’t hash to the same slot”.

Breve descrição

Você recebe o erro a seguir quando suas chaves não estão no mesmo slot de hash, mesmo estando armazenadas no mesmo nó:

“CROSSSLOT Keys in request don't hash to the same slot”

Para implementar operações com várias chaves em um cluster ElastiCache (Redis OSS) fragmento com o modo de cluster ativado, faça o hash das chaves no mesmo slot de hash.

Nos conjuntos de exemplos a seguir, “myset2” e “myset” estão no mesmo nó:

172.31.62.135:6379> scan 0
1) "0"
2)  1) "myset"
    2) "myset2"

Mas uma operação com várias chaves não é suportada:

172.31.62.135:6379> SUNION myset myset2(error) CROSSSLOT Keys in request don't hash to the same slot

Essa operação não é suportada porque as chaves não estão no mesmo slot de hash. Os dois conjuntos estão em dois slots diferentes, 560 e 7967:

172.31.62.135:6379> CLUSTER KEYSLOT myset(integer) 560
172.31.62.135:6379> CLUSTER KEYSLOT myset2(integer) 7967

Resolução

Método 1

É possível usar uma biblioteca de cliente do Redis que fornece suporte para clusters do Redis com o modo de cluster ativado. Para obter mais informações, consulte a especificação do cluster Redis no site do Redis.

O exemplo a seguir usa redis-cli para obter chaves de slots localizados em fragmentos diferentes. Isso resulta em um erro CROSSSLOT:

redis-cli -c -h RedisclusterCfgEndpointRedisclusterCfgEndpoint:6379> mget key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot

Ao usar o redis-py-cluster para obter chaves de slots localizados em fragmentos diferentes, você recebe a saída correta:

>>> from rediscluster import RedisCluster>>> startup_nodes = [{"host": "RedisclusterCfgEndpoint", "port": "6379"}]
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True,skip_full_coverage_check=True)
>>> print(rc.mget("key1","key2"))

Método 2

Ao criar chaves para operações com várias chaves em um cluster que tem o modo de cluster ativado, force as chaves para o mesmo slot de hash. É possível usar hashtags para forçar as chaves a entrarem no mesmo espaço de hash. Quando a chave contém um {...} padrão, somente a substring entre as chaves, { e }, é criptografada para calcular o slot de hash.

Veja a seguir um exemplo de vários conjuntos com hash no mesmo slot de hash. As chaves {user1}:myset e {user1}:myset2 são codificadas no mesmo slot de hash. Somente o usuário1 é usado para calcular o slot de hash.

172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset(integer) 8106
172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset2
(integer) 8106

172.31.62.135:6379> SUNION {user1}:myset {user1}:myset2
1) "some data for myset"
2) "some data for myset2"

Depois de fazer o hash de ambos os conjuntos no mesmo slot de hash, é possível realizar uma operação com várias chaves.

AWS OFICIALAtualizada há 2 anos