Home > DB > πŸ’Ύ[Database] Hash Based Shardingμ΄λž€?

πŸ’Ύ[Database] Hash Based Shardingμ΄λž€?
Database Sharding

πŸ’Ύ[Database] Hash Based Shardingμ΄λž€?

πŸ“ Intro.

  • Hash Based Sharding은 λ°μ΄ν„°λ² μ΄μŠ€ 샀딩(β€œλ°μ΄ν„°λ₯Ό μ—¬λŸ¬ 개의 λ°μ΄ν…Œλ² μ΄μŠ€λ‘œ λ‚˜λˆ„λŠ” 기법”) 쀑 ν•˜λ‚˜λ‘œ, 데이터λ₯Ό μ €μž₯ν•  μƒ€λ“œ(Shard)λ₯Ό κ²°μ •ν•  λ•Œ ν•΄μ‹œ ν•¨μˆ˜(Hash Function)λ₯Ό μ‚¬μš©ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
    • ν•΄μ‹œ ν•¨μˆ˜(Hash Function)λ₯Ό μ΄μš©ν•΄ 데이터가 νŠΉμ • μƒ€λ“œ(Shard)에 κ· λ“±ν•˜κ²Œ λΆ„λ°°λ˜λ„λ‘ ν•˜λ©°, 데이터 뢄포와 쑰회 νš¨μœ¨μ„±μ„ μ΅œμ ν™”ν•©λ‹ˆλ‹€.

끄악!! 벌써 λ„ˆλ¬΄ μ–΄λ €μš΄ μš©μ–΄λ“€μ΄ 많이 λ‚˜μ™€μš”!! κ·Έλž˜λ„ μ°¨κ·Ό μ°¨κ·Ό μ•Œμ•„κ°€λ΄μš”!! πŸ˜†

βœ…1️⃣ 샀딩(Sharding)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

βœ… 샀딩(Sharding).

  • 샀딩(Sharding)은 데이터λ₯Ό μ—¬λŸ¬ 개의 μž‘μ€ 쑰각(Shard)으둜 λ‚˜λˆ„μ–΄ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 방법을 μ˜λ―Έν•©λ‹ˆλ‹€.
    • μ΄λŸ¬ν•œ μƒ€λ“œ(Shard)λŠ” 각기 독립적인 λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ μ„œλ²„λ‘œ λ™μž‘ν•˜λ©°, λŒ€κ·œλͺ¨ 데이터와 νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•  λ•Œ μ„±λŠ₯κ³Ό ν™•μž₯성을 ν–₯μƒμ‹œν‚€λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

βœ… 샀딩과 μƒ€λ“œ.

  • 샀딩(Sharding): β€œλ°μ΄ν„°λ₯Ό μ—¬λŸ¬ 개의 μž‘μ€ 쑰각(Shard)으둜 λ‚˜λˆ„μ–΄ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 방법.”
  • μƒ€λ“œ(Shard): λ°μ΄ν„°λ² μ΄μŠ€ μƒ€λ”©μ—μ„œ ShardλŠ” 데이터λ₯Ό μ €μž₯ν•˜λŠ” β€œλ…λ¦½λœ λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ μ„œλ²„β€λ₯Ό 가리킴.

βœ… 샀딩이 μ™œ ν•„μš”ν•˜μ§€?

    1. μ„±λŠ₯ 문제 ν•΄κ²°!
      • β€œλ³‘λͺ© ν˜„μƒμ„ 쀄일 수 μžˆμ–΄μš” :)”
      • λ°μ΄ν„°λ² μ΄μŠ€μ— 데이터가 λ§Žμ•„μ§€λ©΄ 쿼리 속도가 λŠλ €μ§€κ³  μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμ–΄μš”. πŸ‘Ž
        • β€œμƒ€λ”©(Sharding)을 톡해 데이터λ₯Ό λ‚˜λˆ„λ©΄ 각 μƒ€λ“œ(Shard)κ°€ λ…λ¦½μ μœΌλ‘œ μ²˜λ¦¬λ˜λ―€λ‘œ, 병λͺ© ν˜„μƒμ„ 쀄일 수 μžˆμ§€μš”β€
    1. ν™•μž₯μ„± 확보!
      • β€œμƒ€λ”©μ„ 톡해 μ—¬λŸ¬ μ„œλ²„λ₯Ό μΆ”κ°€ν•˜μ—¬ ν™•μž₯이 κ°€λŠ₯ν•΄μš” :)”
      • 데이터가 κΈ‰κ²©νžˆ μ¦κ°€ν•˜κ±°λ‚˜, νŠΈλž˜ν”½μ΄ λ§Žμ•„μ§ˆ 경우 단일 λ°μ΄ν„°λ² μ΄μŠ€λ‘œλŠ” 감당할 수 μ—†μ–΄μš”.
        • λ•Œλ¬Έμ— β€œμƒ€λ”©μ„ 톡해 μ—¬λŸ¬ μ„œλ²„λ₯Ό μΆ”κ°€ν•˜μ—¬ ν™•μž₯이 κ°€λŠ₯ν•˜μ§€μš”.”
    1. μ‹ λ’°μ„± 및 κ°€μš©μ„± ν–₯상!
      • β€œν•˜λ‚˜μ˜ μƒ€λ“œκ°€ μž₯μ• λ₯Ό κ²ͺ더라도 λ‹€λ₯Έ μƒ€λ“œλŠ” μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜μ—¬ μ„œλΉ„μŠ€ 쀑단을 λ°©μ§€ν•΄μš”.”

βœ… μƒ€λ”©μ˜ μž‘λ™ 원리λ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€!

  • 샀딩은 데이터λ₯Ό μ €μž₯ν•  λ•Œ νŠΉμ • 기쀀에 따라 λ‚˜λˆ•λ‹ˆλ‹€.
    • 이 기쀀에 따라 μ–΄λ–€ 데이터λ₯Ό μ–΄λ–€ μƒ€λ“œμ— μ €μž₯ν• μ§€ κ²°μ •λ©λ‹ˆλ‹€.

      1️⃣ μƒ€λ“œ ν‚€(Shard Key)

  • 데이터λ₯Ό λ‚˜λˆŒ λ•Œ μ‚¬μš©ν•˜λŠ” 기쀀이 λ˜λŠ” ν‚€.
    • 예: μ‚¬μš©μž ID, λ‚ μ§œ, νŠΉμ • λ°μ΄ν„°μ˜ ν•΄μ‹œ κ°’.

      2️⃣ μƒ€λ“œ ν• λ‹Ή

  • μƒ€λ“œ ν‚€λ₯Ό 기반으둜 데이터λ₯Ό νŠΉμ • μƒ€λ“œμ— λΆ„λ°°.
    • 예:
      shard = hash(UserID) % number_of_shards
      
  • μœ„ 식에 따라 데이터λ₯Ό μƒ€λ“œμ— ν• λ‹Ήν•©λ‹ˆλ‹€.

βœ… μƒ€λ”©μ˜ μž₯점은 λ¬΄μ—‡μΌκΉŒμš”?

    1. ν™•μž₯μ„±(Scalability)!
      • 데이터λ₯Ό λΆ„μ‚° μ €μž₯ν•˜μ—¬ μˆ˜ν‰μ  ν™•μž₯이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
      • 예: μ„œλ²„λ₯Ό μΆ”κ°€ν•˜λ©΄ 더 λ§Žμ€ 데이터λ₯Ό μ €μž₯ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    1. μ„±λŠ₯ ν–₯상!
      • 데이터가 λΆ„μ‚°λ˜λ―€λ‘œ 각 μƒ€λ“œμ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•  λ°μ΄ν„°λŸ‰μ΄ 쀄어듀어 쿼리 μ„±λŠ₯이 ν–₯μƒλ©λ‹ˆλ‹€.
    1. κ°€μš©μ„±!
      • νŠΉμ • μƒ€λ“œμ— μž₯μ• κ°€ λ°œμƒν•΄λ„, λ‹€λ₯Έ μƒ€λ“œλŠ” μ •μƒμ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

βœ… μƒ€λ”©μ˜ 단점은 λ¬΄μ—‡μΌκΉŒμš”?

    1. λ³΅μž‘μ„±μ˜ 증가.
      • 데이터λ₯Ό λ‚˜λˆ„κ³  κ΄€λ¦¬ν•˜λŠ” 좔가적인 둜직이 ν•„μš”ν•©λ‹ˆλ‹€.
      • μƒ€λ“œ κ°„ 데이터λ₯Ό μ‘°νšŒν•΄μ•Ό ν•˜λŠ” 경우(쑰인 쿼리) κ΅¬ν˜„μ΄ λ³΅μž‘ν•΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    1. 데이터 μž¬λΆ„λ°° λΉ„μš©.
      • μƒ€λ“œμ˜ 개수λ₯Ό λŠ˜λ¦¬κ±°λ‚˜ 쀄일 경우, 데이터λ₯Ό μž¬λΆ„λ°°ν•΄μ•Ό ν•˜λ©° μ΄λŠ” μ‹œκ°„μ΄ 많이 μ†Œμš”λ©λ‹ˆλ‹€.
    1. ν•«μŠ€νŒŸ 문제.
      • νŠΉμ • μƒ€λ“œμ— 데이터가 λͺ°λ¦¬λ©΄ ν•΄λ‹Ή μƒ€λ“œμ— κ³ΌλΆ€ν•˜κ°€ κ±Έλ¦¬λŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

βœ… μƒ€λ”©μ˜ μ’…λ₯˜μ—λŠ” 무엇이 μžˆμ„κΉŒμš”?

1️⃣ Range Based Sharding(λ²”μœ„ 기반 샀딩)

  • λ°μ΄ν„°μ˜ λ²”μœ„μ— 따라 μƒ€λ“œλ₯Ό λ‚˜λˆ•λ‹ˆλ‹€.
    • 예: μ‚¬μš©μž IDκ°€ 11000은 μƒ€λ“œ 1, 10012000은 μƒ€λ“œ 2.
    • μž₯점: νŠΉμ • λ²”μœ„μ˜ 데이터λ₯Ό μ‘°νšŒν•  λ•Œ νš¨μœ¨μ μž…λ‹ˆλ‹€.
    • 단점: νŠΉμ • λ²”μœ„μ— 데이터가 λͺ°λ¦΄ 경우, μƒ€λ“œκ°€ λΆˆκ· ν˜•ν•΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ Hash Based Sharding(ν•΄μ‹œ 기반 샀딩)

  • λ°μ΄ν„°μ˜ ν•΄μ‹œ 값을 κΈ°μ€€μœΌλ‘œ μƒ€λ“œλ₯Ό λ‚˜λˆ•λ‹ˆλ‹€.
    • 예: shard = hash(UserID) % number_of_shards
    • μž₯점: 데이터가 κ· λ“±ν•˜κ²Œ λΆ„λ°°λ©λ‹ˆλ‹€.
    • 단점: μƒ€λ“œ 개수 λ³€κ²½ μ‹œ λͺ¨λ“  데이터λ₯Ό μž¬λΆ„λ°°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

3️⃣ Directory Based Sharding(디렉토리 기반 샀딩)

  • μƒ€λ“œ 킀와 μƒ€λ“œλ₯Ό λ§€ν•‘ν•œ λ³„λ„μ˜ 디렉토리(λ§€ν•‘ ν…Œμ΄λΈ”)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
    • μž₯점: μœ μ—°ν•˜κ²Œ 데이터λ₯Ό λΆ„λ°°κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • 단점: λ§€ν•‘ ν…Œμ΄λΈ” κ΄€λ¦¬μ˜ λ³΅μž‘μ„±μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.

βœ…2️⃣ Hash Based Sharding의 μž‘λ™ 방식은 μ–΄λ–»κ²Œ λ κΉŒμš”?

1️⃣ ν•΄μ‹œ ν•¨μˆ˜(Hash Function).

  • ν•΄μ‹œ ν•¨μˆ˜λŠ” μž…λ ₯κ°’(예: User ID, Order ID λ“±)을 λ°›μ•„μ„œ κ³ μ •λœ 크기의 숫자(ν•΄μ‹œ κ°’)둜 λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
    • 예: hash(UserID) = 123456

      2️⃣ μƒ€λ“œ ν• λ‹Ή.

  • ν•΄μ‹œ 값을 μƒ€λ“œμ˜ 개수둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ κ°’(Modulo)을 κ³„μ‚°ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•  μƒ€λ“œλ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.
    • 예: shard = hash(UserID) % number_of_shards
    • μƒ€λ“œκ°€ 3개이고, hash(UserID) = 123456이라면?
      shard = 123456 % 3 = 0
      
  • λ”°λΌμ„œ λ°μ΄ν„°λŠ” μƒ€λ“œ 0에 μ €μž₯λ©λ‹ˆλ‹€.

3️⃣ 데이터 μ €μž₯.

  • ν•΄μ‹œ 값을 κ³„μ‚°ν•œ 결과에 따라, ν•΄λ‹Ή 데이터λ₯Ό νŠΉμ • μƒ€λ“œμ— μ €μž₯ν•©λ‹ˆλ‹€.

βœ…3️⃣ Hash Based Sharding의 μž₯점.

1️⃣ κ· λ“± λΆ„λ°°.

  • ν•΄μ‹œ ν•¨μˆ˜λŠ” 데이터λ₯Ό 각 μƒ€λ“œμ— κ· λ“±ν•˜κ²Œ λΆ„λ°°ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
    • λ”°λΌμ„œ νŠΉμ • μƒ€λ“œμ— 데이터가 λͺ°λ¦¬λŠ” ν˜„μƒ(ν•«μŠ€νŒŸ)이 μ€„μ–΄λ“­λ‹ˆλ‹€.

      2️⃣ 쑰회 μ„±λŠ₯ μ΅œμ ν™”.

  • 데이터λ₯Ό νŠΉμ • μƒ€λ“œμ—λ§Œ μ‘°νšŒν•˜λ©΄ λ˜λ―€λ‘œ, 전체 μƒ€λ“œλ₯Ό 탐색할 ν•„μš”κ°€ μ—†μ–΄ μ„±λŠ₯이 ν–₯μƒλ©λ‹ˆλ‹€.

    3️⃣ 섀계 λ‹¨μˆœν™”.

  • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 μƒ€λ“œλ₯Ό κ²°μ •ν•˜κΈ° λ•Œλ¬Έμ— λ³΅μž‘ν•œ 샀딩 둜직이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

βœ…4️⃣ Hash Based Sharding의 단점.

1️⃣ μƒ€λ“œ μΆ”κ°€/μ‚­μ œμ˜ 어렀움.

  • μƒ€λ“œ μˆ˜κ°€ λ³€κ²½λ˜λ©΄ ν•΄μ‹œ 값이 μž¬κ³„μ‚°λ˜μ–΄ κΈ°μ‘΄ λ°μ΄ν„°μ˜ μœ„μΉ˜κ°€ λ°”λ€λ‹ˆλ‹€.
    • 예: μƒ€λ“œκ°€ 3κ°œμ—μ„œ 4개둜 μ¦κ°€ν•˜λ©΄, λ°μ΄ν„°μ˜ 재배치λ₯Ό ν”Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

      2️⃣ λ³΅μž‘ν•œ 데이터 이동.

  • μƒ€λ“œ μˆ˜κ°€ λ³€κ²½λ˜λ©΄, λͺ¨λ“  데이터λ₯Ό μƒˆλ‘œμš΄ μƒ€λ“œ ꡬ쑰에 맞게 이동해야 ν•©λ‹ˆλ‹€.

    3️⃣ 쑰인 μ—°μ‚°μ˜ 어렀움.

  • μ„œλ‘œ λ‹€λ₯Έ μƒ€λ“œμ— μ €μž₯된 데이터λ₯Ό 쑰인해야 ν•˜λŠ” 경우, μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

    4️⃣ ν•«μŠ€νŒŸ 문제(νŠΉμ • ν‚€μ˜ κ³Όλ„ν•œ μš”μ²­).

  • ν•΄μ‹œ ν•¨μˆ˜κ°€ κ· λ“± λΆ„λ°°λ₯Ό 보μž₯ν•˜μ§€ λͺ»ν•˜κ±°λ‚˜ νŠΉμ • 킀에 집쀑적인 μš”μ²­μ΄ λ°œμƒν•  경우, νŠΉμ • μƒ€λ“œμ— λΆ€ν•˜κ°€ 집쀑될 수 μžˆμŠ΅λ‹ˆλ‹€.