# 0. 들어가며
UUID는 랜덤성이 강해서 데이터베이스 성능에 악영향을 줄 수 있습니다. 그리고 이를 해결하기 위해 정렬 가능한 숫자로 된 유니크한 ID를 생성하는 방식이 등장했습니다. 이전의 문자열과 다른점은 숫자타입으로 좀 더 사용성을 높였습니다. 대표적인 방법으로 Snowflake, TSID, FlakeID 등이 있으며, 이 방식은 시간 기반 정렬이 가능하고, 중복 없는 고유한 ID를 제공합니다.
# 1. Snowflake 알고리즘의 원리 (타임스탬프 + 머신 ID + 시퀀스)
Snowflake는 Twitter에서 개발한 유니크한 정렬 숫자 ID 생성 방식입니다. ID를 64비트 숫자로 표현하여 UUID보다 작고, 정렬이 가능합니다. 앞부분은 시간 정보를 포함하므로 ID가 시간 순서대로 정렬되며 뒤쪽에 머신 ID + 시퀀스 번호를 추가하여 중복을 방지합니다.
📌 Snowflake ID 구조 (64비트)
| 1비트 예약 | 41비트 타임스탬프 | 10비트 머신 ID | 12비트 시퀀스 번호 |
- 1비트(예약): 사용하지 않음
- 41비트(타임스탬프): 현재 시간(밀리초 단위) → ID를 시간순으로 정렬 가능!
- 10비트(머신 ID): 서버나 데이터센터 ID → 분산 환경에서 중복 방지
- 12비트(시퀀스 번호): 같은 밀리초에 생성된 ID를 구별
# 2. TSID, FlakeID 등의 비교
UUID나 Snowflake ID 외에도 유니크하고 정렬 가능한 숫자형 ID를 생성하는 다양한 방식이 있습니다. 예로 TSID와 FlakeID 등 많이 있습니다만 이 두가지에 대해서 설명하겠습니다. 이외에도 NanoID 등 다양한 방식이 있습니다.
📌 TSID(Timestamped Secure ID)
- UUID를 대체할 수 있는 정렬 가능한 숫자형 ID
- UUID의 랜덤성을 유지하면서도 정렬 가능헙니다.
- 128비트(긴 버전)와 64비트(짧은 버전) 지원됩니다
📌 FlakeID
- Snowflake와 매우 유사합니다
- AWS 환경에서 Snowflake를 최적화한 버전
- DynamoDB, NoSQL 환경에서 활용하기 좋습니다.
# 3. 장점과 단점
장점
✔ 정렬 가능 → 데이터베이스 성능 향상
- 시간 순으로 정렬되므로 B+트리 인덱스 최적화 가능합니다.
- UUID처럼 랜덤 삽입으로 인덱스 조각화 발생하지 않습니다
✔ 분산 환경에서도 중복 없음
- 머신 ID + 시퀀스 번호를 포함하므로, 서버가 여러 개여도 중복 방지 가능합니다
✔ UUID보다 저장 공간 절약 가능
- UUID(128비트)보다 숫자형 ID(64비트)가 더 작아 DB 저장 공간 효율적입니다
✔ 읽고 다루기 편리합니다
- 145678912345678901 같은 숫자 ID는 550e8400-e29b-41d4-a716-446655440000 같은 UUID보다 로그 분석, 디버깅할 때 직관적입니
단점
✔ ID 생성 시스템 필요 (Snowflake 서버 운영해야 함)
- Snowflake ID를 생성하려면 별도의 서버 또는 라이브러리가 필요합니다
- 단순히 UUID()처럼 자동 생성되는 것이 아니라, ID 생성 서버를 운영해야 합니다.
✔ 시계 동기화 문제 (Clock Drift)
- Snowflake는 타임스탬프 기반이라 서버 간 시간이 맞지 않으면 문제가 발생할 수 있습니다.
- 해결 방법: NTP(Network Time Protocol)로 모든 서버 시간을 동기화합니다.
✔ 초당 생성 가능한 ID 개수 제한 (성능 문제)
- 12비트 시퀀스 번호는 한 밀리초에 4,096개까지만 ID 생성 가능합니다
- 트래픽이 너무 많으면 ID 생성 속도가 한계에 도달할 수 있습니다.
# 4. 특정 상황에서 유리한 이유
✅ 로그 시스템, 트랜잭션 ID
- 로그를 시간순으로 정렬해야 할 때 Snowflake ID가 유리합니다
✅ 소셜 미디어 서비스 (게시글, 댓글 ID)
- 게시물 ID를 시간순으로 정렬해야 한다면, Snowflake ID가 유리합니다.
✅ 분산 데이터베이스 (NoSQL, DynamoDB, Cassandra)
- 여러 개의 서버에서 중복 없이 ID 생성해야 할 때 Snowflake ID 사용하는것이 좋습니다.
✅ UUID보다 작은 저장 공간이 필요한 경우
- 64비트 정렬 숫자 ID는 UUID(128비트)보다 저장 공간 절약 가능합니다.
# 5. UUID 성능 최적화 방법 (해결 방법)
✅ 1. 서버 간 시간 동기화 (Clock Drift 방지)
- 모든 서버에 NTP(Network Time Protocol) 설정하여 시계 동기화
- 서버 간 시간이 맞지 않으면, 동일한 타임스탬프에서 충돌이 발생할 수 있습니다.
✅ 2. 머신 ID 범위 조정
- 서버마다 고유한 머신 ID 할당 → 서버 간 중복 방지
- 머신 ID를 더 많이 할당하여 단일 서버에서 생성하는 ID 개수 제한 해결할 수 있습니다.
✅ 3. 대체 알고리즘 사용 (TSID, ULID 등)
- Snowflake ID의 한계를 극복하기 위해 TSID, ULID 같은 최신 방식 사용합니다.
- TSID는 UUID처럼 사용할 수 있지만, 정렬 가능하여 Snowflake의 장점을 가집니다.
# 6. 결론
✅ UUID보다 정렬 가능한 ID가 필요할 때 사용하기 좋습니다.
✅ 대규모 분산 환경에서 충돌 없이 ID를 생성해야 할 때 사용하기 좋습니다.
✅ 데이터베이스 인덱스 성능을 높이고 싶을 때 사용하기 좋습니다.
🔹 Twitter Snowflake 알고리즘 설명 (GitHub 공식 문서)
📌 https://github.com/twitter-archive/snowflake
🔹 Snowflake ID vs UUID 성능 비교 논문 (Stanford 연구 자료)
📌 https://cs.stanford.edu/~manku/papers/consistent-hashing.pdf
🔹 TSID 공식 문서 (Time-Sorted Unique ID)
📌 https://github.com/jetpack-io/tsid
🔹 Flake ID 설명 (Boundary 개발자 블로그)
📌 https://boundary.com/blog/2013/10/flake-a-decentralized-k-ordered-id-generator-in-erlang
'dev zone > database' 카테고리의 다른 글
[Primary Key 생성 전략] #7. 기타 방식 (Hash ID, Nano ID 등) (2) | 2025.02.12 |
---|---|
[Primary Key 생성 전략] #5. 유니크 정렬 문자열 (정렬 가능한 랜덤 ID) (0) | 2025.02.11 |
[Primary Key 생성 전략] #4. 조합 키 (Composite Key) (0) | 2025.02.10 |
[Primary Key 생성 전략] #3. UUID (전역적으로 유니크한 식별자) (0) | 2025.02.09 |
[Primary Key 생성 전략] #2. DB Auto Increment (자동 증가 번호) (1) | 2025.02.09 |