Home > Backend Development > πŸ“š[Backend Development] λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(DRDB, Distributed Relational Database)

πŸ“š[Backend Development] λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(DRDB, Distributed Relational Database)
Backend Ddevelopment

β€œπŸ“š[Backend Development] λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(DRDB, Distributed Relational Database)”

βœ…1️⃣ λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λž€?

πŸ“Œ1️⃣ κ°œλ….

  • λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(DRDB, Distributed Relational Database, DRDB)λŠ” ν•˜λ‚˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄ μ—¬λŸ¬ 개의 μ„œλ²„(λ˜λŠ” λ…Έλ“œ)에 λΆ„μ‚°λ˜μ–΄ μ €μž₯되고 μš΄μ˜λ˜λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(RDBMS) μ‹œμŠ€ν…œμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
    • 즉, 데이터λ₯Ό ν•˜λ‚˜μ˜ 쀑앙 μ„œλ²„μ— μ €μž₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ—¬λŸ¬ 개의 μ„œλ²„μ— λ‚˜λˆ„μ–΄ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ“Œ2️⃣ μ™œ λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ”κ°€?

  • βœ… κ³ κ°€μš©μ„±(High Availability) ➞ νŠΉμ • μ„œλ²„κ°€ μž₯μ• κ°€ λ‚˜λ”λΌλ„ λ‹€λ₯Έ μ„œλ²„κ°€ λŒ€μ‹  λ™μž‘ κ°€λŠ₯
  • βœ… ν™•μž₯μ„±(Scalability) ➞ 데이터 양이 증가해도 μ„œλ²„λ₯Ό μΆ”κ°€ν•˜μ—¬ ν™•μž₯ κ°€λŠ₯
  • βœ… μ„±λŠ₯ ν–₯상(Performance Improvement) ➞ 데이터 읽기/μ“°κΈ° μ„±λŠ₯을 높일 수 있음
  • βœ… μ§€μ—°μ‹œκ°„ κ°μ†Œ(Latency Reduction) ➞ μ‚¬μš©μžμ™€ κ°€κΉŒμš΄ μ„œλ²„μ—μ„œ 데이터λ₯Ό 제곡 κ°€λŠ₯

πŸ“Œ3️⃣ λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŠΉμ§•.

  • πŸ’Ž CAP 이둠 : λΆ„μ‚° μ‹œμŠ€ν…œμ€ 일관성(Consistency), κ°€μš©μ„±(Availability), λ„€νŠΈμ›Œν¬ λΆ„ν•  λ‚΄μ„±(Partition Tolerance) 쀑 두 κ°€μ§€λ§Œ 보μž₯ν•  수 있음
  • πŸ’Ž ACID 보μž₯ : κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ νŠΉμ„±μƒ νŠΈλžœμž­μ…˜μ˜ 무결성(Atomicity, Consistency, Isolation, Durability, ACID)을 보μž₯ν•΄μ•Ό 함
  • πŸ’Ž 데이터 λΆ„μ‚°(Sharding, Replication) : 데이터λ₯Ό μ—¬λŸ¬ μ„œλ²„μ— λ‚˜λˆ„μ–΄ μ €μž₯ν•΄μ•Ό 함

βœ…2️⃣ λΆ„μ‚° κ΄€κ³„ν˜• 데이터 베이슀 μ•„ν‚€ν…μ²˜

  • λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ΅¬μ„±ν•˜λŠ” μ£Όμš” μš”μ†Œλ“€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

πŸ“Œ1️⃣ μ£Όμš” μ»΄ν¬λ„ŒνŠΈ

1️⃣ 데이터 λ…ΈνŠΈ(Data Nodes)

  • 데이터λ₯Ό μ €μž₯ν•˜λŠ” μ„œλ²„(물리적 λ˜λŠ” 가상 λ¨Έμ‹ )
  • μ—¬λŸ¬ 개의 λ…Έλ“œλ‘œ κ΅¬μ„±λ˜λ©°, 각 λ…Έλ“œλŠ” λ°μ΄ν„°μ˜ 일뢀λ₯Ό μ €μž₯
  • 예: MySQL, Cluster, CockroachDB의 λ…Έλ“œ

2️⃣ 쿼리 λ…Έλ“œ(Query Nodes)

  • ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ°›μ•„ 데이터 λ…Έλ“œλ‘œ 전달
  • λΆ„μ‚°λœ λ°μ΄ν„°μ—μ„œ SQL 쿼리λ₯Ό μ‹€ν–‰ν•˜κ³  κ²°κ³Όλ₯Ό μ‘°ν•©
  • 예: MySQL, Proxy, Vitess, TiDB

3️⃣ 메타데이터 λ…Έλ“œ(Metadata Nodes)

  • λΆ„μ‚° λ°μ΄ν„°λ² μ΄μŠ€μ˜ 전체 ꡬ쑰 및 데이터 μœ„μΉ˜ 정보λ₯Ό μ €μž₯
  • 데이터 λ…Έλ“œ κ°„ νŠΈλžœμž­μ…˜μ„ μ‘°μœ¨ν•˜κ³  데이터 정합성을 μœ μ§€

4️⃣ λ‘œλ“œ λ°ΈλŸ°μ„œ(Load Balancer)

  • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ μ—¬λŸ¬ 데이터 λ…Έλ“œλ‘œ λΆ„μ‚°ν•˜μ—¬ λΆ€ν•˜λ₯Ό μ€„μž„
  • 예: HAProxy, MySQL Router

βœ…3️⃣ λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터 λΆ„μ‚° 방식

πŸ“Œ1️⃣ 샀딩(Sharding)

πŸ“Œ κ°œλ…

  • 샀딩은 데이터λ₯Ό μ—¬λŸ¬ 개의 λ…Έλ“œ(μ„œλ²„)에 λ‚˜λˆ„μ–΄ μ €μž₯ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
    • 즉, ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„ μ—¬λŸ¬ 개의 μž‘μ€ ν…Œμ΄λΈ”λ‘œ λΆ„ν• ν•˜μ—¬ μ„œλ‘œ λ‹€λ₯Έ μ„œλ²„μ— λΆ„μ‚° μ €μž₯ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

βœ… μž₯점

  • νŠΈλž˜ν”½μ΄ 증가해도 μ„œλ²„λ₯Ό μΆ”κ°€ν•˜μ—¬ μ„±λŠ₯ ν™•μž₯이 κ°€λŠ₯ (μˆ˜ν‰ ν™•μž₯, Scale-Out)
  • νŠΉμ • μƒ€λ“œμ—μ„œλ§Œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λ―€λ‘œ λΉ λ₯Έ 쑰회 κ°€λŠ₯
  • 읽기/μ“°κΈ° μ„±λŠ₯이 ν–₯상됨

❌ 단점

  • μƒ€λ“œ ν‚€(Shard Key) 섀계가 잘λͺ»λ˜λ©΄ νŠΉμ • μƒ€λ“œμ— λΆ€ν•˜κ°€ 집쀑될 수 있음
  • 데이터 μ—°κ΄€μ„±(Consistency) μœ μ§€κ°€ 어렀움
  • 쑰인(Join) 연산이 μ–΄λ €μ›Œμ§

πŸ“ 예제

  • μ‚¬μš©μž 데이터λ₯Ό ID κΈ°μ€€μœΌλ‘œ μƒ€λ”©ν•˜λŠ” 경우
User ID Name Server (Shard)
1001 Alice Shard 1
1002 Bob Shard 2
1003 Charlie Shard 3
  • 샀딩 μ „λž΅μœΌλ‘œλŠ” λ²”μœ„ 샀딩(Range Sharding), ν•΄μ‹œ 샀딩(Hash Sharding), 동적 샀딩(Dynamic Sharding) 등이 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ2️⃣ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜(Replication)

πŸ“Œ κ°œλ…

  • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ€ 데이터λ₯Ό μ—¬λŸ¬ 개의 μ„œλ²„μ— λ³΅μ œν•˜μ—¬ μ €μž₯ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
  • 이 방식은 데이터λ₯Ό 항상 μ—¬λŸ¬ 개의 μ„œλ²„μ— λ³΄κ΄€ν•˜μ—¬ μž₯μ•  볡ꡬ(High Availability)와 읽기 μ„±λŠ₯(Read Performance) ν–₯상을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

βœ… μž₯점

  • ν•œ μ„œλ²„μ— μž₯μ• κ°€ λ°œμƒν•΄λ„ λ‹€λ₯Έ 볡제 μ„œλ²„μ—μ„œ 데이터λ₯Ό μ œκ³΅ν•  수 있음 (Failover)
  • 읽기(Read) μ„±λŠ₯을 κ°œμ„ ν•  수 있음 (읽기 μš”μ²­μ„ μ—¬λŸ¬ μ„œλ²„λ‘œ λΆ„μ‚° κ°€λŠ₯)

❌ 단점

  • μ‹€μ‹œκ°„ 데이터 동기화가 μ–΄λ €μšΈ 수 있음
  • μ—¬λŸ¬ 개의 λ³΅μ œλ³Έμ„ μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ μ €μž₯ 곡간이 많이 ν•„μš”ν•¨

πŸ“ 예제

  • Master-Slave Replication (MySQL κΈ°μ€€)
  • 1.Primary(λ§ˆμŠ€ν„°) : λ°μ΄ν„°μ˜ μ“°κΈ°(Write) μž‘μ—…μ„ 처리
  • 2.Replica(슬레이브) : Primaryμ—μ„œ λ³€κ²½λœ 데이터λ₯Ό λ³΅μ œν•˜μ—¬ 읽기(Read) 처리 μ „λ‹΄
Primary(λ§ˆμŠ€ν„°) ---> Replica 1(슬레이브)
                ---> Replica 2(슬레이브)

πŸ“Œ3️⃣ λΆ„μ‚° νŠΈλžœμž­μ…˜ 관리(Distributed Transactions)

  • λΆ„μ‚° λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” μ—¬λŸ¬ 개의 λ…Έλ“œμ—μ„œ λ™μ‹œμ— νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 일관성을 μœ μ§€ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
  • 이λ₯Ό ν•΄κ²°ν•˜λŠ” λŒ€ν‘œμ μΈ 방법이 2PC (Two-Phase Commit) ν”„λ‘œν† μ½œ) μž…λ‹ˆλ‹€.

πŸ“Œ Two-Phase Commit (2PC)

  • 1️⃣ Prepare Phase : λͺ¨λ“  λ…Έλ“œμ— β€œνŠΈλžœμž­μ…˜μ„ 컀밋할 μ€€λΉ„κ°€ λ˜μ—ˆλŠ”κ°€?”λ₯Ό λ¬Όμ–΄λ΄„
  • 2️⃣ Commit Phase : λͺ¨λ“  λ…Έλ“œκ°€ β€œOK”λ₯Ό μ‘λ‹΅ν•˜λ©΄ μ‹€μ œ 컀밋 μˆ˜ν–‰
  • πŸ’Ž μž₯점 : 데이터 일관성을 보μž₯
  • πŸ’Ž 단점 : 느린 μ„±λŠ₯ (λ„€νŠΈμ›Œν¬ 지연 λ°œμƒ κ°€λŠ₯)

βœ…4️⃣ λŒ€ν‘œμ μΈ λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œ

DBMS νŠΉμ§• μ‚¬μš© 사둀
Google Spanner κΈ€λ‘œλ²Œ νŠΈλžœμž­μ…˜ 지원, 높은 ν™•μž₯μ„± Google, YouTube
CookroachDB PostgreSQL ν˜Έν™˜, μžλ™ 샀딩 지원 금육, e-commerce
MySQL Cluster μ‹€μ‹œκ°„ 데이터 처리, νŠΈλžœμž­μ…˜ 지원 ν…”λ ˆμ½€, κ²Œμž„ μ„œλ²„
Vitess MySQL 기반 샀딩 지원 YouTube, Slack
TiDB MySQL ν˜Έν™˜, Auto-Scaling 지원 ν•€ν…Œν¬, 빅데이터

βœ…5️⃣ λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 섀계 μ‹œ κ³ λ €ν•  점

  • βœ… 샀딩 ν‚€(Shard Key) μ„ μ • ➞ νŠΉμ • μƒ€λ“œμ— λΆ€ν•˜κ°€ λͺ°λ¦¬μ§€ μ•Šλ„λ‘ 섀계
  • βœ… 읽기/μ“°κΈ° λΆ€ν•˜ λΆ„μ‚° ➞ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν™œμš©ν•˜μ—¬ 읽기 μ„±λŠ₯ μ΅œμ ν™”
  • βœ… νŠΈλžœμž­μ…˜ 관리 ➞ 2PC, Saga νŒ¨ν„΄ 등을 ν™œμš©ν•˜μ—¬ 데이터 μ •ν•©μ„± μœ μ§€
  • βœ… 데이터 일관성(Consistency) vs κ°€μš©μ„±(Availability) 선택 ➞ CAP 이둠을 κ³ λ €ν•œ 섀계 ν•„μš”

βœ…6️⃣ κ²°λ‘ 

  • βœ… λΆ„μ‚° κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” κ³ κ°€μš©μ„±, ν™•μž₯μ„±, μ„±λŠ₯ ν–₯상을 μœ„ν•΄ μ‚¬μš©λ¨
  • βœ… 샀딩(Sharding)κ³Ό λ ˆν”Œλ¦¬μΌ€μ΄μ…˜(Replication)이 μ£Όμš” κ°œλ…
  • βœ… νŠΈλžœμž­μ…˜ 관리(2PC, Saga νŒ¨ν„΄)κ°€ μ€‘μš”
  • βœ… λŒ€ν‘œμ μΈ μ‹œμŠ€ν…œ: Google Spanner, CockroachDB, MySQL Cluster, TiDB