본문 바로가기
대규모 시스템 설계 기초

대규모 시스템 설계 기초 - 7장

by cafecortado 2025. 4. 6.

7장. 분산 시스템을 위한 유일 ID 생성기 설계

  • 분산 시스템에서는 auto_increment 속성의 기본 키를 사용할 수 없음
  • 분산 시스템에서 사용될 유일 ID 설계가 필요

 

 

1단계: 문제 이해 및 설계 범위 확정

  • ID는 유일함
  • ID는 숫자형
  • ID는 64비트로 표현 가능해야 함
  • ID는 생성된 시간순으로 정렬 가능해야 함
  • 초당 10,000개 이상의 ID 생성이 가능해야 함

 

 

2단계: 개략적 설계안 제시 및 동의 구하기

  • 유일성이 보장되는 ID를 만드는 방법들
    • 다중 마스터 복제
    • UUID
    • 티켓 서버
    • 트위터 스노플레이크 접근법
  • 다중 마스터 복제

    • 각 데이터베이스 서버에서 auto_increment 사용하되, 서버의 수 k 만큼씩 증가
    • 서버가 두 개 일 때, 서버1은 1,3,5 / 서버2는 2,4,6 으로 2씩 증가하는 id
    • 단점:
      • 여러 데이터 센터에 걸쳐 규모를 늘리기 어려움
      • ID의 유일성은 보장되지만 그 값이 시간 흐름에 맞춰 커지도록 보장할 수 없음
        (서버1의 id5가 서버2의 id4보다 먼저 생성되었을 수 있음)
      • 서버 추가/삭제 시 어려움
  • UUID

    • 128비트 문자열로 충돌성 가능성이 지극히 낮은 id를 생성할 수 있음
    • 장점:
      • 생성이 단순함
      • 서버 간 조율이 불필요해 동기화 이슈가 없음
      • 각 서버가 ID를 알아서 만드는 구조이므로 규모 확장이 쉬움
    • 단점:
      • ID가 128비트로, 요구사항인 64비트 초과
      • 시간 순 정렬 불가
      • 숫자가 아닌 값을 포함
  • 티켓 서버

    • 중앙 서버 하나가 auto_increment로 ID를 생성
    • 장점:
      • 유일성이 보장되는 숫자로만 구성된 ID를 쉽게 생성
      • 구현이 쉽고 중소 규모 애플리케이션에 적합
    • 단점:
      • 티켓 서버가 SPOF가 됨
  • 트위터 스노우플레이크 접근법

    • ID를 여러 조각으로 나눠서 병렬로 생성 가능하게 만든 구조
    • 문제의 요구사항을 충족하는 구조
    • ID 구성:
      • 사인 비트:  항상 0, 추후 음수 양수 구분을 위해 사용 가능
      • 타임스탬프: 기원 시각 이후로 경과한 밀리초 시간값 (약 69년)
      • 데이터센터 ID: 데이터 센터 번호 (최대 32곳)
      • 머신 ID: 머신 번호 (데이터 센터당 최대 32개 서버)
      • 일련번호: 1 밀리초 안에 생성 가능한 ID 수 (0~4095)

 

 

3단계: 상세 설계

  • 트위터 스노우플레이크 접근법의 필드 중에 데이터센터 ID와 서버 ID는 일반적으로 시스템 운영 중에는 변경되지 않음
  • 타임스탬프나 일련번호는 ID 생성기 동작 중에 만들어지는 값
  • 타임스탬프:
    • 시간에 따라 큰 값을 갖게 되는 타임스탬프가 상위 bit에 위치하므로 ID는 시간 순으로 정렬됨
    • 예제: ID 값에서 UTC 시각을 추출

 

  • 일련번호:
    • 한 서버가 같은 밀리초 동안 하나 이상의 ID를 만들어낸 경우에만 0 보다 큰 값

 

 

4단계: 마무리

  • 스노우플레이크 방식은 모든 요구사항을 만족하면서도 분산 환경에서 규모 확장이 가능한 구조
  • 추가 논의 사항:
    • 시계 동기화:
      • 모든 서버가 같은 시간 기준을 쓴다고 가정하지만, 현실에선 유효하지 않을 수 있음
        → NTP(Network Time Protocol) 사용
    • 각 절의 길이 최적화:
      • ID 생성량이 적다면 알련 번호를 줄이고 타임스탬프를 늘리는 등의 조정 가능
    • 고가용성:
      • ID 생성기는 필수 불가결한 컴포넌트이므로, 장애 대응 설계도 중요