[코틀린/스프링] 스프링 레디스 데이터

레디스 클러스터

레디스는 클러스터 모드에서 해시 슬롯(hash slot)을 사용하여 데이터를 분산 저장한다. 레디스 클러스터에는 16384개의 해시 슬롯이 있으며, CRC16을 알고리즘을 사용하여 주어진 키의 해시를 계산한다. 클러스터의 모든 노드는 해시 슬롯의 서브셋(subset)이 된다. 예를 들어 노드가 3개인 클러스터에서 노드 A는 0에서 5500까지의 해시 슬롯이, 노드 B에는 5501에서 11000까지의 해시 슬롯이, 노드 C에는 11001에서 16383까지의 해시 슬롯이 할당되며, 클러스터 노드가 추가 또는 삭제될 때 해시 슬롯이 노드 간 이동하여 다시 할당된다. 레디스 클러스터는 모든 키가 동일한 해시 슬롯에 있는 데이터에 대한 조회 및 저장 명령만을 지원한다. SET 명령어를 사용하여 데이터 저장 시 레디스 클러스터는 자동으로 데이터를 분산하여 저장하며 GET 명령어를 사용하여 데이터 조회 시 키의 해시 값을 계산하여 해당 키가 할당된 해시 슬롯을 찾고 해당 슬롯이 할당된 노드를 찾은 후 그 노드에 쿼리를 전송한다.

레디스 클러스터는 비분산 버전의 레디스 사용할 수 있는 모든 단일 키(single key) 명령을 구현한다. 집합 유니온 및 교집합과 같은 복잡한 다중 키(multi key) 연산을 수행하는 명령은 연산에 관련된 모든 키가 동일한 슬롯에 해시되는 경우에 대해서만 구현된다. MSET이나 MGET 명령어를 사용하여 여러 데이터를 한 번에 저장 및 조회하는 경우에도 모든 데이터는 같은 노드에 위치해야 한다. 레디스 클러스터는 특정 키를 동일한 해시 슬롯에 강제로 저장하기 위해 해시 태그(hash tag)라는 개념을 구현한다.

레디스 클러스터 환경에서 MGET 명령어를 사용하여 여러 키에 대한 값을 가져오는 경우 주의가 필요하다. 클러스터 환경에서 데이터가 서로 다른 노드에 분산 저장되어 있다면, MGET 명령어 사용 시 조회하려는 데이터가 서로 다른 노드에 존재하는 경우 조회 명령이 실패하며 크로스 슬롯(cross-slot) 에러가 발생한다. 크로스 슬롯 에러란 레디스 클러스터 환경에서 발생하는 특정 오류로, 여러 키가 서로 다른 해시 슬롯에 위치할 때 발생한다. MSET 명령어도 동일하다. MSET 명령어는 레디스 클러스터에서 동일한 해시 슬롯에 데이터를 저장하며 결과적으로 동일한 노드에 저장한다. 서로 다른 노드에 데이터를 저장할 수 없다. 따라서 MSET을 사용하여 서로 다른 슬롯에 데이터를 저장하려고 하면 크로스 슬롯 에러가 발생하고 명령이 실패한다. 즉, MGET이나 MSET 명령어를 사용하는 경우 모든 키는 동일한 노드의 해시 슬롯에 있어야 한다. 서로 다른 슬롯에 위치한 키들을 한 번의 명령으로 처리하려고 하면 크로스 슬롯 에러가 발생하게 된다.

MSET 명령어를 사용하여 동일한 해시 슬롯에 저장된 데이터는 MGET 명령어를 사용하여 조회할 수 있다. 해시 태그를 사용하여 키들이 같은 슬롯에 위치하도록 하고 MSET 명령어로 데이터를 저장한 후 MGET 명령어로 해당 데이터를 조회할 수 있다.


해시 태그

해시 태그(hash tag)는 동일한 해시 슬롯에 여러 개의 키를 할당하는 방법이다. 레디스 클러스터에서 다중 키 명령을 구현하기 위해 사용된다. 레디스 클러스터에서 해시 태그를 사용하면 MSET, MGET 등의 다중 키 연산 수행 시 중괄호인 {} 안에 있는 문자열을 기반으로 해시 값을 계산하여, 여러 키가 동일한 해시 슬롯에 위치하도록 할 수 있다. 이를 통해 다중 키 연산 수행 시 모든 키가 같은 노드에 있도록 강제할 수 있다.

키에 {} 패턴이 포함된 경우 해시 슬롯을 얻기 위해 {} 사이의 하위 문자열만 해시되며, { 또는 } 쌍이 여러 개 존재하는 경우 특정 규칙에 따라 키를 해싱한다. 해시 태그 사용 시 주의할 점은 {} 안에 포함된 문자열이 일관되게 유지되어야 한다는 것이다. 그렇지 않으면 예상치 못한 해시 슬롯에 키가 할당되어 데이터가 클러스터의 서로 다른 노드로 분산될 수 있다.


참고

Comments