kimyu0218
  • [DB/쉬운코드] 파티셔닝과 샤딩
    2024년 05월 18일 04시 00분 37초에 업로드 된 글입니다.
    작성자: @kimyu0218

    파티셔닝 & 샤딩

    파티셔닝은 큰 테이블을 작은 크기의 테이블로 나누는 과정으로, 데이터베이스의 성능을 향상시킬 수 있다. 파티셔닝은 크게 두 종류로 나뉘는데, vertical partitioning은 column을 기준으로, horizontal partitioning은 row를 기준으로 테이블을 나눈다.

     

    vertical partitioning은 테이블의 열을 기준으로 데이터를 분리한다. 정규화 뿐만 아니라 성능을 위해 열을 별도로 분리할 수 있다. 포스팅에 대한 테이블에서 내용 속성인 `content`를 별도의 테이블로 분리하면, 포스팅 목록 조회 시 더 이상 무거운 `content`를 조회하지 않아도 된다.

    이외에도 민감한 정보는 함부로 조회하지 못하도록, 자주 사용하는 속성만 모아 성능을 향상시킬 목적으로 사용될 수 있다. 

     

    horizontal partitioning은 테이블의 행을 기준으로 데이터를 분리하는 방법이다. 행을 기준으로 나누기 때문에 각 파티션은 동일한 스키마를 가진다. 테이블의 크기가 커지면 인덱스의 크기도 커지기 때문에 테이블을 변경할 때마다 인덱스를 처리하는 시간이 점차 늘어나게 된다. 이러한 성능 저하를 방지하기 위해 horizontal partitioning을 사용한다.

     

    일반적으로 해시 기반의 horizontal partitioning을 많이 사용한다.

    1. 데이터베이스는 데이터를 몇 개의 파티션으로 나눌지 결정한다.
    2. 데이터를 파티션에 분배할 때 사용할 해시 함수를 선택한다.
    3. 데이터 추가 시, 파티션 키에 해시 함수를 적용하여 해시 값을 계산하고, 이를 바탕으로 저장할 파티션을 결정한다.
    🚨 해시 함수를 잘 정의하여 데이터가 균등하게 분배될 수 있도록 해야 한다.
    🚨 해시 기반 파티셔닝은 range 비교가 불가능하므로 특정 범위의 데이터를 조죄하는 쿼리에는 적합하지 않다. 

     

    샤딩은 horizonatl partitioning과 유사하나 각 shard (≒ 파티션) 가 독립된 DB 서버에 저장된다는 점에서 차이가 있다. 즉, 데이터가 서로 다른 DB 서버에 있으므로 DB의 부하를 분산시킬 수 있다.

      vertical partitioning horizontal partitioning sharding
    분리 기준
    동일한 DB 서버 O O X
    💡 replication
    • 데이터를 한 데이터베이스 서버에서 다른 서버로 복제하는 과정
    • read 요청을 여러 서버에 분산시켜 서버의 부하를 낮출 수 있다.
    • 데이터를 다른 위치 (slave) 에 복제함으로써 write 하는 서버 (master) 에 문제가 생겼을 때 빠르게 복구할 수 있다. (= HA 보장!)
    master-slave replication

    참고자료

    댓글