파티셔닝

jinwook han·2021년 11월 28일
0

데이터 시스템

목록 보기
1/7
post-thumbnail

데이터 중심 어플리케이션 설계 6장을 정리했습니다.
책을 기반으로 글을 썼지만, 임의의 추가 정보나 저의 주관적인 해석이 추가될 수 있습니다.
느낀 점은 책 저자의 견해가 아니라 저의 견해입니다.

요약

파티셔닝을 하는 이유

파티셔닝을 하는 가장 큰 장점은 노드를 늘림으로써 병렬로 쿼리를 실행할 수 있는 여지를 만들 수 있다는 점이다.
scalibiltiy를 얻을 수 있다.
예로 들어, 일자별로 파티셔닝되어 있는 구조에서 특정 날짜 범위를 조회한다면, 각 날짜 파티셔닝마다 병렬로 탐색을 수행하는 게 가능하다.
일자 파티션 별로 독립적인 cpu를 사용할 수 있고, 병렬로 파일탐색을 할 수 있으므로, 하나의 노드로 쿼리를 수행하는 것보다 더 효율적이다.

또한 파티션 단위로 나누면 인덱스도 파티션 별로 관리되기 때문에, 인덱스도 더 효율적으로 관리할 수 있다.(파티션 한개의 인덱스만 변경하는 경우에 한해서)

partitioning 키 전략

파티셔닝을 하는 방법은 키를 어떻게 만들 것인가와 연관되어 있다. 두 가지 방법이 있다.

  • 해시를 이용한 파티셔닝
  • 키 설정을 통한 파티셔닝

해시를 이용한 파티셔닝에서는 해싱을 이용하여 데이터를 분배하게 된다.
예로 들어 타임스탬프에 해싱함수를 적용하여 데이터가 들어갈 파티션을 구하는 방식이 있다.
해싱을 이용하면 데이터가 골고루 분배된다는 장점이 있다. 하지만 단점은 조회가 비효율적이게 된다는 점이다.
어떤 쿼리를 사용하든 모든 파티션을 조회해야 하기 때문이다.
예로 들어 타임스탬프에 해싱함수를 적용하여 파티셔닝하는 경우에, 날짜 범위로 검색해야 한다면 모든 파티션을 조회해야 할 것이다.

반면 키 설정을 통한 파티셔닝은 조회가 효율적이게 되어, 실제 파티셔닝을 하는 목적에 부합한다는 장점이 있다.
가장 많이 쓰는 조회 조건을 파티셔닝 키로 쓴다. 일자별로 파티셔닝을 한다면, 일자 범위 검색은 효율적이게 된다.
단점도 있다. skewed 또는 hot spot 이 나타날 수 있다.

skewed는 특정 파티셔닝에 데이터가 몰려 있는 상황을 의미하고, hot spot은 실제 몰려있는 파티션 그 자체를 의미한다.

해시를 이용한 파티셔닝, 키 설정을 통한 파티셔닝 두 가지 방법을 사용하여 파티셔닝 키 전략을 세울 수 있다.

파티셔닝 개수 전략

파티셔닝을 할 때 개수를 어떻게 설정할 것인지도 정할 수 있다. 다음과 같은 세 가지 전략이 있다.

  • 파티션 개수를 고정 (fixed number of partitions)
  • 데이터 크기에 따라 파티션 개수 늘림 (dynamic partitioning)
  • 노드 당 파티션 개수를 고정 (partitioning proportionally to nodes)

파티션 개수를 고정시키는 방법은, 파티션 개수를 고정시켜 파티셔닝 개수를 유지하는 것이다.
이 경우 데이터 총량에 따라 파티션 한 개의 크기가 달라진다. 데이터 총량이 커질수록 파티션 한 개의 총량은 커질 것이다.
dynamic partitioning의 경우, 파티션 한 개의 양을 일정하게 유지할 수 있다.
데이터 양이 커지면 그만큼 파티션 개수도 증가한다. 하지만 파티션 개수 고정하는 방법과 마찬가지로, 이 경우도 파티션의 개수는 노드의 개수와는 무관하다.
앞 두 가지와 다르게, 노드 당 파티션 개수를 고정하는 방법은 노드의 개수에 따라 파티션 개수가 달라진다.
노드의 개수가 늘어나면, 동시에 파티션 개수도 늘어난다.

위 세 가지와 같은 방법으로 파티션 개수를 조절할 수 있다.

partition 한 개의 크기

파티션의 한 개의 크기는 너무 크면 rebalancing하는데 시간이 오래 걸린다는 단점이 있고,
한 개의 크기가 너무 작으면 파티션들을 관리하기가 어렵다는 단점이 있다.
rebalancing이란 파티션 개수가 늘어나면서 파티션들을 다른 노드로 옮기는 작업을 의미한다.
rebalancing을 빠르게 할 수 있으면서 동시에 관리하기 쉽도록, 파티션 한 개의 크기는 적당해야 한.

느낀점

예전 회사에서도 파티션을 썼기에, 책 내용 중 실무와 연관된 부분이 많았다.
예전 회사의 경우, 데이터가 월별로 파티셔닝이 되어 있었다. 그리고 write는 항상 특정 파티션에만 몰렸다.(현재 월에 해당하는 파티션)
월별로 파티션이 되어 있었고, 데이터 수가 많았기 때문에, 월말이 되면 write가 급속하게 느려지는 현상이 있었다.
그래서 파티션 한 개의 단위를 월별이 아니라, 일별로 하여 파티션 한 개의 사이즈를 줄이는 것도 고려했다.
월별에서 일별로 파티션 한 개 크기를 바꾸면, 파티션 및 파티션별 인덱스 크기가 줄어들어 쓰기 성능이 좋아질 것으로 예상했다.
하지만 사내 dba에게 확인받기로는, 파티션 한 개 크기와 쓰기 및 탐색 성능은 큰 상관 없다고 한다.
추가로 확인한 내용은, mysql은 partition별 쿼리 병렬 실행 기능이 없다고 한다.
따라서 삭제 작업이 간편하다는 것 이외에는, mysql은 partition에 대한 장점이 없다.

결론

파티셔닝은 다음과 같은 이점이 있다.

  • 조회를 병렬로 할 수 있다.
  • 파티션별로 인덱스가 있으므로, 인덱스 관리도 효율적으로 할 수 있다.

파티셔닝은 다음과 같은 경우에 사용한다.

  • secondary index로만 조회하는 경우가 없는 경우
  • 모든 조회 상황에 partition key가 들어가는 경우

0개의 댓글