[IT] 샀딩(Sharding) / μƒ€λ“œ(Shard) - DB의 μˆ˜ν‰μ  규λͺ¨ ν™•μž₯

πŸ“‚ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 규λͺ¨ ν™•μž₯

μ €μž₯ν•  데이터가 λ§Žμ•„μ§€λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ λΆ€ν•˜λ„ μ¦κ°€ν•˜κ²Œ λœλ‹€. κ·Έλ•Œκ°€ 였면 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 증섀할 방법을 μ°Ύμ•„μ•Ό ν•œλ‹€. 

λ°μ΄ν„°λ² μ΄μŠ€μ˜ 규λͺ¨λ₯Ό ν™•μž₯ν•˜λŠ” λ°λŠ” 두 가지 접근법이 μžˆλ‹€. 

πŸ“„ 수직적 ν™•μž₯

Scale-up 이라고도 λΆ€λ₯΄λŠ” 수직적 규λͺ¨ ν™•μž₯법은 κΈ°μ‘΄ μ„œλ²„μ— 더 λ§Žμ€, λ˜λŠ” κ³ μ„±λŠ₯의 μžμ›(CPU, RAM, λ””μŠ€ν¬ λ“±)을 μ¦μ„€ν•˜λŠ” 방법이닀. μ΄λŸ¬ν•œ 수직적 μ ‘κ·Όλ²•μ—λŠ” λͺ‡ 가지 μ‹¬κ°ν•œ 약점이 μžˆλ‹€. 

  • λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„ ν•˜λ“œμ›¨μ–΄μ—λŠ” ν•œκ³„κ°€ μžˆμœΌλ―€λ‘œ CPU, RAM 등을 λ¬΄ν•œ 증섀할 μˆ˜λŠ” μ—†λ‹€. μ‚¬μš©μžκ°€ 계쏙 λŠ˜μ–΄λ‚˜λ©΄ ν•œ λŒ€ μ„œλ²„λ‘œλŠ” κ²°κ΅­ κ°λ‹Ήν•˜κΈ° μ–΄λ ΅κ²Œ 될 것이닀.
  • SPOF(Single Point of Failure)둜 μΈν•œ μœ„ν—˜μ„±μ΄ 크닀. 
  • λΉ„μš©μ΄ 많이 λ“ λ‹€. κ³ μ„±λŠ₯ μ„œλ²„λ‘œ 갈수둝 가격이 μ˜¬λΌκ°€λŠ” 것은 λ‹Ήμ—°ν•˜λ‹€.

πŸ“„ μˆ˜ν‰μ  ν™•μž₯

λ°μ΄ν„°λ² μ΄μŠ€μ˜ μˆ˜ν‰μ  ν™•μž₯은 샀딩(sharding)이라고도 λΆ€λ₯΄λŠ”데, 더 λ§Žμ€ μ„œλ²„λ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€. μ•„λž˜ 그림은 수직적 ν™•μž₯법과 μˆ˜ν‰μ  ν™•μž₯법이 μ–΄λ–»κ²Œ λ‹€λ₯Έμ§€ 보여쀀닀. 

πŸ“‚ μƒ€λ“œ(Shard)? 샀딩(Sharding)?

샀딩은 λŒ€κ·œλͺ¨ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μƒ€λ“œ(shard)라고 λΆ€λ₯΄λŠ” μž‘μ€ λ‹¨μœ„λ‘œ λΆ„ν• ν•˜λŠ” κΈ°μˆ μ„ λ§ν•œλ‹€. 즉, λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λΆ€ν•˜ 뢄산을 μœ„ν•΄ λ‹€μˆ˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€μ— 데이터λ₯Ό λΆ„μ‚° μ €μž₯ν•˜λŠ” 기법이닀.  λͺ¨λ“  μƒ€λ“œλŠ” 같은 μŠ€ν‚€λ§ˆλ₯Ό μ“°μ§€λ§Œ μƒ€λ“œμ— λ³΄κ΄€λ˜λŠ” 데이터 μ‚¬μ΄μ—λŠ” 쀑볡이 μ—†λ‹€

 

μ•„λž˜μ˜ 그림은 μƒ€λ“œλ‘œ λΆ„ν• λœ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ˜ˆμ΄λ‹€. μ‚¬μš©μž 데이터λ₯Ό μ–΄λŠ μƒ€λ“œμ— λ„£μ„μ§€λŠ” μ‚¬μš©μž ID에 따라 μ •ν•œλ‹€. 이 μ˜ˆμ‹œμ—μ„œλŠ” user_id % 3을 ν•΄μ‹œ ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜μ—¬ 데이터가 λ³΄κ΄€λ˜λŠ” μƒ€λ“œλ₯Ό μ •ν•œλ‹€. 

λ˜ν•œ, μ•„λž˜λŠ” 각 μƒ€λ“œ λ…Έλ“œμ— μ‚¬μš©μž 데이터가 μ–΄λ–»κ²Œ λ³΄κ΄€λ˜λŠ”μ§€λ₯Ό 보여쀀닀. 

λ³΄μ΄λŠ” κ²ƒμ²˜λŸΌ μƒ€λ“œ 간에 μ€‘λ³΅λ˜λŠ” 데이터가 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€!

🏷 샀딩 ν‚€(Sharding Key)

샀딩 μ „λž΅μ„ κ΅¬ν˜„ν•  λ•Œ κ³ λ €ν•΄μ•Ό ν•  κ°€μž₯ μ€‘μš”ν•œ 것이 λ°”λ‘œ 샀딩 ν‚€(sharding key)λ₯Ό μ–΄λ–»κ²Œ μ •ν•˜λŠλƒ ν•˜λŠ” 것이닀. 샀딩 ν‚€λŠ” νŒŒν‹°μ…˜ ν‚€(partition key)라고도 λΆ€λ₯΄λŠ”데, 데이터가 μ–΄λ–»κ²Œ 뢄산될지 μ •ν•˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 칼럼으둜 κ΅¬μ„±λœλ‹€. μœ„ 그림의 경우, 샀딩 ν‚€λŠ” user_id이닀. 샀딩 ν‚€λ₯Ό 톡해 μ˜¬λ°”λ₯Έ λ°μ΄ν„°λ² μ΄μŠ€μ— 질의λ₯Ό 보내어 데이터 μ‘°νšŒλ‚˜ 변경을 μ²˜λ¦¬ν•˜λ―€λ‘œ νš¨μœ¨μ„ 높일 수 μžˆλ‹€. 이 샀딩 ν‚€λ₯Ό μ •ν•  λ•ŒλŠ” 데이터λ₯Ό κ³ λ₯΄κ²Œ λΆ„ν•  ν•  수 μžˆλ„λ‘ ν•˜λŠ” 게 κ°€μž₯ μ€‘μš”ν•˜λ‹€. 

 

 μƒ€λ”©μ€ DB 규λͺ¨ ν™•μž₯을 μ‹€ν˜„ν•˜λŠ” 휼λ₯­ν•œ κΈ°μˆ μ΄μ§€λ§Œ μ™„λ²½ν•˜μ§€λŠ” μ•Šλ‹€. 샀딩을 λ„μž…ν•˜λ©΄ μ‹œμŠ€ν…œμ΄ λ³΅μž‘ν•΄μ§€κ³  ν’€μ–΄μ•Ό ν•  μƒˆλ‘œμš΄ λ¬Έμ œλ„ 생긴닀. 

  • λ°μ΄ν„°μ˜ 재 샀딩(resharding) : 재 샀딩은 λ‹€μŒκ³Ό 같은 κ²½μš°μ— ν•„μš”ν•˜λ‹€.
    • 데이터가 λ„ˆλ¬΄ λ§Žμ•„μ Έμ„œ ν•˜λ‚˜μ˜ μƒ€λ“œλ‘œλŠ” 더 이상 κ°λ‹Ήν•˜κΈ° μ–΄λ €μšΈ λ•Œ
    • μƒ€λ“œ κ°„μ˜ 데이터 뢄포가 κ· λ“±ν•˜μ§€ λͺ»ν•˜μ—¬ μ–΄λ–€ μƒ€λ“œμ— ν• λ‹Ήλœ 곡간 μ†Œλͺ¨κ°€ λ‹€λ₯Έ μƒ€λ“œμ— λΉ„ν•΄ 빨리 진행될 λ•Œ
      이 경우λ₯Ό μƒ€λ“œ μ†Œμ§„(shard exhaustion)이라고도 λΆ€λ₯΄λŠ”데 이런 ν˜„μƒμ΄ λ°œμƒν•˜λ©΄ μƒ€λ“œ ν‚€λ₯Ό κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ³€κ²½ν•˜κ³  데이터λ₯Ό μž¬λ°°μΉ˜ν•˜μ—¬μ•Ό ν•œλ‹€. μ•ˆμ • ν•΄μ‹œ(consistent hashing) 기법을 ν™œμš©ν•˜λ©΄ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€. 
  • 유λͺ…인사(celebrity) 문제 : ν•«μŠ€νŒŸ ν‚€(hotspot key) λ¬Έμ œλΌκ³ λ„ λΆ€λ₯΄λŠ”데, νŠΉμ • μƒ€λ“œμ— μ§ˆμ˜κ°€ μ§‘μ€‘λ˜μ–΄ μ„œλ²„μ— κ³ΌλΆ€ν•˜κ°€ κ±Έλ¦¬λŠ” λ¬Έμ œμ΄λ‹€. 예λ₯Ό λ“€μ–΄, BTS, λ΄‰μ€€ν˜Έ, 손ν₯λ―Ό, JPark Let's go 같은 유λͺ…인사가 μ „λΆ€ 같은 μƒ€λ“œμ— μ €μž₯λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžˆλ‹€κ³  ν•΄ 보자. 이 λ°μ΄ν„°λ‘œ μ‚¬νšŒ 관계망 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜κ²Œ 되면 κ²°κ΅­ ν•΄λ‹Ή μƒ€λ“œμ—λŠ” read μ—°μ‚° λ•Œλ¬Έμ— κ³ΌλΆ€ν•˜κ°€ 걸리게 될 것이닀. 
  • 쑰인과 λΉ„μ •κ·œν™”(join and de-normalization) : 일단 ν•˜λ‚˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ—¬λŸ¬ μƒ€λ“œ μ„œλ²„λ‘œ μͺΌκ°œκ³  λ‚˜λ©΄, μ—¬λŸ¬ μƒ€λ“œμ— 걸친 데이터λ₯Ό μ‘°μΈν•˜κΈ°κ°€ νž˜λ“€μ–΄μ§„λ‹€. 이λ₯Ό ν•΄κ²°ν•˜λŠ” ν•œ 가지 방법은 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λΉ„μ •κ·œν™”ν•˜μ—¬ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—μ„œ μ§ˆμ˜κ°€ μˆ˜ν–‰λ  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀. 

'IT' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[IT] λ‘œλ“œλ°ΈλŸ°μ„œ(Load Balancer)  (0) 2023.03.27