Home
>
Backend Development
>
π[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
- λΆμ° λ°μ΄ν°λ² μ΄μ€μ μ 체 ꡬ쑰 λ° λ°μ΄ν° μμΉ μ 보λ₯Ό μ μ₯
- λ°μ΄ν° λ
Έλ κ° νΈλμμ
μ μ‘°μ¨νκ³ λ°μ΄ν° μ ν©μ±μ μ μ§
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