해시 클러스터에서의 해시 몰림
- 1 ~ 100, 101 ~ 200, 201 ~ 300 키 값이 한 구간에 몰리면 하나의 서버에만 부하가 받게 된다.
- 클러스터 내에 해시 서버가 추가 또는 삭제되는 경우 리밸런싱 작업이 전체적으로 일어나면서 데이터의 이동과 변경이 발생하게 되고 그 과정에서 사용성이 떨어질 수 있다
해시 클러스터 내에서 안정적인 해시 운영을 위한 방법으로 다양한 방법이 있지만 안정해시라는 개념을 통해 해시 클러스터 내에 해시 데이터를 안정적으로 관리한다.
안정 해시의 컨셉
- 안정 해시의 컨셉은 링이다
- 링에 의해 한방향으로 가까운 노드에 해시 값을 저장 또는 삭제한다
- 노드가 추가되면 링 위에 새로운 노드가 위치하고 한방향으로 가까운 노드만 리밸런싱을 하게 되어 다른 노드들은 영향을 받지 않게 된다
안정 해시의 문제점
- 안정 해시도 결국 쏠림 현상이 발생할 수 있다
- 이벤트성 트래픽에서는 특정 데이터에 몰릴 수 있는 문제가 생길 수 있다
안정 해시 쏠림 현상 개선
- 가상 노드를 통해 링 위에 가상 노드를 다른 노드들 사이에 배치한다
- 가상 노드의 수를 늘릴 수 록 노드 하나가 담당하게 되는 파티션의 크기가 작아지기 때문에 데이터가 균등하게 분포하게 된다
설계
- CAP : AP(가용성 + 분단 허용성)
- 일관성을 유지함에 따라 분단 허용성을 지킬 수 없음
- 결과적 일관성을 통한 일관성 유지
- 링형 아키텍처 적용(양 끝을 연결한다는 것으로 논리적으로 링형)
- 해시 키에 인접한 노드를 찾아감
- Virtual Node 적용
- 가상 노드를 링 위에 인접하지 않도록 배치하여 적재되는 데이터의 분포를 균등하게 함
- 적재되는 데이터를 인접 노드에 함께 저장하여 장애 내성을 갖춤
- 해시키 범위 별 참여하고 있는 Lookup 테이블을 관리하는 방식 적용
- 데이터 저장시 저장 성공을 위한 성공 Node 수 관리
아키텍처 구성

처리 흐름
get
sequenceDiagram
autonumber
participant Client as 클라이언트
participant Coord as LB
participant Table as Lookup 테이블
participant NodeA as Node A
participant NodeB as Node B
participant NodeC as Node C
Client->>Coord: GET(Key)
activate Coord
Coord->>Table: hash 값이 속한 담당 범위 조회
activate Table
Table-->>Coord: Primary = NodeA<br/>Replica Set = [NodeB, NodeC] (링 상 다음 N-1개 노드)
deactivate Table
Coord->>NodeA: GET(Key) 요청 [Primary]
activate NodeA
alt NodeA 정상 응답
NodeA-->>Coord: Value 반환
else NodeA 장애 / 타임아웃
deactivate NodeA
Coord->>NodeB: GET(Key) 요청 [인접 Node]
activate NodeB
alt NodeB 정상 응답
NodeB-->>Coord: Value 반환
else NodeB도 장애
deactivate NodeB
Coord->>NodeC: GET(Key) 요청 [다음 인접 Node]
activate NodeC
NodeC-->>Coord: Value 반환
deactivate NodeC
end
end
Coord-->>Client: Key : Value 응답
deactivate Coord
put
sequenceDiagram
autonumber
participant Client as 클라이언트
participant Coord as LB
participant Table as Lookup 테이블
participant NodeA as Node A
participant NodeB as Node B
participant NodeC as Node C
Client->>Coord: PUT(Key, Value)
activate Coord
Coord->>Table: hash 값이 속한 담당 범위 조회
activate Table
Table-->>Coord: NodeA<br/>인접 노드 = [NodeB, NodeC] (N-1개 노드)
deactivate Table
Coord->>NodeA: PUT(Key, Value) 저장 요청 [Primary]
activate NodeA
NodeA-->>Coord: ACK (저장 성공)
deactivate NodeA
Coord-->>Client: PUT 성공 응답
deactivate Coord
par 인접 노드 비동기 복제
Coord->>NodeB: PUT(Key, Value) 복제 [인접 Node]
activate NodeB
NodeB-->>Coord: ACK (복제 완료)
deactivate NodeB
and
Coord->>NodeC: PUT(Key, Value) 복제 [다음 인접 Node]
activate NodeC
NodeC-->>Coord: ACK (복제 완료)
deactivate NodeC
end
인접 노드에 대한 복제 시 비동기 워커를 통한 복제
이때 몇개의 노드에 복제되었을 때 저장이 완료되게 할지에 대한 설정 필요
Cluster에 서버 추가
sequenceDiagram
autonumber
participant New as 신규 서버
participant Coord as LB
participant Table as Lookup 테이블
participant Succ as 기존 인접 서버 (승계자)
New->>Coord: 클러스터 참여 요청 (Join)
activate Coord
Coord->>Coord: 신규 서버의 가상 서버 해시 위치 계산
Coord->>Table: 가상 서버 위치를 링에 삽입
activate Table
Table->>Table: 삽입 위치 기준 시계방향으로<br/>가장 가까운 기존 가상 서버 탐색<br/>→ 분할될 범위 산정
Table-->>Coord: 이관 대상 범위 + 기존 담당 서버 반환
deactivate Table
Coord->>Succ: 분할 범위에 해당하는 Key 이관 요청
activate Succ
Succ->>New: 해당 범위 Key:Value 복사
activate New
New-->>Succ: 이관 완료 ACK
deactivate New
Succ-->>Coord: 마이그레이션 완료 보고
Coord->>Table: Lookup 테이블 갱신
activate Table
Table-->>Coord: 갱신 완료
deactivate Table
Coord->>Succ: 이관 완료된 Key 삭제
Succ-->>Coord: 삭제 완료
deactivate Succ
Coord-->>New: 서버 추가 완료 응답
deactivate Coord
Cluster에 서버 삭제
sequenceDiagram
autonumber
participant Leave as 제거 대상 서버
participant Coord as LB
participant Table as Lookup 테이블
participant Succ as 인접 서버 (승계자)
Leave->>Coord: 클러스터 제거 요청
activate Coord
Coord->>Table: 이탈 서버의 가상 서버 위치 조회
activate Table
Table->>Table: 링 상에서 시계방향으로<br/>가장 가까운 다음 가상 서버 탐색<br/>→ 승계할 서버 결정
Table-->>Coord: 이관 대상 범위 + 승계 서버 반환
deactivate Table
Coord->>Leave: 보유 중인 Key 전체 이관 요청
activate Leave
Leave->>Succ: 담당 범위 Key:Value 복사
activate Succ
Succ-->>Leave: 이관 완료 ACK
deactivate Succ
Leave-->>Coord: 마이그레이션 완료 보고
deactivate Leave
Coord->>Table: Lookup 테이블 갱신
activate Table
Table-->>Coord: 갱신 완료
deactivate Table
Coord-->>Leave: 클러스터 제외 및 종료 승인
deactivate Coord
'공부' 카테고리의 다른 글
| 처음엔 빠른데 왜 나중엔 느릴까? 배치 Paging Reader의 함정 (1) | 2026.04.16 |
|---|---|
| Redis Sorted Set (ZSet) 들여다 보기 (1) | 2026.04.10 |
| 대기열 - 시스템 안정성 높이기 (0) | 2026.04.02 |
| Command와 Event (0) | 2026.03.27 |
| 서킷브레이커를 알았더라면 (0) | 2026.03.20 |



