[시스템 디자인] 7장. 분산 시스템을 위한 유일 ID 생성기 설계

혀어어언·2025년 10월 12일
0

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

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

-요구사항
ID의 특성유일해야 하고 정렬 가능해야 함
ID의 타입숫자
64비트로 표현될 수 있는 값
생성 시점에 따른 정렬 가능
시스템 규모초당 10,000 ID 생성 가능해야 함

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

  • 분산 시스템에서 유일성이 보장되는 ID 생성 기법은 다양함
  • 선택지
    • 다중 마스터복제(multi-master replication)
    • UUID(Universally Unique Identifier)
    • 티켓 서버(ticket server)
    • 트위터 스노플레이크(twitter snowflake) 접근법

2-1. 다중 마스터 복제

  • DB의 auto_increment 기능을 활용하는 방법
  • 단, 1씩 증가가 아닌 K(분산 DB 수)씩 증가

2-2. UUID(v4)

특징

  • 컴퓨터 시스템에 저장되는 정보를 유일하게 식별하기 위한 128비트 수
장점단점
단순의존성·조율 없음(완전 분산)
서버 사이의 조율이 필요 없으므로 동기화 이슈 없음
성숙한 생태계: 거의 모든 언어/DB/프레임워크가 지원
각 서버가 스스로 UUID 생성-> 규모 확장 용이
I16바이트(문자열 표기 36자)라 공간·전송량 부담이 정수형보다 큼
비정렬(random) 키
시간순 정렬이 필요하면 애플리케이션 레벨로 정렬 키를 따로 둬야 함
ID에 숫자가 아닌 값 포함 가능

2-3. 티켓 서버

  • 플리커는 분산 기본키를 만들기 위해 티켓 서버 기술 활용
  • auto_increment 기능을 갖춘 DB 서버(티켓 서버)를 중앙 집중형으로 하나만 사용하는 방식
장점단점
구현 용이
중소 규모 앱에 적합
티켓 서버가 SPOF가 됨

2-4. 트위터 스노우플레이크 접근법

  • 64비트 정수를 여러 절(타임스탬프 | 노드ID | 시퀀스)로 비트 분할해 시간 정렬완전 분산을 동시에 달성하는 방식

생성

  • sign bit: 1비트 할당
  • timestamp: 기준 epoch 이후 경과 ms(또는 ns)
  • 노드 ID(머신/프로세스)
    • 데이터 센터 ID: 5비트 할당. 2^5 = 32개 데이터 센터 지원 가능
    • 서버 ID: 5비트 할당. 데이터 센터당 32개 서버 사용 가능
  • 일련번호
    • 각 서버에서는 ID 생성 시 일련 번호 1씩 증가
    • 1ms 경과할 때마다 초기화됨(즉, 같은 ms 내 증가하는 시퀀스 비트)
[ 1bit 예약 | 41bit 타임스탬프 | 10bit 노드ID | 12bit 시퀀스 ]

3단계. 상세 설게

노드 ID

  • 데이터 센터 ID와 서버 ID는 시스템이 시작할 때 결정되며, 일반적으로 운영중에는 변경되지 않음
  • 변경 시 ID 충돌이 발생할 수 있음

4단계. 추가 논의 사항

시계 동기화(clock synchronization)

  • 하나의 서버에서 여러 코어가 실행될 경우 ID 생성 서버들이 전부 같은 시계를 사용하지 않을 수도 있음
  • 해결 방법 중 하나: NTP(Network Time Protocol)

각 절의 길이 최적화

  • 동시성이 낮고 수명이 긴 앱이라면 일련번호의 길이를 줄이고 타임스탬프 절의 길이를 늘이는 것을 고려 가능

고가용성


5. 참고 내용

5-1. UUID v4 (난수형)

정의

  • 128비트 UUID
  • 상수 비트(버전/variant)를 제외한 122비트를 암호학적으로 충분한 난수로 채우는 식별자

보장/성질

  • 완전 분산: 중앙 없이 생성
  • 정렬성 없음: 삽입 위치가 랜덤 → 인덱스 단편화 유발 가능
  • 충돌 확률: 현실적으로 극히 낮음(122비트 공간)
  • 개인정보 노출 없음: 시간/노드 정보 미포함

권장 유스케이스

  • “그냥 충돌 없이 잘 돌아가는 전역 고유키”가 필요하고 DB 인덱스 비용을 감수할 수 있을 때
  • 마이크로서비스/이벤트ID/추적ID 등 중앙 조율이 싫을 때

5-2. UUID 버전

  • v7 과 v4 비교
    • v7 장점: 타임스탬프를 상위비트에 두어 삽입 정렬성↑, 범위쿼리·시계열 조회에 유리. 인덱스 단편화↓, 캐시 친화적
    • v4 장점: 구현·호환성 측면에서 가장 널리 쓰이고 라이브러리 풍부.
  • DB 성능/정렬성이 중요하면 v7, 단순 분산 유일 키면 v4도 충분
버전핵심 아이디어정렬성충돌 위험비고
v1시간 + 노드(MAC)어느 정도(시간 기반)매우 낮음MAC 유출·시계 이슈 우려
v3네임스페이스 + 이름의 MD5없음동일 입력→동일 출력보통 v5 선호
v4난수 122비트없음극저가장 널리 사용
v5네임스페이스 + 이름의 SHA-1없음동일 입력→동일 출력디터미니스틱 ID 필요 시
v6v1 재배열(시간 정렬성 개선)높음매우 낮음과도기적, 채택 제한적
v7시간(Unix ms)+난수높음(시간 정렬)극저최신 표준 경향, 실무 선호↑
v8커스텀 필드설계에 따름설계에 따름실험/도메인 특화용

6. 용어

  • 정렬성(orderability): 시간이 흐를수록 값이 대체로 증가
  • 충돌 확률: 서로 다른 두 생성 결과가 동일 키가 되는 확률(이상적으로 0에 가깝다)
  • 완전 분산성: 중앙 조율 없이 각 노드가 독립적으로 생성 가능

0개의 댓글