사전 파티션
개념

파티션

gabury1고친 사람 github-actions[bot]

파티션은 커다란 데이터를 여러 조각으로 나눠 담았을 때 그 조각 하나를 가리킵니다. 달마다 나눈 주문 기록에서 9월 치를 담은 조각 하나가 파티션입니다. 기록 하나가 어느 조각으로 들어갈지는 미리 정해 둔 기준 값이 정합니다. 그 값으로 찾으면 읽기와 쓰기가 조각 하나 안에서 끝납니다.

쉽고 빠른 이해

파티션은 한 덩이로 두면 다루기 힘든 데이터를 나눠 담은 조각입니다. 주문 기록을 달마다 나눠 두면 9월 조각 하나가 파티션입니다.

나누지 않으면 몇 년 치 기록이 한 덩이에 쌓입니다. 한 달 치를 찾을 때도 전부를 뒤집니다. 오래된 기록을 버릴 때도 한 줄씩 골라 지웁니다.

돌아가는 방식은 이렇습니다.

  1. 나누는 기준이 될 값을 하나 고릅니다. 주문일 같은 값입니다
  2. 새 기록이 들어오면 그 값을 보고 들어갈 조각을 하나 정합니다
  3. 찾을 때 조건에 그 값이 있으면 맞는 조각만 읽습니다

대가가 있습니다. 조건에 기준 값이 없으면 모든 조각을 다 읽습니다. 기준을 잘못 고르면 한 조각에만 기록이 몰려 그 조각이 혼자 부하를 받습니다.

데이터가 이미 크고 조회가 대개 그 기준 값으로 범위를 좁힐 때 씁니다. 데이터가 작거나 조건이 제각각이면 나누지 않고 한 덩이로 둡니다.

상세

투표소에 가면 접수대가 이름 순으로 여러 줄 나뉘어 있습니다. 어느 줄에 설지는 고르는 것이 아니라 내 이름이 정합니다. 한 줄에만 사람이 몰리면 옆 줄이 텅 비어 있어도 그 줄이 줄어드는 속도가 거기 선 사람 모두의 차례를 정합니다.

파티션은 그 줄 하나에 해당합니다. 나누는 일 자체는 파티셔닝입니다. 파티션은 그 결과로 생긴 덩이를 가리킵니다.

소속을 정하는 키

기록 하나가 들어올 때 들어갈 파티션도 함께 정해져야 합니다. 그 기준으로 쓰는 값이 파티션 키입니다. 주문 기록이라면 주문일이나 고객 번호가 흔한 파티션 키입니다.

키 값 하나는 파티션 하나에만 이어집니다. 그래서 파티션끼리 겹치는 기록이 없습니다. 모든 파티션을 합치면 나누기 전의 데이터가 됩니다. 나눴다는 말에는 이 두 조건이 같이 들어 있습니다.

앱은 나뉘기 전과 똑같이 테이블 이름 하나로 읽고 씁니다. 어느 파티션에 넣고 어느 파티션에서 꺼낼지는 저장소가 정합니다. 앱은 나뉘어 있다는 것을 몰라도 됩니다.

flowchart TD
    K["들어온 주문 기록"]
    R["주문일을 보고 한 곳을 고른다"]
    subgraph L["앱은 테이블 이름 하나로 부른다"]
        P1["파티션 · 9월"]
        P2["파티션 · 10월"]
        P3["파티션 · 11월"]
    end
    K --> R
    R --> P1
    R --> P2
    R --> P3

따로 저장하고 따로 다루는 덩이

파티션은 저장도 따로 하고 관리도 따로 받습니다. 한 파티션을 지워도 다른 파티션은 남아 있습니다. 이 성질에서 이득 둘이 나옵니다.

하나는 필요한 조각만 읽는 것입니다. 조회 조건에 파티션 키가 들어 있으면 저장소가 해당 파티션만 열고 나머지는 건너뜁니다. 조건에 키가 없으면 어디에 있는지 모르므로 모든 파티션을 다 읽습니다. 이렇게 건너뛰는 일이 파티션 프루닝입니다.

flowchart TD
    Q["조회"]
    C{"조건에 파티션 키가 있나"}
    A["조각 하나만 읽는다"]
    B["조각을 전부 읽는다"]
    Q --> C
    C -->|있다| A
    C -->|없다| B

다른 하나는 버리기입니다. 기간이 지난 기록을 버릴 때 그 기간의 파티션을 떼어내면 끝납니다. 한 줄씩 찾아 지우는 것과 견주면 손이 적게 갑니다.

파티션을 서로 다른 장비에 나눠 두면 저장 공간과 부하도 함께 갈라집니다. 이렇게 장비까지 가르는 것이 샤딩입니다. 그때의 조각에는 샤드라는 이름을 쓰는 저장소가 많습니다. 같은 것을 부르는 이름이 제품마다 갈립니다.

순서와 동시 처리의 단위

메시지 큐에서도 같은 이름을 씁니다. 메시지 큐에서 같은 종류의 메시지를 모아 두는 통이 토픽입니다. 토픽 하나를 파티션 여럿으로 나눕니다. 메시지는 달고 온 키를 보고 파티션 하나로 들어갑니다.

이쪽에서 파티션은 순서의 단위입니다. 한 파티션에 들어간 메시지는 들어온 차례대로 나갑니다. 파티션이 다르면 차례가 지켜지지 않습니다. 그래서 순서가 중요한 메시지에는 같은 키를 달아 한 파티션으로 모읍니다.

파티션 수는 동시에 처리할 수 있는 갈래의 수이기도 합니다. 파티션이 넷이면 받아 가는 쪽, 곧 소비자도 넷까지 나눠 읽습니다. 소비자를 그보다 많이 붙여도 남는 쪽은 할 일이 없습니다.

flowchart TD
    subgraph T["토픽"]
        P1["파티션 1"]
        P2["파티션 2"]
        P3["파티션 3"]
    end
    C1["소비자 1"]
    C2["소비자 2"]
    C3["소비자 3"]
    C4["소비자 4 · 받을 파티션이 없다"]
    P1 --> C1
    P2 --> C2
    P3 --> C3

한 파티션은 줄 하나입니다. 그래서 맨 앞 메시지의 처리가 밀리면 뒤에 선 메시지가 전부 같이 섭니다. 이렇게 앞이 막아 뒤가 서는 것이 헤드 오브 라인 블로킹입니다.

한 파티션에만 몰릴 때

나누기만 한다고 기록이 고르게 퍼지지는 않습니다. 한 파티션에만 읽기와 쓰기가 몰리면 다른 파티션이 놀아도 그 하나가 전체 한계를 정합니다. 이렇게 몰린 조각이 핫 파티션입니다. 몰리는 현상 자체는 데이터 쏠림이라고 합니다.

날짜를 파티션 키로 쓸 때 잘 생깁니다. 새 기록은 언제나 오늘 조각으로 가므로 쓰기가 한 파티션에 모입니다. 지난 조각들은 조회만 받고 쓰기는 받지 않습니다.

flowchart TD
    N1["새 기록"]
    N2["새 기록"]
    N3["새 기록"]
    TODAY["오늘 조각 · 쓰기가 몰린다"]
    OLD1["지난 조각 · 조회만"]
    OLD2["지난 조각 · 조회만"]
    N1 --> TODAY
    N2 --> TODAY
    N3 --> TODAY

키를 해시 함수에 넣어 나온 값으로 파티션을 고르면 쏠림이 줄어듭니다. 해시 함수는 입력을 고르게 흩어진 숫자로 바꿔 주는 함수입니다. 대신 이웃한 날짜가 서로 다른 파티션으로 흩어지므로, 기간으로 범위를 좁히는 조회가 모든 파티션을 읽게 됩니다.

파티션 수를 나중에 바꾸는 일도 대가가 있습니다. 수가 바뀌면 기존 기록의 소속도 바뀌어 옮겨 담아야 합니다. 이 작업이 리파티셔닝입니다.

그래서 파티션은 데이터가 이미 크고 조회 대부분이 같은 값으로 범위를 좁힐 때 값을 합니다. 데이터가 작거나 조회 조건이 제각각이면 나누지 않고 한 덩이로 두는 편이 손이 덜 갑니다.

이름이 겹치는 다른 뜻

파티션이라는 낱말은 데이터 밖에서도 쓰입니다. 나눠 담은 조각이라는 뼈대는 같습니다. 나누는 대상만 다릅니다.

어디서 한 파티션이 담는 것 나누는 기준
데이터베이스 테이블 행 묶음 하나 파티션 키 열의 값
메시지 큐 토픽 메시지 줄 하나 메시지에 달린 키
디스크 이어진 저장 구역 하나 구역의 시작과 끝

표의 마지막 줄이 디스크 파티션입니다. 저장 장치 하나를 여러 구역으로 갈라 각각을 따로 씁니다. 구역은 서로 이어져 있고 놓이는 순서가 있습니다. 구역마다 다른 파일 시스템을 올릴 수 있습니다.

block-beta
  columns 3
  b["부팅 구역"] s["시스템 구역"] d["자료 구역"]
  dev["저장 장치 하나"]:3

뜻이 아예 다른 쓰임이 하나 더 있습니다. 서버 여러 대가 서로를 못 보게 갈라지는 사고도 파티션이라 부릅니다. 이쪽은 설계로 나눈 조각이 아니라 장애입니다. 그래서 분단이라는 이름으로 따로 부릅니다.

관련 항목

파티션을 만들고 고르는 기준

파티셔닝 · 파티션 키 · 범위 파티셔닝 · 목록 파티셔닝 · 해시 파티셔닝 · 복합 파티셔닝 · 리파티셔닝

파티션과 같은 조각을 가리키는 다른 이름

샤드 · 청크 · 버킷 · 세그먼트 · 해시 슬롯 · 토큰 범위

파티션을 담는 저장 단위

테이블 · 토픽 · 디스크 · 볼륨 · 파일 시스템 · 블록 · SSTable

파티션에서 자주 겪는 문제

데이터 쏠림 · 핫스팟 · 넓은 파티션 · 전체 파티션 스캔 · 헤드 오브 라인 블로킹

파티션을 읽고 쓸 때 거치는 처리 단계

파티션 프루닝 · 라우팅 · 코디네이터 · 병렬 처리 · 스트림 처리

파티션과 함께 데이터를 늘리고 지키는 수단

샤딩 · 복제 · 일관성 해싱 · 확장성 · 보존 기간

이름이 겹치는 이웃

분단 · 디스크 파티션 · 스왑 파티션 · 네트워크 파티션 · 파티션 테이블

파티션이 속하는 상위 분류

데이터베이스 · 분산 시스템 · 메시지 큐 · 데이터 모델링 · 해시 함수

다른 이름: partition · 데이터 파티션 · 파티션 단위