BackEnd Developer, Love Crossfit, Welcome to Jay's blog

대용량 DB - 샤딩(Sharding) 이란

|

Index

  • 샤딩이란?
  • 샤딩의 장단점
  • 샤딩 방법
    • Key Based Sharding
    • Range Based Sharding
    • Entry Group
  • 샤딩을 이용하기 전에
  • 정리
  • references

Sharding(샤딩)이란


  • 하나의 큰 테이블을 여러 작은 테이블로 쪼개어 분산 저장하는 방법

  • 용량의 한계와 성능 저하를 높이기 위해 사용

    • 데이터를 여러 서버에 나누어 저장함으로써 용량 한계 극복
    • 스캔할 데이터 수를 줄여 검색 성능 향상
  • 분산된 각 DB들을 샤드(Shard)라고 한다.

  • 분할 방법으로 크게 수직 분할과 수평 분할이 있으며 수평분할에는 해시함수를 이용한 방법, Locator Service를 이용한 방법, 관계 있는 엔티티끼리 모아서 나누는 방법 등이 있다.


alt text


Sharding(샤딩)의 장단점


Sharding(샤딩)의 주요 관점


  • 분산된 DB에 Data를 어떻게 잘 분산시킬 것인가?

  • 분산된 DB에서 어떻게 Data를 읽어 올 것인가?

=> Shard Key를 어떻게 정의하는지에 따라 달라진다.

샤드키는 나눠진 샤드 중 어떤 샤드를 선택할지 결정하는 키로, 샤드키 결정 방식에 따라 샤딩 방법이 나뉘게 된다.


Sharding(샤딩) 방법

Key Based Sharding

  • 해시함수를 이용한 방법
  • 보통 Database ID와 modular 연산을 통해 분할 저장한다
  • mod(Hash(key), N)

alt text

장점

  • 구현이 간단하다
  • 같은 값 가지는 key-value 데이터베이스에 적합하다
  • 알고리즘적으로 데이터를 분배하기 때문에 range와 directory와 달리 데이터가 어디에 위치해있는지 알려주는 map이 필요 없다

단점

  • 서버 수가 변하게 되면 hash 함수가 변하게 되고 기존의 Data 분산 규칙이 어긋나게 되서 샤딩을 다시 해야 할 수도 있다.
  • 확장성에 좋지 않다

Dynamic Sharding

  • Key Based Sharding의 확장성 문제를 해결하기 위해 나온 방법
  • 각 엔트리 데이터의 위치(샤드ID)를 알고 있는 테이블 형태의 Locator Service를 이용하는 방법

alt text

장점

  • 샤드가 추가되면 Locator Service에 샤드키만 추가해주면 된다.
  • 확장에 유연하게 대처 가능

단점

  • Locator Service에 의존적
  • 데이터가 이동되면 Locator Service의 Shard Key Table도 같이 작업해줘야 한다.
  • Locator Service가 단일 장애 지점(SPOF)이 되므로, Locator Service에 장애 발생시 나머지 샤드 또한 문제 발생 가능

Entity Group

  • 앞의 두 샤딩 방식은 Key-Value 형태를 지원하기 위해 나온 방법이다.(NoSQL에 최적화)
  • 이 방식은 Key-Value 형태가 아닌 RDB에 어울리는 방식이다.
  • 연관성 있는 엔티티를 동일한 샤드 안에 두는 방식이다.

alt text

장점

  • 같은 샤드 안에 있는 데이터 조회시 효과적
  • 데이터는 자연스럽게 사용자별로 분리되어 저장되고
  • 사용자가 늘어남에 따라 확장성이 좋은 구조이다.

단점

  • 다른 샤드에 있는 데이터를 함께 조회시 성능이 떨어짐


샤딩을 이용하기 전에 (추후 보완 하기)

Sharding 하기 전, 데이터베이스를 최적화 할 수 있는 다른 옵션들을 검토해야 한다.

  • 캐싱
    • 읽기 퍼포먼스가 문제라면, 캐싱도 좋은 방법이다. 이미 요청된 데이터들을 일시적으로 메모리에 저장하고, 나중에 접근할 수 있도록 한다.


정리


샤딩은 확장성 문제를 해결하기 위한 방법 중 하나이다.

확장성(scalability)이란 시간이 지남에 따라 생겨나는 변화를 받아 들이는 능력이다.

시간이 지남에 따라 서비스는 대체로 사용자 수가 증가하기 때문에 결국 더 많은 사용자가 만들어 내는 데이터들을 처리해 낼 수 있어야 한다.

이렇게 늘어나는 데이터들을 잘 읽고 쓰기 위해서 우리는 샤딩이라는 방법을 상황에 맞게 적절히 사용할 수 있어야 한다.


references

https://hazelcast.com/glossary/sharding/ https://www.digitalocean.com/community/tutorials/understanding-database-sharding https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6 https://woowabros.github.io/experience/2020/07/06/db-sharding.html