๐Ÿชช ID ์ƒ์„ฑ๊ธฐ

Gunhoยท2026๋…„ 1์›” 28์ผ

System Design

๋ชฉ๋ก ๋ณด๊ธฐ
4/4

๐Ÿชช ID ์ƒ์„ฑ๊ธฐ ์„ค๊ณ„

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ณ ์œ ํ•˜๊ณ  ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ID ์‹œ์Šคํ…œ


๐Ÿ“‹ ๊ธฐ๋Šฅ ๋ฐ ๋น„๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

ID ํŠน์„ฑ

  • ์œ ์ผ์„ฑ ๋ณด์žฅ (์ค‘๋ณต ๋ถˆ๊ฐ€)
  • ์ •๋ ฌ ๊ฐ€๋Šฅ (์‹œ๊ฐ„์ˆœ ์ •๋ ฌ)
  • ์ˆซ์ž๋กœ๋งŒ ๊ตฌ์„ฑ
  • 64๋น„ํŠธ ๋ฒ”์œ„

์„ฑ๋Šฅ

  • ์ดˆ๋‹น 10,000๊ฐœ ID ์ƒ์„ฑ (10,000 TPS)

๐Ÿงฏ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜๋“ค

1. MultiMaster Replication

ํ”„๋กœ์„ธ์Šค

์š”์ฒญ
  โ†“
์—ฌ๋Ÿฌ DB ์ค‘ ํ•˜๋‚˜ ์„ ํƒ
  โ†“
๊ฐ DB๋Š” ๊ณ ์œ ํ•œ ์ฆ๊ฐ€ ๊ทœ์น™์œผ๋กœ ID ์ƒ์„ฑ
  โ”œโ”€ DB1: ํ™€์ˆ˜ (1, 3, 5, 7, ...)
  โ””โ”€ DB2: ์ง์ˆ˜ (2, 4, 6, 8, ...)
  โ†“
ID ๋ฐ˜ํ™˜

์žฅ์ 

โœ… ๊ตฌํ˜„ ๊ฐ„๋‹จ
โœ… SPOF ํ•ด๊ฒฐ (HA ๊ตฌ์„ฑ)
โœ… ์„ฑ๋Šฅ ํ–ฅ์ƒ (2๋ฐฐ~N๋ฐฐ)

๋‹จ์ 

โŒ ํ™•์žฅ์„ฑ ์ œํ•œ (Sharding ์‹œ ๋ณต์žก)
โŒ ์™„๋ฒฝํ•œ ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ ๋ถˆ๊ฐ€ (DB ๊ฐ„ ํƒ€์ด๋ฐ ์ฐจ์ด)

DB ์ƒ์„ฑ์ „๋žต


2. Ticket Server

ํ”„๋กœ์„ธ์Šค

์š”์ฒญ
  โ†“
์ค‘์•™ ID ์ƒ์„ฑ ์„œ๋ฒ„ ํ˜ธ์ถœ
  โ†“
์ˆœ์ฐจ์  ID ์ƒ์„ฑ (INCR ๋˜๋Š” Counter)
  โ†“
ID ๋ฐ˜ํ™˜

์˜ˆ์‹œ

Redis INCR, Atomic Counter, DB Sequence ๋“ฑ ์‚ฌ์šฉ

์žฅ์ 

โœ… ๊ตฌํ˜„ ๊ฐ„๋‹จ
โœ… ๋†’์€ ์„ฑ๋Šฅ (์†Œ ~ ์ค‘๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉ)

๋‹จ์ 

โŒ ์ค‘์•™ ์„œ๋ฒ„ SPOF ๊ฐ€๋Šฅ์„ฑ (HA ๊ตฌ์„ฑ ํ•„์š”)
โŒ HA ๊ตฌ์„ฑ์‹œ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ž‘์—… ํ•„์š”
โŒ ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ Network I/O ๋ณ‘๋ชฉ

ํ‹ฐ์ผ“ ์„œ๋ฒ„ ์ „๋žต

3. UUID

ํ”„๋กœ์„ธ์Šค

์š”์ฒญ
  โ†“
128๋น„ํŠธ ๋žœ๋ค UUID ์ƒ์„ฑ
  โ†“
ID ๋ฐ˜ํ™˜

์žฅ์ 

โœ… ๋น ๋ฅธ ์ƒ์„ฑ ์†๋„
โœ… ์ถฉ๋Œ ํ™•๋ฅ  ๊ทนํžˆ ๋‚ฎ์Œ
โœ… ๋„คํŠธ์›Œํฌ I/O ์—†์Œ

๋‹จ์ 

โŒ 128๋น„ํŠธ (64๋น„ํŠธ ์š”๊ตฌ์‚ฌํ•ญ ๋ถˆ์ถฉ์กฑ)
โŒ ๋ฌธ์ž์—ด ํฌํ•จ (์ˆซ์ž ์ „์šฉ ์š”๊ตฌ์‚ฌํ•ญ ๋ถˆ์ถฉ์กฑ)
โŒ ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ ๋ถˆ๊ฐ€

๐Ÿ’ก ํ‹ฐ์ผ“์„œ๋ฒ„์˜ ์ค‘์•™์ง‘์ค‘์‹ ์ƒ์„ฑ๊ณผ ์™„์ „ํžˆ ๋Œ€๋น„๋˜๋Š” ์˜ˆ๋Š” ๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด Network IO๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ ๋„ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ์˜ ๊ฐ ์„œ๋ฒ„์—์„œ ID์ƒ์„ฑ


4. Snowflake

Twitter(ํ˜„ X)์—์„œ ๋งŒ๋“  ๋ถ„์‚ฐ ํ™˜๊ฒฝ์šฉ ID ์ƒ์„ฑ ๋ฐฉ์‹.
64๋น„ํŠธ ์ •์ˆ˜ ID๋ฅผ ๊ฐ ์„œ๋ฒ„๊ฐ€ ์•Œ์•„์„œ ์ƒ์„ฑ.


Snowflake bit ๊ตฌ์„ฑ

๋น„ํŠธ๋ณ„ ๊ตฌ์„ฑ

Sign (1๋น„ํŠธ):
โ””โ”€ ํ•ญ์ƒ 0 (์–‘์ˆ˜ ๋ณด์žฅ)

Timestamp (41๋น„ํŠธ):
โ”œโ”€ ๋‹จ์œ„: ๋ฐ€๋ฆฌ์ดˆ (ms)
โ”œโ”€ ๊ธฐ์ค€: ์ปค์Šคํ…€ Epoch (์˜ˆ: 2010-01-01)
โ”œโ”€ ๋ฒ”์œ„: 0 ~ 2^41-1 = 2,199,023,255,551 ms
โ””โ”€ ์ˆ˜๋ช…: ์•ฝ 69๋…„

Machine ID (10๋น„ํŠธ):
โ”œโ”€ ๋ฒ”์œ„: 0~1,023 (์ตœ๋Œ€ 1,024๋Œ€ ์„œ๋ฒ„)
โ”œโ”€ ๊ตฌ์„ฑ: Datacenter ID (5๋น„ํŠธ) + Worker ID (5๋น„ํŠธ)
โ””โ”€ ๋ชฉ์ : ์„œ๋ฒ„ ๊ฐ„ ์ถฉ๋Œ ๋ฐฉ์ง€

Sequence (12๋น„ํŠธ):
โ”œโ”€ ๋ฒ”์œ„: 0~4,095 (๊ฐ™์€ ms์— ์ตœ๋Œ€ 4,096๊ฐœ)
โ”œโ”€ ๋™์ž‘: ๊ฐ™์€ ms ๋‚ด์—์„œ ์ˆœ์ฐจ ์ฆ๊ฐ€
โ””โ”€ ์ดˆ๊ธฐํ™”: ์ƒˆ๋กœ์šด ms๋งˆ๋‹ค 0์œผ๋กœ ๋ฆฌ์…‹

ํ”„๋กœ์„ธ์Šค

์š”์ฒญ
  โ†“
ํ˜„์žฌ Timestamp + Machine ID + Sequence ์กฐํ•ฉ
  โ†“
64๋น„ํŠธ ID ๋ฐ˜ํ™˜ (๋กœ์ปฌ ์ƒ์„ฑ)

์„ฑ๋Šฅ

๋‹จ์ผ ์„œ๋ฒ„: 4,096,000 ID/sec
10,000 TPS ์š”๊ตฌ์‚ฌํ•ญ: โœ… 400๋ฐฐ ์—ฌ์œ 

์žฅ์ 

โœ… ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑ
โœ… ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ ๊ฐ€๋Šฅ
โœ… Network I/O ์—†์Œ (๋กœ์ปฌ ์ƒ์„ฑ)
โœ… ๋†’์€ ์„ฑ๋Šฅ
โœ… ํ™•์žฅ์„ฑ ์šฐ์ˆ˜

๋‹จ์ 

โŒ ์‹œ๊ณ„ ๋™๊ธฐํ™” ํ•„์š” (NTP)
โŒ ์‹œ๊ณ„ ์—ญํ–‰ ์ฒ˜๋ฆฌ ํ•„์š”

๐Ÿ’ก ํ‹ฐ์ผ“์„œ๋ฒ„์˜ ์ค‘์•™์ง‘์ค‘์‹ ์ƒ์„ฑ๊ณผ ์™„์ „ํžˆ ๋Œ€๋น„๋˜๋Š” ์˜ˆ๋Š” ๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด Network IO๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ ๋„ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Snowflake ์ ์šฉ ์˜ˆ์‹œ

๐Ÿ’ก ๊ทธ๋ฆฌ๊ณ  snowflake์˜ ์›๋ฆฌ์ธ 64๋น„ํŠธ ์ดํ•ด๋ฅผ ํ† ๋Œ€๋กœ ๋น„ํŠธ ๋ฐฐ๋ถ„์„ ์กฐ์ ˆํ•˜์—ฌ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ๊ทธ ์˜ˆ๋กœ Sonyflake๋Š” Timestamp๋ฅผ 10ms ๋‹จ์œ„๋กœ ์ €์žฅํ•˜์—ฌ snowflake์˜ 69๋…„๋ณด๋‹ค ๊ธด ์•ฝ 174๋…„ ์ˆ˜๋ช… ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“š ์ฐธ์กฐ

๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ
Snowflake (GitHub)
Sonyflake (GitHub)
Announcing Snowflake
Krypton (DEV)

profile
Hello

0๊ฐœ์˜ ๋Œ“๊ธ€