Sharding, Partitioning

데이터베이스의 볼륨이 커질수록 RW 시 성능은 감소할 것이고, 병목지점이 될 확률이 높다.

따라서 이를 적절하게 분할 저장할 필요가 있는데, 샤딩과 파티셔닝은 그 방법중 하나이다.

둘의 개념과 그 차이점에 대해서 알아볼텐데, 우선 기본적으로 Horizontal 과 Vertical 에 대해서 짚고 넘어가자.

Horizontal vs Vertical

  • Horizontal: 레코드별로 분리하는 수평 분할을 뜻한다. 스키마 복제 후 사용자가 지정한 기준으로 분리한다.

  • Vertical: 스키마를 나누고 스키마에 따라 데이터가 분산되는 것을 뜻한다. 분할이 쉽지만, 변경이 일어나는 경우 추가 정렬이 필요할 수 있다.

Partitioning

파티셔닝은 데이터베이스의 분할을 나타내는 용어이나 일반적으로는 테이블을 여러 하위 집합으로 분리하는 것을 말한다.

Vertical Paritioning(수직 파티셔닝)

하나의 테이블 내에서 컬럼을 기준으로 분리하는 것을 말한다.

한 테이블에 매우 큰 데이터를 포함하는 컬럼이 있거나 너무 많은 컬럼이 존재하는 경우 테이블에 접근하는 비용이 매우 커진다.

이럴때 수직 파티셔닝을 통해 자주 접근하는 컬럼을 기준으로 테이블을 분리하여 성능 향상을 노려볼 수 있다.

Horizontal Partitioning

레코드 수가 많은, 데이터가 많이 축적된 테이블의 레코드를 수평으로 분할 하는 방법이다.

이 때 몇 가지 방법이 있다. 이 글에서 따로 다루지는 않는다.

  • Range

  • List

  • Hash

  • ...

파티셔닝을 사용하는 경우 PK 나 Unique key 의 변경이 필요할 수 있다.

테이블의 PK, Unique key 는 파티션 키가 포함되어야 하기 때문이다.

예를 들어, user_id 를 pk 로 사용하는 테이블을 created_at 으로 Range paritioning 하고자 할 수 있다.

이런 경우는 (user_id, created_at) 으로 PK 를 변경해주어야 한다.

Sharding

큰 테이블을 동일한 스키마를 가진 여러 데이터베이스 서버에 shard 단위로 분산 저장하는 방법이다.

물리적으로 다른 서버에 저장하기 때문에 트래픽이 분산되고, 가용성이 늘어난다.

반대로 여러 샤드에 있는 데이터를 조인할 때에는 어려움이 생긴다.

증가하는 워크로드에 따라 부하 분산이 필요한 경우나, 비대해진 데이터 볼륨으로 인해 복제 지연, 읽기/쓰기 성능 저하를 개선하기위해 스케일업을 고려할 수 있으나, 물리적인 한계로 더 이상 스케일업이 불가능한 시점이 오면 샤딩을 고려하는 것이 좋다.

반대로 말해서, 일정 수준까지는 스케일업을 하는게 더 좋을 수도 있을수 있겠다.

Horizontal Sharding

파티셔닝과 마찬가지로 기준에 따라 나뉜다.

  • Range: 컬럼 값으로 샤드를 지정하는, 파티셔닝에서의 Range 와 같은 방식이다.

  • Hash: Hash 함수를 통해 반환되는 값으로 샤드를 결정하는 방법이다.

  • ...

Last updated