DB Scaling Alternatives.md - 100-hours-a-week/KTB4-17th-wiki GitHub Wiki

κ·Έμ™Έ κ³ λ €ν•œ ν™•μž₯ 방식

Read Replication (읽기 μˆ˜ν‰ ν™•μž₯)

Write DB 사양을 κ³ μ •ν•˜κ³  Read DBλ₯Ό μƒμ‹œ 1λŒ€ + 피크 μ‹œ μΆ”κ°€ν•˜λŠ” ꡬ쑰. 쀑단 μ‹œκ°„μ΄λ‚˜ 리샀딩 λΆ€λ‹΄ 없이 Read DBλ₯Ό ν™•μž₯κ³Ό μΆ•μ†Œν•  수 μžˆλ‹€. λ‹€λ§Œ ν˜„μž¬ λΆ€ν•˜λŠ” 단일 μΈμŠ€ν„΄μŠ€ μš©λŸ‰μ„ μƒκ°ν–ˆμ„ λ•Œ μ΄ˆκΈ°λΆ€ν„° 뢄리할 κ·Όκ±°κ°€ μ—†μ–΄ 읽기 λΆ€ν•˜κ°€ μž„κ³„μΉ˜μ— κ·Όμ ‘ν•˜λ©΄ RDS λ¦¬λ“œ λ ˆν”Œλ¦¬μΉ΄λ‘œ ν•„μš” μ‹œμ μ— μ μš©ν•œλ‹€.

초기 μ„€κ³„μ—μ„œλŠ” 이 방식을 μ±„νƒμœΌλ‘œ λ‘μ—ˆμœΌλ‚˜, 단일 RDS둜 μΆ©λΆ„ν•˜λ‹€λŠ” λΆ€ν•˜ ν…ŒμŠ€νŠΈ 결과에 따라 "ν•„μš” μ‹œμ μ— μ μš©ν•˜λŠ” 후보"둜 μ‘°μ •ν–ˆλ‹€.

                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚   Backend    β”‚
                β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚                         β”‚
       Write                      Read
          β”‚                         β”‚
          β–Ό                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β–Ό                 β–Ό
  β”‚   Write DB   β”‚  볡제  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚   μƒμ‹œ κ³ μ •   β”‚ ─────▢ β”‚  Read DB 1   β”‚ β”‚  Read DB 2   β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚     μƒμ‹œ      β”‚ β”‚  피크 λ•Œλ§Œ     β”‚
          β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”˜
          └──────────────────── 볡제 β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Replica λ™μž‘ 방식

λ°μ΄ν„°λ² μ΄μŠ€ 볡제 ꡬ쑰
  1. μ‚¬μš©μžκ°€ Write μš”μ²­μ„ 보낸닀.
  2. Write DBκ°€ 데이터λ₯Ό λ³€κ²½ν•œλ‹€.
  3. Write DBκ°€ λ³€κ²½ λ‚΄μš©μ„ λ‘œκ·Έμ— κΈ°λ‘ν•œλ‹€.
  4. Write DBκ°€ Read DB의 λ°˜μ˜μ„ 기닀리지 μ•Šκ³  ν΄λΌμ΄μ–ΈνŠΈμ— 성곡 응닡을 보낸닀.
  5. Read DBκ°€ 둜그λ₯Ό 가져와 Relay Log에 μ €μž₯ν•œλ‹€.
  6. Replica의 μŠ€λ ˆλ“œκ°€ Relay Logλ₯Ό μˆœμ„œλŒ€λ‘œ λ°˜μ˜ν•œλ‹€.
  7. 일정 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ Write DB와 Read DB의 μƒνƒœκ°€ κ°™μ•„μ§„λ‹€.

Write DB 샀딩

리샀딩 μΆ•μ†Œκ°€ μ–΄λ ΅κ³  μ „ν™˜ μ‹œ μ“°κΈ° 쀑단 ν•„μš”. μ“°κΈ° λΆ€ν•˜κ°€ λ§Žμ•„μ„œ κ³ λ €ν–ˆμœΌλ‚˜ λ‹€μš΄ νƒ€μž„ 없이 운영이 λΆˆκ°€λŠ₯ν•΄ μ±„νƒν•˜μ§€ μ•Šμ•˜λ‹€.

Read/Write DBλ₯Ό λΆ„λ¦¬ν•œ λ’€ Write DB만 샀딩해 μ“°κΈ° I/Oλ₯Ό μ—¬λŸ¬ λ…Έλ“œλ‘œ λΆ„μ‚°ν•˜λŠ” ꡬ쑰. 피크/비피크 νŠΈλž˜ν”½ 차이가 μ•½ 9배라 피크에 맞좰 ν™•μž₯된 μƒνƒœλ₯Ό μœ μ§€ν•˜λ©΄ λ‚­λΉ„κ°€ 크고 비피크에 μΆ•μ†Œν•˜λ €λ©΄ 리샀딩이 ν•„μš”ν•œλ° 이 κ³Όμ •μ—μ„œ 데이터 μž¬λ°°μΉ˜μ™€ μ“°κΈ° 쀑단이 λ°œμƒν•΄ μ±„νƒν•˜μ§€ μ•Šμ•˜λ‹€.

μ“°κΈ° DB 샀딩 ꡬ쑰

μƒ€λ“œ μΆ•μ†Œκ°€ μ–΄λ €μš΄ 이유

  1. 샀딩 ν‚€ μž¬λ°°μΉ˜κ°€ ν•„μš”ν•˜λ‹€. μΌκ΄€λœ ν•΄μ‹±μœΌλ‘œ 이동 λ²”μœ„λ₯Ό 쀄일 μˆ˜λŠ” μžˆμ–΄λ„ 데이터 재배치 자체λ₯Ό 없앨 μˆ˜λŠ” μ—†λ‹€.
  2. 무쀑단 μΆ•μ†Œκ°€ μ–΄λ ΅λ‹€. μ „ν™˜ 쀑 μ“°κΈ° μš”μ²­μ„ μœ„ν•œ 별도 큐와 μž¬μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€.
  3. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 쀑 μ“°κΈ°λ₯Ό 동기화해야 ν•œλ‹€. μ“°κΈ° DBλŠ” 변경이 계속 λ°œμƒν•΄ 동기화 지연이 μ™„μ „νžˆ μ‚¬λΌμ§€λŠ” μ‹œμ μ„ 보μž₯ν•˜κΈ° μ–΄λ ΅κ³ , μ΅œμ’… μ „ν™˜ μ‹œμ μ—λŠ” 정합성을 μœ„ν•΄ μ§§κ²ŒλΌλ„ μ“°κΈ°λ₯Ό 쀑단해야 ν•œλ‹€.

리샀딩을 ν†΅ν•œ μƒ€λ“œ μΆ•μ†Œ μˆœμ„œ

μƒ€λ“œ μΆ•μ†Œ 및 데이터 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ³Όμ •
  1. μ œκ±°ν•  μƒ€λ“œλ₯Ό μ„ μ •ν•˜κ³  μΆ•μ†Œ μž‘μ—…μ„ μ€€λΉ„ν•œλ‹€.
  2. μ œκ±°ν•  μƒ€λ“œκ°€ λ‹΄λ‹Ήν•˜λ˜ ν‚€ λ²”μœ„λ₯Ό μ–΄λŠ μƒ€λ“œλ‘œ 이전할지 κ²°μ •ν•œλ‹€.
  3. κΈ°μ‘΄ 데이터λ₯Ό μƒˆλ‘œμš΄ λ‹΄λ‹Ή μƒ€λ“œλ‘œ λ³΅μ‚¬ν•œλ‹€.
  4. 볡사 쀑 λ“€μ–΄μ˜¨ μΆ”κ°€ μ“°κΈ°λ₯Ό μƒˆ λ‹΄λ‹Ή μƒ€λ“œμ— λ™κΈ°ν™”ν•˜κ³  데이터λ₯Ό κ²€μ¦ν•œλ‹€.
  5. 제거 λŒ€μƒ μƒ€λ“œμ˜ μ“°κΈ°λ₯Ό μΌμ‹œ μ€‘λ‹¨ν•œλ‹€. (μš”μ²­μ„ 큐에 λ³΄κ΄€ν•˜λŠ” λ“±μ˜ 처리 ν•„μš”)
  6. νŠΈλž˜ν”½μ„ μƒˆ λ‹΄λ‹Ή μƒ€λ“œλ‘œ μ „ν™˜ν•œλ‹€.
  7. μ „ν™˜μ„ ν™•μΈν•œ ν›„ κΈ°μ‘΄ μƒ€λ“œλ₯Ό μ œκ±°ν•œλ‹€.

참고 자료

Aurora Serverless v2

:μ„œλΉ„μŠ€ νŠΉμ„±μƒ 피크 μ‹œμ μ΄ λͺ…ν™•ν•΄ μƒμ‹œ μžλ™ μŠ€μΌ€μΌλ§μ€ λΉ„μš© λΉ„νš¨μœ¨μ΄λ‹€.

λΆ€ν•˜μ— 따라 λ‹€μš΄νƒ€μž„ 없이 μš©λŸ‰μ΄ μžλ™ μ‘°μ ˆλ˜λŠ” κ΄€λ¦¬ν˜• μ„œλΉ„μŠ€ λΆ€ν•˜ λ°œμƒ μ‹œμ μ„ νŠΉμ •ν•  수 μ—†λŠ” κ²½μš°μ— μ ν•©ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ 우리 μ„œλΉ„μŠ€λŠ” 피크가 μ˜€ν›„ 8~10μ‹œλ‘œ λͺ…ν™•ν•΄ μžλ™ μŠ€μΌ€μΌλ§μ˜ 이점이 크지 μ•Šκ³  λΉ„μš©μ΄ λΉ„μ‹Έλ‹€. λΆ€ν•˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” μ‹œμ μ—λ„ 7000λͺ…μœΌλ‘œ κ½€ λ§Žμ€ μ‚¬μš©μžκ°€ μ΄μš©ν•œλ‹€.

참고 자료

⚠️ **GitHub.com Fallback** ⚠️