노트

샤딩

Sharding

백엔드#db · 연결된 개념 10개

쉽게 말하면

샤딩은 너무 두꺼워진 전화번호부를 성씨별로 여러 권으로 나눠 각기 다른 서가에 두는 거예요. 한 권이 감당할 양이 줄어서 찾고 넣는 일이 다시 빨라지죠.

비유가 깨지는 곳 나누는 기준(샤딩 키)을 잘못 잡으면 김씨 권처럼 한 권만 미어터지는 핫스팟이 생겨요. 또 여러 권에 걸친 조인과 트랜잭션이 어려워 비정규화나 최종 일관성을 받아들여야 해요.

큰 데이터베이스를 같은 스키마를 가진 여러 조각(샤드)으로 나눠 서로 다른 서버에 두는 수평 확장 방법. 샤드끼리는 데이터가 겹치지 않는다.

  • 샤딩 키(Sharding Key, 파티션 키)가 가장 중요한 결정이다. 어떤 칼럼으로 데이터를 나눌지 정하며, 데이터가 고르게 퍼지는 키를 골라야 한다. 예: user_id % 4로 네 샤드에 나누기

샤딩이 부르는 문제

  • 재샤딩(Resharding): 데이터가 늘어 한 샤드로 감당이 안 되거나 분포가 한쪽으로 쏠리면 다시 나눠야 한다. 단순 나머지 연산은 샤드 수가 바뀌면 거의 모든 데이터가 이동하므로, 이동량을 줄이는 안정 해시(Consistent Hashing)를 쓴다
  • 핫스팟(유명인 문제)(Hotspot, Celebrity Problem): 특정 키에 요청이 몰려 한 샤드만 과부하가 걸린다. 그 키만 따로 샤드를 주는 식으로 대응한다
  • 조인과 비정규화(Denormalization): 여러 샤드에 걸친 조인이 어려워, 한 테이블에서 질의가 끝나도록 비정규화하는 경우가 많다(정규화 (1NF~5NF))
  • 샤드를 넘는 트랜잭션도 어렵다. ACID를 한 샤드 안으로 한정하고 나머지는 최종 일관성으로 받아들이게 된다

샤딩은 운영 복잡도가 크다. 그 전에 인덱스, 캐시, 읽기 복제, 수직 확장으로 버틸 수 있는지 먼저 본다. 테넌트별로 데이터를 나누는 멀티테넌시 데이터 격리도 비슷한 고민을 한다.

출처: 『가상 면접 사례로 배우는 대규모 시스템 설계 기초』 알렉스 쉬 (원서 System Design Interview – An Insider's Guide) 1장

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 저장소 역할 분담 (DB·캐시·큐·검색)

    서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • Redis (인메모리 저장소)

    Redis는 데이터를 메모리에 두는 키-값 저장소(key-value store)다. 디스크 기반 DB보다 훨씬 빠르지만, 기본적으로 휘발성에 가깝게 다루는 것이 안전하다. 문자열뿐 아니라 리스트·해시·셋·정렬된 셋 같은 자료구조를 명령 하나로 다룬다.

  • 비밀번호 저장: 인코딩·암호화·해싱

    비밀번호는 원문으로 저장하지 않고, 느린 단방향 해시(one-way hash)로 바꿔 저장한다. 로그인할 때는 입력값을 같은 방식으로 해시해 저장된 값과 비교한다. 인코딩·암호화·해싱은 비슷해 보이지만 목적이 다르다.

보기 옵션