정리

<aside> 💡

대규모의 데이터셋은 조회 시 성능이 떨어진다. 이를 데이터 파티셔닝을 통해서 분산 DB에 저장함으로써 성능을 개선할 수 있다. 데이터 파티셔닝 시 키 또는 해시값 기준으로 파티셔닝 전략을 선택할 수 있으며, 특정 노드에 부하가 집중되는 핫스팟 문제가 발생하기도 한다. 이 핫스팟 문제를 해결하기 위해서 적절한 파티셔닝 키를 사용하거나 동적으로 재파티셔닝을 해주는 방법이 있다.

</aside>

데이터 파티셔닝

대용량의 데이터는 조회 쿼리의 성능을 떨어뜨린다. 따라서 1개의 DB에 전부 저장하지 않고 특정 기준을 정해서 여러 DB에 데이터를 나눠서 저장하는 것을 데이터 파티셔닝이라고 한다. 날짜 기준으로 파티션을 했을 때, 조회 시 해당 날짜의 파티션만 조회하면 데이터 검색 범위를 크게 줄일 수 있어 조회 성능이 향상되는 것처럼 말이다.

파티셔닝과 샤딩

파티셔닝을 할 때 1개의 서버 내에서 논리적으로 파티션이 나누어지거나, N개의 물리 서버로 나뉘어 각 파티션을 담당할 수도 있다. 샤딩은 N대의 물리 서버로 파티셔닝한 방식이다. 데이터의 일부분을 샤드, 큰 데이터셋을 작은 데이터들로 쪼개는 것을 샤딩이라고 한다. 샤딩된 데이터들은 서로 중복되지 않는 것이 특징이다.

샤딩을 통해서 서버 갯수(파티션의 갯수도 따라 증가)를 늘리면 파티션별로 쿼리의 병렬 처리가 가능해지기 때문에 전체적인 쿼리 처리량을 늘릴 수 있다. 또한 단일 서버 구조일 때보다 Lock 경합이 줄어들어 동시성이 개선된다. (하지만 동일 파티션 내의 Lock 문제는 여전히 남아있다)

범위 파티셔닝과 해시 파티셔닝

범위 파티셔닝 해시 파티셔닝
이론 키 값을 기준으로 범위 단위로 나눈다 데이터의 키 값에 해시 함수를 적용해서 나눈다 (파티션 수는 고정)
장점 특정 날짜나 기간 등의 범위 기반 쿼리에서 높은 성능을 발휘한다 균등한 데이터 분산을 처리할 수 있다.
범위니까 순차적 접근이 가능하고, 정렬되어 있으니까 스캔이 효율적이다. 일반 쿼리에서 범위 쿼리보다 효율이 좋다
단점 핫스팟 문제가 발생한다 순차 저장이 아니기 때문에 범위 쿼리 시 성능이 낮다.
데이터의 분포가 고르지 않다면 불균형 파티셔닝 문제가 생긴다. (범위 경계 선정이 매우 중요) 잘못된 해시 함수는 데이터 불균형 문제를 만든다

핫스팟 문제

샤딩을 통해 물리적으로 파티션을 나누었음에도 불구하고, 1개의 특정 파티션에 부하가 쏠리는 것을 핫스팟이라고 한다. 쿼리할 서버를 랜덤으로 선택하면 부하는 분산되지만 모든 서버에 병렬 쿼리를 요청해야 하는 문제가 있다.

책에서는 각 키의 시작이나 끝에 임의의 10진수 2개를 붙이는 방법을 사용해서 1개 키에 대한 쓰기 작업을 100개의 다른 키로 균등하게 분산해서 키들을 다른 파티션들로 분산할 수 있다고 한다.

문서 기준 보조 인덱스 파티셔닝

몽고디비와 같은 문서 DB에서 파티션별로 있는 기본키 인덱스 외에도 문서 기준으로 보조 색인을 추가하고, 스캐터/개더 방식으로 모든 파티션에서 읽는다. 보조 인덱스는 파티션 내 지역적으로 유지되는 인덱스다.

용어 기준 보조 인덱스 파티셔닝

용어 기반으로 보조 인덱스를 만들고 파티셔닝한다. 용어를 쓰거나 용어의 해시값을 쓸 수 있다.

파티션 리밸런싱

한 서버에서 부하가 심해지면 리밸런싱을 통해서 다른 서버로 부하를 분산시켜야 한다.