οΌ»λ…μ„œκΈ°λ‘οΌ½ 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 5μž₯

πŸ“– 제λͺ© : 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 : 5μž₯
πŸ™‹β€β™‚οΈ μ €μž : μ•Œλ ‰μŠ€ 쉬
5μž₯μ—μ„œλŠ” μ•ˆμ • ν•΄μ‹œ 섀계에 λŒ€ν•΄ 닀루고 μžˆλ‹€. μ•ˆμ •ν•΄μ‹œλž€ μ„œλ²„κ°€ μΆ”κ°€λ˜κ±°λ‚˜ μ œκ±°λ˜λ”λΌλ„, κ°€λŠ₯ν•œ ν•œ λ§Žμ€ ν‚€κ°€ μ΄λ™ν•˜μ§€ μ•Šλ„λ‘(λ‹€μ‹œ λΆ„μ‚°ν•  ν•„μš”κ°€ 없도둝) λ„μ™€μ£ΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. 이 κ°œλ…μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μš°μ„  μ‹€μ œ μ„œλΉ„μŠ€μ—μ„œ ν‚€-값이 μ–΄λ–»κ²Œ μ“°μ΄λŠ” μ§€ λͺ‡ κ°€μ§€ 사둀λ₯Ό 생각해 λ³Έ ν›„ μ•ˆμ • ν•΄μ‹œ 섀계에 λŒ€ν•΄μ„œλ„ μ •λ¦¬ν•΄λ³΄μž.

πŸ“Œμ‹€μ œ μ‹œμŠ€ν…œμ—μ„œ ν‚€-값은 μ–΄λ–»κ²Œ μ“°μΌκΉŒ?

  1. μ„Έμ…˜ μ €μž₯μ†Œ
    1
    2
     key: "session:abc123"
     value: "{userId: 42, 둜그인 μ‹œκ°„: 2025-04-14}"
    

    둜그인 ν•œ μœ μ €μ˜ 정보λ₯Ό μ„œλ²„κ°€ μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ„Έμ…˜ μ €μž₯μ†Œμ—μ„œ ν‚€-값이 μ‚¬μš©λœλ‹€.

  2. μΊμ‹œ μ„œλ²„
    1
    2
     key: "user:42:cart"
     value: "[μƒν’ˆ1, μƒν’ˆ2, μƒν’ˆ3]"
    

    λ°μ΄ν„°λ² μ΄μŠ€ 접근을 쀄이기 μœ„ν•΄, 자주 μ‘°νšŒλ˜λŠ” 값을 Redisλ‚˜ Memcached같은 μΊμ‹œμ— μ €μž₯ν•΄μ„œ μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€.

  3. ν”„λ‘œν•„ 사진, 아바타 URL λ“± 메타데이터
    1
    2
     key: "user:42:profile-img"
     value: "https://cdn.example.com/avatar/42.jpg" 
    

    λΉ λ₯΄κ²Œ URL을 뢈러였기 μœ„ν•΄ 메타 데이터듀을 ν‚€λ‘œ μ €μž₯ν•΄ λ‘˜ μˆ˜λ„ μžˆλ‹€.

πŸ‘‰ μ™œ ν•˜λ‚˜μ˜ μ„œλ²„μ— λ‹€ μ €μž₯ν•˜μ§€ μ•Šμ„κΉŒ?
μ„œλ²„ ν•˜λ‚˜κ°€ λ„ˆλ¬΄ 컀지면 μš©λŸ‰μ΄λ‚˜ μ„±λŠ₯에 λ¬Έμ œκ°€ 생길 μˆ˜λ„ 있고, 이 μ„œλ²„μ— λ¬Έμ œκ°€ 생기면 전체 μ„œλΉ„μŠ€κ°€ λ©ˆμΆ”κ²Œ λœλ‹€. κ·Έλž˜μ„œ 보톡 λŒ€κ·œλͺ¨ μ„œλΉ„μŠ€μ—μ„œλŠ” μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„μ— 데이터λ₯Ό λ‚˜λˆ μ„œ μ €μž₯ν•˜λŠ” 것이닀.
이 λ•Œ μ–΄λ–€ 데이터λ₯Ό μ–΄λ–€ μ„œλ²„μ— μ €μž₯ν•  μ§€ κ²°μ •ν•˜λŠ” 게 ν•΄μ‹œ ν•¨μˆ˜κ³ , μ„œλ²„ μˆ˜κ°€ λŠ˜κ±°λ‚˜ 쀄 λ•Œ λ§ˆλ‹€ 데이터 재배치 뢀담을 쀄일 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 게 μ•ˆμ • ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜ 이닀.

πŸ“Œ μ•ˆμ • ν•΄μ‹œκ°€ ν•„μš”ν•œ 이유λ₯Ό μ•Œμ•„λ³΄μž

λ¨Όμ € 일반적인 ν•΄μ‹œ λΆ„μ‚°μ˜ λ¬Έμ œμ μ„ μ•Œμ•„μ•Ό μ•ˆμ • ν•΄μ‹œμ˜ ν•„μš”μ„±μ„ λŠλ‚„ 수 μžˆλ‹€.
N개의 μΊμ‹œ μ„œλ²„κ°€ μžˆλ‹€κ³  ν•  λ•Œ, 이 μ„œλ²„λ“€μ— λΆ€ν•˜λ₯Ό κ· λ“±ν•˜κ²Œ λ‚˜λˆ„κΈ° μœ„ν•΄μ„œλŠ” 이런 κ³΅μ‹μ˜ ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

1
int serverIndex = hash(key) % 3;  // μ„œλ²„ 개수 3개

그런데 μ—¬κΈ°μ—μ„œ μ„œλ²„κ°€ ν•œ λŒ€ 더 μΆ”κ°€λ˜μ–΄ 4λŒ€κ°€ 되면?

1
int serverIndex = hash(key) % 4;  

계산해보면 λŒ€λΆ€λΆ„μ˜ 킀듀이 λ‹€λ₯Έ μ„œλ²„λ‘œ μ΄λ™ν•˜κ²Œ λœλ‹€.
즉, 기쑴의 ν•΄μ‹œ λΆ„μ‚° 방식은 μ„œλ²„ μˆ˜κ°€ λ°”λ€Œλ©΄ 거의 λͺ¨λ“  ν‚€λ₯Ό λ‹€μ‹œ λΆ„μ‚°ν•΄μ•Ό ν•œλ‹€. 이게 λ°”λ‘œ μŠ€μΌ€μΌ 아웃이 μ–΄λ €μš΄ μ΄μœ λ‹€.

πŸ“Œμ•ˆμ • ν•΄μ‹œμ— λŒ€ν•΄ μ•Œμ•„λ³΄μž

μ•ˆμ • ν•΄μ‹œλŠ” μ–΄λ–€ λ°©λ²•μœΌλ‘œ λΆ€ν•˜λ₯Ό κ· λ“±ν•˜κ²Œ λ‚˜λˆ μ€„κΉŒ?
μ•ˆμ • ν•΄μ‹œλŠ” ν‰κ· μ μœΌλ‘œ k/n개의 ν‚€λ§Œ μž¬λ°°μΉ˜ν•˜λŠ” ν•΄μ‹œ κΈ°μˆ μ΄λ‹€. KλŠ” ν‚€μ˜ 개수, N은 슬둯의 개수λ₯Ό μ˜λ―Έν•œλ‹€.

ν•΄μ‹œλ§ μ•ˆμ • ν•΄μ‹œλŠ” μ›ν˜• ν•΄μ‹œ 링으둜 이해 ν•  수 μžˆλŠ”λ°, μš°μ„  일렬의 ν•΄μ‹œ 곡간이 μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž. 이 곡간을 선이라고 μƒκ°ν•˜κ³  μ–‘μͺ½ 끝을 ꡬ뢀리면 μœ„ 이미지와 같이 μ›ν˜•μ΄ λœλ‹€.
그런 λ‹€μŒ, 킀듀이 이 링 μœ„μ˜ μ–΄λ”˜κ°€μ— λ°°μΉ˜λœλ‹€. 각 ν‚€λŠ” μ‹œκ³„ λ°©ν–₯으둜 κ°€μž₯ κ°€κΉŒμš΄ μ„œλ²„μ—κ²Œ ν• λ‹Ήλœλ‹€.

ν•΄μ‹œλ§ 이 μ΄λ―Έμ§€μ²˜λŸΌ, ν‚€1은 μ„œλ²„1에 ν• λ‹Ήλ˜κ³ , ν‚€2λŠ” μ„œλ²„1κ³Ό 더 κ°€κΉμ§€λ§Œ μ‹œκ³„ λ°©ν–₯으둜 κ°€μž₯ κ°€κΉŒμš΄ μ„œλ²„μ—κ²Œ ν• λ‹Ήλ˜λ―€λ‘œ μ„œλ²„2에 ν• λ‹Ήλœλ‹€.

그럼 μ„œλ²„ ν•œλŒ€κ°€ μΆ”κ°€λ˜κ±°λ‚˜ μ‚­μ œλ  κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?
ν•΄μ‹œλ§ μ„œλ²„5κ°€ μœ„ 그림처럼 μΆ”κ°€λ˜μ—ˆλ‹€λ©΄, ν‚€2λŠ” μ„œλ²„2κ°€ μ•„λ‹ˆλΌ μ„œλ²„5에 ν• λ‹Ήλ˜λ„λ‘ 변경될 것이고, λ‹€λ₯Έ 킀듀은 λͺ¨λ‘ κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.
μ„œλ²„3이 μ‚­μ œλœλ‹€λ©΄, ν‚€3은 μ„œλ²„1μ—κ²Œλ‘œ μž¬ν• λ‹Ή 되고 λ‹€λ₯Έ 킀듀은 λͺ¨λ‘ κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.

이 μ•ˆμ • ν•΄μ‹œμ˜ κΈ°λ³Έ κ΅¬ν˜„λ²•μ€ μƒλ‹Ήνžˆ μ’‹μ•„ λ³΄μ΄μ§€λ§Œ 두 κ°€μ§€ λ¬Έμ œκ°€ μžˆλ‹€.

  1. μ„œλ²„κ°€ μΆ”κ°€/μ‚­μ œ λ˜λŠ” 경우 νŒŒν‹°μ…˜μ˜ 크기λ₯Ό κ· λ“±ν•˜κ²Œ μœ μ§€ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€.
  2. ν‚€μ˜ κ· λ“± 뢄포λ₯Ό λ‹¬μ„±ν•˜κΈ° μ–΄λ ΅λ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ œμ•ˆλœ 기법이 가상 λ…Έλ“œ(Virtual Node) λ˜λŠ” 볡제(Replica) 기법이닀.

πŸ“Œκ°€μƒ λ…Έλ“œ κΈ°λ²•μ΄λž€?

μ„œλ²„λ§ˆλ‹€ μ—¬λŸ¬ 개의 가상 λ…Έλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ ν•΄μ‹œ 링 μœ„μ— ν©λΏŒλ €λ‘λŠ” 기법이닀. μ΄λ ‡κ²Œ ν•˜λ©΄ 링 μœ„ 여기저기에 μ„œλ²„1-1, μ„œλ²„1-2, μ„œλ²„1-3 같은 μ„œλ²„1의 가상 λ…Έλ“œλ“€μ΄ ν• λ‹Ήλ˜κ³  μ„œλ²„μ˜ λΆ€ν•˜κ°€ μ’€ 더 κ· λ“±ν•˜κ²Œ λΆ„μ‚°λœλ‹€.
λ‹€λ§Œ 가상 λ…Έλ“œκ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ 가상 λ…Έλ“œ 데이터λ₯Ό μ €μž₯ν•  곡간이 더 많이 ν•„μš”ν•΄μ§€λ―€λ‘œ, λͺ‡ 개의 가상 λ…Έλ“œλ₯Ό μ‚¬μš©ν•  것인지λ₯Ό 잘 κ³ λ €ν•΄μ•Ό ν•œλ‹€.

πŸ“Œμ•ˆμ • ν•΄μ‹œμ˜ 이점 μ •λ¦¬ν•˜κΈ°

  • μ„œλ²„κ°€ μΆ”κ°€λ˜κ±°λ‚˜ μ‚­μ œλ  λ•Œ 재배치 λ˜λŠ” ν‚€μ˜ μˆ˜κ°€ μ΅œμ†Œν™” λœλ‹€.
  • 데이터가 보닀 κ· λ“±ν•˜κ²Œ λΆ„ν¬ν•˜κ²Œ λ˜λ―€λ‘œ μˆ˜ν‰μ  규λͺ¨ ν™•μž₯성을 λ‹¬μ„±ν•˜κΈ° 쉽닀.
  • ν•«μŠ€νŒŸ ν‚€ 문제λ₯Ό 쀄인닀. νŠΉμ • μƒ€λ“œμ— λŒ€ν•œ 접근이 μ§€λ‚˜μΉ˜κ²Œ λΉˆλ²ˆν•˜λ©΄ κ³ΌλΆ€ν•˜ λ¬Έμ œκ°€ 생길 수 μžˆλ‹€.

πŸ“Œμ•ˆμ • ν•΄μ‹œλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ 예

  • μ•„λ§ˆμ‘΄ λ‹€μ΄λ‚˜λͺ¨ λ°μ΄ν„°λ² μ΄μŠ€(DynamoDB)
  • Apach Cassandra ν΄λŸ¬μŠ€ν„°μ˜ 데이터 νŒŒν‹°μ…”λ‹
  • Discord
  • Akamai CDN
  • Meglev λ„€νŠΈμ›Œν¬ λΆ€ν•˜ λΆ„μ‚°κΈ°