인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

caolian2003님의 프로필 이미지

작성한 질문수

대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [이론편]

Script을 활용한 Redis Atomic 처리하는 방법

Redis의 클러스터 동작 방식 ( Hash Slot과 관련 )

해결된 질문

작성

·

82

0

강의를 들으면서 제가 아는 해시 테이블의 개념과 조금 헷갈려서 질문을 남깁니다.

 

일반적으로 해시 테이블은 특정한 값이 들어오면 어떤 연산을 통해 해싱을 합니다. 그리고 해싱된 값을 통해 이 데이터가 어떠한 버킷의 어떤 슬롯에 담기는지를 정하게 됩니다.

그리고 여기에서 논리적으로 해시충돌이 일어나면 이를 해결할 수 있습니다. 여기에서는 데이터가 실제로 담기기 때문에 이러한 충돌이 발생할 수 있고 해결 또한 해야하죠.

 

근데 Redis의 클러스터에서는 어떤 데이터가 들어온다면 모듈러 연산을 통해 얻은 해시 값이 특정 노드에 속하는지를 판단한다고 강의를 들었습니다.

예) 노드 A : 0~ 4819 노드 B: 4820~16383

이 때 해싱을 통해 얻은 값이 4819라면 해당 데이터는 노드A에 속하게 되고 노드A에 연결된 DB에 데이터가 저장이 되겠죠 ?

( DB의 Cluster 구동 방식을 검색해보니 각각의 노드마다 DB를 별도로 샤용한다고 했습니다. )

이 때 해쉬 슬롯은 단순히 너는 노드A로 가라. 너는 노드B로 가라 라고 연결다리 역할만 하는건지 궁금합니다.


실제로 해쉬 슬롯은 노드를 나누기 위한 논리적인 숫자에 불과하며 실제 슬롯에는 그 어떠한 값도 저장하고 있지 않는 것인지가 너무 헷갈립니다.. 제가 해쉬 테이블의 개념만 너무 생각해서 그런건지 잘 모르겠습니다 ..

답변 4

0

Hong님의 프로필 이미지
Hong
지식공유자

해시슬롯은 일반적으로 해당 데이터의 위치를 지정하는 역할을 수행합니다.

 

역인덱스의 구조를 대입해 보시면 좀 더 이해하시기 편할꺼 같아요.

내가 찾고자 하는 데이터는 여기에 저장을 할테니깐 여기는 이 데이터가 보관되어 있다라는 의미로만 사용이 된다고 보시면 됩니다.

 

그래서 보통 다음과 같은 흐름으로 동작을 합니다.

 

  1. X라는 키를 저장한다.

  2. 해당 키는 해싱 함수를 거치고 나누기 연산을 통해서 특정 해시슬롯 값에 저장이 된다.

  3. 이 후 X라는 키를 조회한다.

  4. 클러스터는 기본적으로 해시슬롯을 통해서 해당 키가 어떤 슬롯에 있는지를 확인한다.

  5. 발견을 하게 된다면, 해당 슬롯을 관리하고 있는 클러스터를 호출한다.

  6. 호출된 클러스터는 해당 값을 제공한다.

 

이런식으로 사용이 된다고 보시면 됩니다.

잠시 명절 기간이라서 답변이 늦었는데 확인 부탁드리고 혹시라도 제가 잘못 이해하였거나 추가적인 질문이 있다면 남겨주시면 감사하겠습니다.

0

caolian2003님의 프로필 이미지
caolian2003
질문자

또 개념적으로는 하나의 버킷 = 하나의 노드 라고 생각해도 무방하겠죠 ?
물론 엄밀히 자료구조 관점에서 본다면, 버킷은 실제 데이터를 저장하는 하나의 큰 공간이니 노드와 같다고 볼 수는 없다고 생각하긴 합니담. 왜냐하면 실제로 16384개의 해쉬 슬롯은 단순히 연결 역할만 하고 실제로 데이터를 담는 인스턴스는 자신만의 DB가 있으니까 말이죠.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. caolian2003님.

Redis의 클러스터는 분산 환경에서 데이터를 효율적으로 관리하기 위한 메커니즘을 제공합니다. 질문하신 해시 슬롯(Hash Slot)은 Redis 클러스터에서 어떻게 노드를 나누고 데이터를 분산시키는지를 이해하는 핵심 요소입니다.

해시 슬롯의 역할

  • 해시 슬롯과 노드 매핑: Redis 클러스터에서는 전체 키 공간을 16384개의 해시 슬롯으로 나눕니다. 각 슬롯은 하나의 노드에 매핑되며, 데이터의 키는 이 슬롯 중 하나에서 결정됩니다.

  • 해싱과 모듈러 연산: 데이터의 키를 CRC16 해시 함수로 처리하여 해시 코드로 변환한 후, 16384로 나눈 나머지를 통해 어느 해시 슬롯에 속하는지 결정합니다. 해당 슬롯 번호는 클러스터 내의 특정 노드로 맵핑되어, 데이터가 저장될 노드를 선택하게 됩니다.

  • 기능적 역할: 해시 슬롯은 기본적으로 데이터가 저장될 노드를 결정하는 ‘경로’ 역할을 하며, 실제 데이터를 담고 있지는 않습니다. 여기서 해시테이블에서의 해시 충돌과는 다르게 충돌 관리 개념이 없습니다. 대신 키의 위치를 결정하여 노드 간에 데이터를 균등하게 분산합니다.

이를 통해 Redis는 데이터가 균등하게 분산되도록 보장하고, 노드의 추가나 제거 시에도 데이터의 재분배가 용이하여 고가용성을 유지하는 기능성을 제공합니다.

아래의 링크에서는 Redis 클러스터와 관련된 내용을 더욱 자세히 논의하여 도움을 줄 수 있는 답변을 확인할 수 있습니다:

질문해 주신 내용처럼 해시 슬롯은 단순히 해싱을 통해 노드를 결정하기 위한 논리적인 매개체일 뿐이며, 그 내에 어떠한 데이터도 저장하지 않습니다. Hash Slot의 이해에 대한 혼란이 줄어들기를 바라며, 추가적으로 궁금한 점에 대해 언제든지 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

caolian2003님의 프로필 이미지
caolian2003
질문자

또 개념적으로는 하나의 버킷 = 하나의 노드 라고 생각해도 무방하겠죠 ?
물론 엄밀히 자료구조 관점에서 본다면, 버킷은 실제 데이터를 저장하는 하나의 큰 공간이니 노드와 같다고 볼 수는 없다고 생각하긴 합니담. 왜냐하면 실제로 16384개의 해쉬 슬롯은 단순히 연결 역할만 하고 실제로 데이터를 담는 인스턴스는 자신만의 DB가 있으니까 말이죠.

0

caolian2003님의 프로필 이미지
caolian2003
질문자

이게 슬롯에 데이터를 저장한다는 고정관념이 머릿 속에 박혀있으니까 해시 충돌이 일어나면 어떻게 해결하는지부터 머릿속에서 정리가 안되더라구요.. 그래서 생각하다 생각하다 나온 결론이 저겁니다..