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 생성기는 필수 불가결한 컴포넌트이므로, 장애 대응 설계도 중요
- 시계 동기화:
'대규모 시스템 설계 기초' 카테고리의 다른 글
| 대규모 시스템 설계 기초 - 10장 (0) | 2025.04.12 |
|---|---|
| 대규모 시스템 설계 기초 - 9장 (0) | 2025.04.12 |
| 대규모 시스템 설계 기초 - 8장 (1) | 2025.04.06 |
| 대규모 시스템 설계 기초 - 6장 (1) | 2025.04.06 |
| 대규모 시스템 설계 기초 - 5장 (1) | 2025.03.30 |