Backend Ddevelopment
βπ[Backend Development] μ€λ©(Sharding)β
β
1οΈβ£ μ€λ©(Sharding)μ΄λ?
- μ€λ©μ νλμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬λ¬ κ°μ λ
Έλ(μλ²)λ‘ λλμ΄ μ μ₯νλ κΈ°μ μ
λλ€.
- μ¦, λ°μ΄ν°λ₯Ό μ¬λ¬ κ°μ μμ λ°μ΄ν°λ² μ΄μ€(μ€λ, Shard)λ‘ λΆν νμ¬ μ μ₯νκ³ , λΆμ°λ λ°μ΄ν°λ² μ΄μ€λ₯Ό νλμ μμ€ν
μ²λΌ λμνλλ‘ λ§λλ λ°©λ²μ
λλ€.
π‘ μ€λ©μ λͺ©μ .
-
β
μν νμ₯(Scale-Out) : μλ²λ₯Ό μΆκ°νμ¬ μ±λ₯μ νμ₯ν μ μμ΅λλ€.
-
β
λ°μ΄ν° μ²λ¦¬ μλ ν₯μ : νΉμ μ€λμμλ§ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ―λ‘ μ±λ₯ ν₯μ.
-
β
λΆν λΆμ°(Load Balancing) : νΈλν½μ μ¬λ¬ μλ²μ λΆμ°ν μ μμ΅λλ€.
β
2οΈβ£ μ€λ©μ μ’
λ₯.
- μ€λ© λ°©λ²μλ μ¬λ¬ κ°μ§ λ°©μμ΄ μμΌλ©°, λνμ μΌλ‘ λ€μκ³Ό κ°μ λ°©μλ€μ΄ μμ΅λλ€.
1οΈβ£ λ²μ μ€λ© (Range Sharding)
π κ°λ
- λ°μ΄ν°λ₯Ό νΉμ λ²μμ λ°λΌ λλμ΄ μ μ₯νλ λ°©μ
- μλ₯Ό λ€μ΄, user_id λλ λ μ§(date)λ₯Ό κΈ°μ€μΌλ‘ μΌμ λ²μλ³λ‘ λλλ λ°©λ²
β
μ₯μ
- μ€κ³κ° λ¨μνκ³ μ§κ΄μ μ
- νΉμ λ²μμ λ°μ΄ν°λ₯Ό μ‘°νν λ λΉ λ¦
β λ¨μ
- νΉμ μ€λμ λΆνκ° μ§μ€λ μ μμ (Hotspot λ¬Έμ )
- λ°μ΄ν°κ° λΆκ· ννκ² λΆν¬λ κ°λ₯μ±μ΄ μμ
π μμ
-- Shard 1 (User ID 1 ~ 10000)
INSERT INTO users_shard_1 VALUES (1001, 'Alice');
-- Shard 1 (User ID 10001 ~ 20000)
INSERT INTO users_shard_2 VALUES (15001, 'Bob')
πββοΈ μ¬μ© μ¬λ‘
-
μ¬μ©μ ID λ²μλ³ μ€λ©
- 1~10λ§λ² μ μ β Shard 1
- 10λ§~20λ§ μ μ β Shard 2
-
λ μ§ κΈ°μ€ μ€λ©
- 2023λ
λ°μ΄ν° β Shard 1
- 2024λ
λ°μ΄ν° β Shard 2
2οΈβ£ ν΄μ μ€λ© (Hash Sharding)
π κ°λ
- λ°μ΄ν°λ₯Ό νΉμ ν€(μ: user_id)μ ν΄μ ν¨μλ₯Ό μ μ©νμ¬ μ€λμ λ°°μ νλ λ°©μ
- μ: Shard = Hash(user_id) % 3 (3κ°μ μ€λκ° μμ κ²½μ°)
β
μ₯μ
- κ· λ±ν λ°μ΄ν° λΆλ°° κ°λ₯ (Hotspot λ¬Έμ ν΄κ²°)
- νΉμ μ€λμ λ°μ΄ν°κ° μ§μ€λμ§ μμ
β λ¨μ
- νΉμ μ€λμ λ²μ κ²μ(Range Query)μ΄ μ΄λ €μ
- μ‘°μΈ(Join) μ°μ°μ΄ μ΄λ €μ
π μμ
-- ν΄μ ν¨μ μ μ© (user_id % 3)
INSERT INTO users_shard_1 VALUES (1001, 'Alice'); -- 1001 % 3 = 1λ² μ€λ
INSERT INTO users_shard_2 VALUES (15001, 'Bob'); -- 15001 % 3 = 2λ² μ€λ
INSERT INTO users_shard_0 VALUES (23001, 'Charlie'); -- 23001 % 3 = 0λ² μ€λ
πββοΈ μ¬μ© μ¬λ‘
-
λλ€ν λ°μ΄ν° λΆμ°μ΄ νμν κ²½μ° (μ: μ μ λ‘κ·ΈμΈ μ 보, μΈμ
λ°μ΄ν°)
-
νΈλν½ κ· ν μ μ§κ° μ€μν μμ€ν
(μ: κΈλ‘λ² μλΉμ€, κ²°μ μμ€ν
)
3οΈβ£ 리μ€νΈ μ€λ© (List Sharding)
π κ°λ
- νΉμ κΈ°μ€(μ: κ΅κ°, μ§μ, μΈμ΄ λ±)μ λ°λΌ λ°μ΄ν°λ₯Ό λλμ΄ μ μ₯νλ λ°©μ
- μμ
- Korea λ°μ΄ν° β Shard 1
- USA λ°μ΄ν° β Shard 2
β
μ₯μ
- νΉμ κ·Έλ£Ήμ λ°μ΄ν°λ₯Ό λΉ λ₯΄κ² κ²μν μ μμ
- νΉμ μ§μ/μΉ΄ν
κ³ λ¦¬μ μ΅μ ν κ°λ₯
β λ¨μ
- νΉμ μ€λκ° κ³ΌλΆνλ κ°λ₯μ±μ΄ μμ (μ: Koreaλ 100λ§ λͺ
, Brazilμ 10λ§ λͺ
)
π μμ
-- Korean Users β Shard 1
INSERT INTO users_korea VALUES (1001, 'Alice', 'Korea');
-- USA Users β Shard 2
INSERT INTO users_usa VALUES (2001, 'Bob', 'USA');
πββοΈ μ¬μ© μ¬λ‘
-
κ΅κ°λ³ μ¬μ©μ λ°μ΄ν° μ μ₯ (μ: νκ΅ β Shard 1, λ―Έκ΅ β Shard 2)
-
μ§μλ³ μν λ°μ΄ν° μ μ₯ (μ: μμΈ β Shard 1, λΆμ° β Shard 2)
4οΈβ£ λμ μ€λ© (Dynamic Sharding)
π κ°λ
- μ¬μ©μμ μμμ λ°λΌ μλμΌλ‘ μ€λλ₯Ό νμ₯νλ λ°©μ
- κΈ°μ‘΄ μ€λ© λ°©λ²κ³Ό λ¬λ¦¬ μ¬μ μ μ€λλ₯Ό 미리 μ μνμ§ μμ
- λ°μ΄ν°κ° μ¦κ°νλ©΄ μλμΌλ‘ μλ‘μ΄ μ€λ μΆκ°
β
μ₯μ
- λ°μ΄ν° μμ΄ λμ΄λλ μ½κ² νμ₯ κ°λ₯ (Auto-Scaling)
- νΉμ μ€λκ° κ³ΌλΆνλ κ²½μ° μλμΌλ‘ λ°μ΄ν° μ¬λΆλ°° κ°λ₯
β λ¨μ
- λ°μ΄ν° μ΄λ (Rebalancing) μ μ€λ²ν€λ λ°μ
- ꡬνμ΄ λ³΅μ‘νκ³ , μΆκ°μ μΈ κ΄λ¦¬ μμ€ν
νμ
π μμ
-
CockroachDB, Google Spanner, TiDB κ°μ μμ€ν
μμ μλμΌλ‘ λμ μ€λ©μ μ§μ
πββοΈ μ¬μ© μ¬λ‘
-
ν΄λΌμ°λ κΈ°λ° νμ₯ν λ°μ΄ν°λ² μ΄μ€ (μ: AWS Aurora, Google Spanner)
- λ°μ΄ν°κ° λΉ λ₯΄κ² μ¦κ°νλ λκ·λͺ¨ μμ€ν
β
3οΈβ£ κ²°λ‘
- β
μ€λ©μ μμ€ν
μ±λ₯ ν₯μκ³Ό νμ₯μ±μ μν νμ κΈ°μ
- β
ν΄μ μ€λ©μ κ· λ±ν λ°μ΄ν° λΆλ°°μ μ 리νμ§λ§, λ²μ κ²μμ΄ μ΄λ €μ
- β
λ²μ μ€λ©μ νΉμ λ²μ κ²μμ μ 리νμ§λ§, Hotspot λ¬Έμ κ° λ°μν μ μμ
- β
ν΄λΌμ°λ κΈ°λ°μμλ λμ μ€λ©μ΄ μ μ μ€μν΄μ§κ³ μμ