[데이터베이스] 파티셔닝(Partitioning) & 샤딩(Sharding)
파티셔닝이란?
큰 테이블이나 인덱스를 관리하기 쉬운 크기로 분리하는 방법
테이블을 나눠가지는 방식에 따라 파티셔닝은 크게 수평 파티셔닝과 수직 파티셔닝으로 나눌 수 있다.
1. 수평(horizontal) 파티셔닝
하나의 테이블의 각 행을 다른 테이블에 분산시키는 방식이다.
스키마(schema)를 복제한 후 키를 기준으로 데이터를 나누는 것을 말한다.
즉, 스키마(schema)가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것을 말한다.
데이터의 개수가 작아지고 따라서 index의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다.
2. 수직(vertical) 파티셔닝
관계형 DB에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다. 일반적으로 엔티티를 분리할 때처럼, 컬럼을 나눠 새로운 테이블로 만들어서 나눠갖는 것이다.
이렇게 나누는 경우는 보통 어떤 컬럼이 빈번하게 참조될 때다.
왜냐면 한 row가 작아서 상대적으로 여러 row가 캐시에 올라갈 수 있고, 이는 즉 해당 컬럼의 여러 데이터가 캐시에 올라갈 수 있다는 말이 되어 hit rate가 좋아진다.
파티셔닝 장점
성능 향상
- 데이터를 나누어 여러 테이블에 저장하는 것으로 성능 향상(인덱스 크기가 작아지기 때문)
- 인덱스 크기가 작아지면 자연스레 인덱스를 통한 조회시간이 줄어드므로 성능이 향상
- 테이블이 너무 크면 인덱스의 크기가 거져서 인덱스를 모두 메모리에 올려 처리할 수가 없게 되면 성능상 문제가 된다. 파티셔닝을 하면 인덱스도 같이 파편화 되기 때문에 메모리를 효율적으로 사용할 수 있다.
파티셔닝 단점
- 테이블 간 join 비용 증가
DB 파티셔닝(Partitioning)의 분할 기준
데이터베이스 관리 시스템은 분할에 대해 각종 기준(분할 기법)을 제공하고 있다. 분할은 ‘분할 키(partitioning key)’를 사용한다.
- 범위 분할 (range partitioning) : 분할 키 값이 범위 내에 있는지 여부로 구분한다. 예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
- 목록 분할 (list partitioning) : 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다. 파티셔닝 할 항목을 관리자가 직접 지정하는 방식이다. 예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.
- 해시 분할 (hash partitioning) : 해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다. 예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.
- 합성 분할 (composite partitioning) : 상기 기술을 결합하는 것을 의미하며, 예를 들면 먼저 범위 분할하고, 다음에 해시 분할 같은 것을 생각할 수 있다. 컨시스턴트 해시법은 해시 분할 및 목록 분할의 합성으로 간주 될 수 있고 키 공간을 해시 축소함으로써 일람할 수 있게 한다.
샤딩이란?
대부분 포스팅에서 수평 파티셔닝과 샤딩을 완전히 같은거라고 한 경우가 많다. 하지만 더 찾아본 결과 충격적으로 다른 차이점이 존재했다.
샤딩은 테이블을 수평으로 쪼개 여러 테이블로 만드는 행위는 파티셔닝과 같지만 결정적인 차이는 이것이다.
샤딩은 쪼갠 테이블을 여러 인스턴스(다른 데이터베이스)에 저장하는 반면, 파티셔닝은 하나의 인스턴스(같은 데이터베이스)의 여러 테이블에 저장하는 것을 말한다.
- X테이블은 A디비, Y테이블은 B디비 형식으로 나눠 가지는건 샤딩이 아니다.
- X테이블의 일부를 A디비, X테이블의 다른 일부를 A디비에 나눠 저장하는건 수평 파티셔닝이다.
- X테이블의 일부분은 A디비, X테이블의 다른 일부분은 B디비 형식으로 테이블을 나눠 가지는 것이 샤딩이다.
같은 기능을 하기 때문에 파티셔닝과 같은 장점(성능 향상)을 가지는데 추가적인 장점과 단점이 있다.
배경
저장해야 하는 정보가 많은 대규모 시스템의 경우 하나의 DB에 모든 정보를 저장해서는 제대로 된 응답성을 기대할 수 없다.
왜냐하면 read가 많이 발생하든, write가 많이 발생하든 DB 저장하는 정보가 많을 수록 스캔 속도도 느려지고, 요청이 많은 경우 큐에 작업이 쌓이면서 응답도 느려진다.
여러 DB서버로 요청을 분산하여 성능을 향상시키고 싶다. 어떻게 할 수 있을까?
먼저 배운 Replication을 생각 해보자. Read를 분산시켜 요청을 분산시킬 수 있다.
하지만 이 방법으로는 write는 분산되지 않는다.
샤딩은 여러 개의 DB가 모두 같은 전체 데이터를 가지고 있고 응답만 분산하는 형태가 아니라, 각각의 DB가 데이터를 일부분씩 나눠 가지고 있도록 구성할 수 있다.
이렇게 되면 Read 뿐만 아니라 Write 요청또한 각 DB가 분산하여 처리할 수 있다.
장점과 단점
즉 추가적인 장점은 파티셔닝과 달리 요청을 여러 DB서버로 분산하여 처리가 가능해 더 성능을 개선할 수 있다는 것이다.
단점은 두 샤딩 DB 간에 조인이 불가능하다는 것이다.