Home > Backend Development > πŸ“š[Backend Development] 샀딩(Sharding)

πŸ“š[Backend Development] 샀딩(Sharding)
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 λ¬Έμ œκ°€ λ°œμƒν•  수 있음
  • βœ… ν΄λΌμš°λ“œ κΈ°λ°˜μ—μ„œλŠ” 동적 샀딩이 점점 μ€‘μš”ν•΄μ§€κ³  있음