Redis(클러스터 모드 활성화됨) ElastiCache 클러스터에서 다중 키 작업을 수행하는 동안 "요청의 CROSSSLOT 키가 동일한 슬롯을 해시하지 않음(CROSSSLOT Keys in request don't hash to the same slot)" 오류가 발생하는 이유는 무엇입니까?

최종 업데이트 날짜: 2020년 2월 13일

Amazon ElastiCache for Redis 클러스터(클러스터 모드 활성화)에서 다중 키 작업을 수행하는 중에 키가 동일한 노드에 저장되었어도 "요청의 CROSSSLOT 키가 동일한 슬롯을 해시하지 않음(CROSSSLOT Keys in request don't hash to the same slot)" 오류가 발생하는 이유는 무엇입니까?

간략한 설명

키가 동일한 노드만이 아닌 동일한 해시 슬롯에도 있어야 하므로 이 오류가 발생합니다. 샤딩된 Redis ElastiCache 클러스터(클러스터 모드 활성화됨)에서 다중 키 작업을 구현하려면 키는 동일한 해시 슬롯으로 해시되어야 합니다. 해시 태그를 사용하여 키를 동일한 해시 슬롯에 강제로 배치할 수 있습니다.

이 예제에서는 "myset2" 및 "myset" 세트가 동일한 노드에 있습니다.

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

그러나 다중 키 작업은 지원되지 않습니다.

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

키가 동일한 해시 슬롯에 있지 않기 때문입니다. 이 예제에서는 두 개 세트가 서로 다른 슬롯, 560 및 7967에 있습니다.

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

해결 방법

방법 1

Redis(클러스터 모드 활성화) 클러스터에 대한 지원을 제공하는 Redis 클라이언트 라이브러리를 사용할 수 있습니다. Redis 클러스터에 대한 자세한 내용은 redis-py-cluster 웹 사이트를 참조하십시오.

예를 들어 redis-cli를 사용하면 다른 샤드에 있는 슬롯에서 키를 가져오는 데 사용할 때 CROSSSLOT 오류가 반환됩니다.

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

redis-py-cluster를 사용하여 다른 샤드에 있는 슬롯에서 키를 가져오면 올바른 출력이 반환됩니다.

>>> 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"))

방법 2

클러스터 모드가 활성화된 클러스터에서 다중 키 작업에 사용되는 키를 생성할 때 해시 태그를 사용하여 키를 동일한 해시 슬롯에 강제로 넣습니다. 키에 "{...}" 패턴이 포함된 경우 괄호, "{" and "}" 사이의 하위 문자열만 해시 슬롯을 확보하도록 해시됩니다.

예를 들어, {user1}:myset{user1}:myset2 키는 동일한 해시 슬롯으로 해시됩니다. 괄호, "{" and "}" 내부의 문자열만(즉, "user1") 사용하여 해시 슬롯을 계산하기 때문입니다.

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"

두 세트가 모두 동일한 해시 슬롯에 해시되므로 다중 키 작업을 수행할 수 있습니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?