Consistent Hashing, cache sharding에서 key 이동을 줄이는 방법
Enchantée2026. 7. 25. 21:30
728x90
반응형
서비스가 커지면 하나의 cache node나 storage node에 모든 key를 넣기 어렵습니다.
그래서 여러 node로 key를 나누는 sharding을 사용합니다.
가장 단순한 방식은 hash(key) % node_count이지만, node가 추가되거나 제거되는 순간 많은 key가 한꺼번에 이동하는 문제가 생깁니다.
Consistent hashing은 이 문제를 줄이기 위해 hash space를 ring처럼 보고, key가 이동해야 하는 범위를 제한하는 방법입니다.
Consistent hashing의 핵심은 node 수가 바뀌어도 전체 key를 다시 나누지 않고, 바뀐 node 주변의 key만 이동시키는 것입니다.
Consistent hashing은 cache sharding, distributed storage, load distribution에서 node 변화에 따른 key 이동을 줄이기 위해 사용됩니다.
1. 들어가며
Sharding은 데이터를 여러 node에 나눠 담는 방법입니다.
예를 들어 user session cache를 Redis 여러 대에 나눠 저장하거나, image metadata를 여러 storage partition에 나눠 저장할 수 있습니다.
문제는 node 수가 고정되어 있지 않다는 점입니다.
트래픽이 늘면 node를 추가하고, 장애가 나면 node를 제거해야 합니다.
이때 key 이동이 너무 많으면 cache miss가 폭증하거나 storage migration 비용이 커집니다.
방식
아이디어
node 변화 시 문제
Modulo sharding
hash(key) % node_count
node_count가 바뀌면 대부분 key의 위치가 바뀜
Range sharding
key range를 node별로 나눔
hot range가 생기면 특정 node에 부하 집중
Consistent hashing
hash ring에서 key가 시계 방향으로 만나는 node에 배치
ring 설계와 virtual node 수를 잘 잡아야 함
Consistent hashing은 모든 문제를 해결하는 magic은 아니지만, node 증감이 잦은 distributed system에서 중요한 기본기입니다.
2. 왜 중요한가?
분산 시스템에서 key를 어디에 둘지 정하는 방식은 성능과 장애 복구에 직접 영향을 줍니다.
잘못된 sharding 방식은 평소에는 문제가 없어 보이다가 scale-out이나 failover 순간에 큰 비용을 만듭니다.
node를 추가할 때 이동해야 하는 key 수를 줄일 수 있습니다.
cache cluster에서 대규모 cache miss를 줄이는 데 도움이 됩니다.
storage나 queue partition을 늘릴 때 migration 범위를 제한할 수 있습니다.
장애 node가 빠졌을 때 영향을 받는 key range를 이해하기 쉽습니다.
면접에서 sharding, hash table, distributed cache를 함께 설명하기 좋은 주제입니다.
특히 cache에서는 key 이동이 곧 cache miss로 이어질 수 있습니다.
node를 3대에서 4대로 늘렸는데 대부분 key가 다른 node로 이동하면, scale-out 직후 backend DB에 부하가 몰릴 수 있습니다.
3. 핵심 개념
Consistent hashing은 hash value를 일직선이 아니라 원형 ring으로 생각합니다.
Node와 key를 같은 hash space 위에 올려두고, key는 시계 방향으로 가장 먼저 만나는 node에 배치합니다.
ring의 끝까지 갔는데 node가 없으면 처음 위치로 돌아갑니다.
개념
의미
실무에서 보는 지점
Hash space
key와 node가 배치되는 전체 범위
hash function의 분포가 고르게 나와야 함
Ring
hash space의 끝과 시작을 연결한 구조
마지막 range는 첫 node로 wrap around됨
Successor node
key 위치에서 시계 방향으로 처음 만나는 node
key의 담당 node가 됨
Virtual node
하나의 물리 node를 ring 위 여러 지점에 배치
부하 분산을 더 고르게 만들기 위해 사용
Node가 추가되면 새 node 바로 이전 range의 key만 새 node로 이동합니다.
Node가 제거되면 그 node가 담당하던 key만 다음 successor node로 이동합니다.
이 특성이 consistent hashing의 핵심입니다.
4. 그림으로 이해하기
Consistent hashing에서는 새 node가 추가되어도 전체 key가 다시 섞이지 않고, 새 node 앞쪽의 일부 key range만 이동합니다.
그림에서 중요한 점은 key가 node 개수로 나눠지는 것이 아니라 ring 위의 위치로 배치된다는 점입니다.
따라서 node_count가 3에서 4로 바뀌어도 모든 key의 modulo 결과를 다시 계산하는 방식과 다르게 동작합니다.
영향 범위가 새 node 주변으로 제한되기 때문에 cache warm-up과 migration 비용을 예측하기 쉬워집니다.
상태 변화
기존 ring
node A, node B, node C가 hash ring 위에 배치됨
key는 자기 위치에서 시계 방향으로 처음 만나는 node에 저장됨
node D 추가
node D가 ring 위 특정 위치에 들어옴
node D 바로 앞 range의 key만 node D로 이동
나머지 key는 기존 담당 node를 유지
면접에서는 이 상태 변화를 말로 설명할 수 있어야 합니다.
“node가 추가되면 일부 key만 이동한다”에서 멈추지 말고, “새 node가 ring에서 차지하는 위치 이전 range만 이동한다”까지 설명하면 더 좋습니다.