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

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

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

간략한 설명

이 오류는 키가 동일한 노드가 아니라, 동일한 해시 슬롯에 있어야 하기 때문에 발생합니다. 샤딩된 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"

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


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?