본문 바로가기

ComputerScience/Database

[Database] 데이터베이스의 파티셔닝, 샤딩, 레플리케이션

파티셔닝(Partitioning)

  • 파티셔닝은 테이블을 더 작은 크기의 테이블로 나누는 것으로, Vertical Partitioning과 Horizontal Partitioning으로 나눌 수 있다.
  • Vertical Partitioning은 컬럼을 기준으로 테이블을 나누는 방식으로, 데이터 테이블을 정규화하기 위해 사용될 수도 있으며, 다른 경우에도 활용할 수 있다.
  • Vertical Partitioning을 통해 컬럼을 나눠 서로 다른 테이블에 저장할 수도 있으며, 게시판에서 게시물의 조회수, 댓글 수 등을 별도의 테이블로 나눠 저장할 수 있다.
  • Horizontal Partitioning은 행을 기준으로 테이블을 나누는 방식이다.

Vertical Partitioning으로 컬럼 기준으로 테이블을 나누어 데이터 조회 성능 향상 가능

  • 데이터 필터링으로 하드디스크 불필요한 I/O 부담을 줄임, 데이터 분리로 성능 향상할 수 있다.
  • 예를 들어, 백엔드에서 쿼리문을 사용하여 게시글 목록에 사용할 게시글 데이터를 필터링하여 필요한 정보만 가져오는데 글의 내용 데이터는 필요하지 않아서 필터링하여 중요한 정보만 가져오도록 한다.
  • 하드디스크나 SSD에서 전체 데이터를 읽고 메모리에 올린 다음 필터링하여 가져오기 때문에, I/O 부담이 생기고 시간적인 낭비를 초래할 수 있다.
  • 이런 경우, 컬럼을 기준으로 데이터를 분리하는 Vertical Partitioning을 사용하여 성능을 향상할 수 있다.
  • 정규화가 되어 있는 경우라도  Vertical Partitioning닝으로 성능 향상이 가능하다.
  • Vertical Partitioning을 사용하면 민감한 정보에 제한을 더 할 수도 있고, 자주 사용되는 애트리뷰트들끼리 모아서 파티션으로 만들어 성능을 높일수 있다.
Vertical Partitioning

Horizontal Partitioning으로 인덱스 처리 시간 최적화

  • 유튜브로 예를 들면 사용자 수를 n, 채널 수를 m이라고 했을때 구독 테이블이 가질 수 있는 최대 행 수는 n x m이다.
  • 따라서, 100만 명의 사용자와 1000개의 채널이 있다면, 서브스크립션 테이블이 가질 수 있는 최대 로우 수는 10억 개이다.
  • 테이블에 저장되어 있는 데이터 수가 많아지면 테이블만 커지는 게 아니라, 이에 걸려있는 인덱스의 크기도 점점 커지며, 읽기나 쓰기 시 인덱스 처리 시간이 조금씩 늘어나게 된다.
  • 이를 해결하기 위해 Horizontal Partitioning 기법을 사용한다.
  • Horizontal Partitioning은 로우를 기준으로 테이블을 나눈다. 테이블의 스키마는 변화가 없이 그대로 유지된다.
  • hash-based Horizontal Partitioning은 Hash함수를 사용하여 데이터를 나누고, 여러 개의 테이블로 분할한다.

Horizontal Partitioning 및 파티션 키 이용해 데이터를 나눠 저장하는 방법

  • Horizontal Partitioning은 hash function을 이용해 파티션을 나눠 저장하는 방법임.
  • Hash function을 기반으로 데이터가 구분되는 키를 파티션 키라고 함.
  • 파티션 키를 기준으로 데이터 두 개의 테이블로 나눠 저장됨.
  • 파티션 키가 변할 경우 두 테이블에 대해 모두 조회해야 함.
  • 데이터가 균등하게 분배되도록 해시 함수를 잘 정의하는 것도 중요하다.
  • 이 밖에도 Range based Horizontal Partitioning 등 다양한 방법이 있다.
Horizontal Partitioning

샤딩(Sharding)과 레플리케이션(Replication)

  • 샤딩은 각 테이블을 서로 다른 DB 서버에 각 기기로부터 들어오는 요청을 분산시켜 DB서버 부하를 낮추는 방식이며, 샤드 키와 샤드를 사용한다.
  • 샤딩과 달리 Horizontal Partitioning은 모든 Partition들을 같은 DB 서버에 저장하는데, 이는 DB서버에 부하를 줄 수 있다.
  • 레플리케이션은 DB서버에 문제가 생겼을 때 데이터 복제로 서비스 이상을 방지하는 방식이다.
  • DB 서버에서 데이터 요청이 밀려서 메모리, CPU 사용량의 한계가 되는 현상과 서버 문제시 데이터 복제 등 제대로된 기능으로 서비스 유지할 수 있도록 한다.
  • 샤딩에서 샤드 키와 샤드, 레플리케이션에서는 레플리카를 이용해 DB 서버의 과부하 및 문제 상황을 방지한다.
Sharding

️레플리케이션: 레플리카 서버로 데이터 동기화하는 방

  • 주 DB 서버와 같은 데이터베이스가 복사된 레플리카 서버를 구축하여, 항상 같은 데이터를 가지게 한다.
  • DB 서버의 데이터 변경시, 레플리카 서버에서도 반영된다.
  • '마스터', '프라이머리', '리더'는 주 DB 서버, '슬레이브', '세컨더리', '레플리카'는 레플리카 서버를 부르는 호칭이다.

데이터베이스 레플리케이션의 장점과 특성

  • DB Secondary 서버를 여러 대를 유지하여 서비스의 고가용성을 보장할 수 있다.
  • 고가용성(High Availablility)이란 서버에 문제가 생겨도 중단되지 않고 계속해서 정상적으로 동작하는 능력이다.
  • 레플리케이션을 통해 서버에 문제가 생겨도 백엔드 서버가 DB 서버로 빠르게 변경되어 서비스의 타격을 최소화할 수 있다. 이를 Fail Over 라고 한다.
  • 레플리케이션을 구성하면 리드 쿼리를 분산하여 DB 서버의 부하를 줄이고 리드 트래픽을 잘 처리할 수 있다.

참고