Database

파티셔닝과 샤딩

kyoulho 2024. 7. 22. 16:32

테이블을 파티션이라는 작은 단위로 나누어 관리하는 기법을 파티셔닝(Partitioning)이라고 한다.

장점

  • 특정 파티션만 조회하면 되기 때문에 검색 속도가 빨라진다.
  • 인덱스 크기가 작아져 효율이 증가한다.
  • 데이터 양이 증가해도 파티션을 추가하여 쉽게 확장할 수 있다.
  • 백업과 복구 작업이 간편해진다. 예를 들어, 특정 파티션만 백업할 수 있다.
  • 특정 파티션만 유지보수하면 되므로 관리 부담이 줄어든다.
  • 한 파티션에 문제가 생겨도 다른 파티션은 영향을 받지 않으므로 시스템의 가용성이 높아진다.
  • table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 UPDATE 성능을 향상시킨다.

단점

  • 설계 및 관리가 복잡해질 수 있다.
  • 적절한 파티셔닝 키를 선택하는 것이 어려울 수 있다.
  • 테이블 간 JOIN에 대한 비용이 증가한다.
  • 테이블과 인덱스를 별도로 파티셔닝 할 수 없다. 같이 파티셔닝해야 한다.
  • 파티션 간 데이터가 균등하게 분배되지 않으면 성능 이점이 줄어들 수 있다.
  • 예를 들어, 특정 파티션에 데이터가 집중되는 경우 그 파티션이 병목 현상을 일으킬 수 있다.
  • 파티션 관리로 인해 시스템에 추가적인 오버헤드가 발생할 수 있다.

주의할 점

  1. 인덱스: 파티셔닝 된 테이블에서도 인덱스를 사용할 수 있다. 파티션 키와 비파티션 키에 대한 인덱스를 적절히 설계해야 한다.
  2. 쿼리 성능: 파티셔닝이 잘못 설계되면 오히려 쿼리 성능이 저하될 수 있다. 파티션 키 선택 및 파티션 방식 설계가 중요하다.
  3. 조인: 파티셔닝 된 테이블과 다른 테이블 간의 조인 시 성능 영향을 미칠 수 있다. 파티셔닝된 테이블 간 조인은 동일한 파티션 키를 사용하는 것이 좋다.

 

파티셔닝 종류


수평 파티셔닝 (Horizontal Partitioning)

  • 개념: 테이블의 행(row)을 나누어 여러 파티션으로 분산시킨다. 파티셔닝이라면 주로 수평 파티셔닝을 이야기한다.
  • 예시
    • 유튜브 구독 테이블의 최대 크기는 사용자 갯수 * 채널 갯수가 될 것이다. 이러한 테이블의 크기가 커질수록 인덱스의 크기도 커진다. 때문에 테이블에 읽기/쓰기가 있을 때마다 인덱스에서 처리되는 시간도 조금씩 늘어나게 된다.
  • 방법:
    • 범위 파티셔닝 (Range Partitioning): 특정 열의 값 범위에 따라 행을 나눈다. 예를 들어, 날짜 범위에 따라 데이터 파티셔닝.
    • 리스트 파티셔닝 (List Partitioning): 특정 열의 값 집합에 따라 행을 나눈다. 예를 들어, 지역에 따라 파티셔닝.
    • 해시 파티셔닝 (Hash Partitioning): 해시 함수의 결과에 따라 행을 나눈다. 균등하게 분배하기 위해 사용.
    • 조합 파티셔닝 (Composite Partitioning): 위의 두 가지 이상의 파티셔닝 방법을 결합하여 사용.

수직 파티셔닝 (Vertical Partitioning)

  • 개념: 테이블의 열(column)을 나누어 여러 파티션으로 분산시킨다.
  • 예시
    • 자주 조회되는 열과 그렇지 않은 열을 분리하여 데이터를 메모리로 불러오는 I/O 작업의 오버헤드를 줄일 수 있다.
    • 게시판 목록을 만들 때 게시판 콘텐츠는 가장 크지만 불필요하다. 이러한 상황에서 콘텐츠를 수직 파티셔닝으로 분리할 수 있다.
  • 방법:
    • 속성 기반 파티셔닝: 자주 조회되는 열과 그렇지 않은 열을 분리하여 저장.
    • 엔터티 기반 파티셔닝: 관련 열들을 그룹으로 묶어 저장.

 

파티셔닝 분할 기법


데이터베이스 관리 시스템은 분할에 대해 각종 기준(분할 기법)을 제공하고 있다. 분할은 분할 키(partitioning key)를 사용한다.

 

범위 분할 (Range Partitioning)

범위 분할은 데이터를 특정 범위에 따라 분할하는 기법이다. 주로 연속적인 숫자나 날짜를 기준으로 데이터를 나누며, 각 파티션은 정의된 범위 내의 값을 포함한다.

  • 특징:
    • 연속성: 날짜, 지역의 범위, 연속적인 숫자 등을 기준으로 분할할 수 있다.
    • 쿼리 최적화: 특정 범위의 데이터를 빠르게 조회할 수 있어 효율적이다.
    • 데이터 성장 관리: 새로운 범위가 추가되면 새로운 파티션을 추가하여 관리할 수 있다.
  • 예시:
    • 지역 기준 분할: North, South, East, West와 같은 지역에 따라 데이터를 나누는 경우이다. 예를 들어, 판매 데이터를 North 지역, South 지역 등으로 분할할 수 있다.
CREATE TABLE sales (
    sale_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2),
    region VARCHAR(50),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE (region) (
    PARTITION p_north VALUES LESS THAN ('N'),
    PARTITION p_south VALUES LESS THAN ('S'),
    PARTITION p_east VALUES LESS THAN ('E'),
    PARTITION p_west VALUES LESS THAN ('Z')
);

목록 분할 (List Partitioning)

목록 분할은 특정 값의 목록을 기준으로 데이터를 분할하는 기법이다. 각 파티션은 명시된 값 목록에 해당하는 데이터를 포함한다.

  • 특징:
    • 명시적 제어: 각 값이 어떤 파티션에 저장될지 명확히 제어할 수 있다.
    • 비슷한 분포: 특정 값이 자주 사용되거나 쿼리에서 많이 활용되는 경우 유용하다.
    • 데이터 분리: 특정 값이 있는 데이터만을 명확하게 분리할 수 있다.
  • 예시:
    • 월 기준 분할: January, February, March, 등과 같은 월에 따라 데이터를 나누는 경우이다. 예를 들어, 판매 데이터를 월별로 분할하여 각 월의 판매 기록을 별도의 파티션에 저장할 수 있다.
CREATE TABLE sales (
    sale_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY LIST (MONTH(sale_date)) (
    PARTITION p_january VALUES IN (1),
    PARTITION p_february VALUES IN (2),
    PARTITION p_march VALUES IN (3),
    PARTITION p_april VALUES IN (4),
    PARTITION p_may VALUES IN (5),
    PARTITION p_june VALUES IN (6),
    PARTITION p_july VALUES IN (7),
    PARTITION p_august VALUES IN (8),
    PARTITION p_september VALUES IN (9),
    PARTITION p_october VALUES IN (10),
    PARTITION p_november VALUES IN (11),
    PARTITION p_december VALUES IN (12)
);

해시 분할 (Hash Partitioning)

해시 분할은 해시 함수를 사용하여 파티션을 결정하는 기법이다. 파티션 키의 해시 값을 계산하고, 이를 기반으로 데이터를 분산 저장한다.

  • 특징:
    • 균등 분포: 해시 함수를 사용하여 데이터를 균등하게 분산할 수 있다.
    • 무작위성: 특정 데이터가 어떤 파티션에 있는지 예측하기 어렵다.
    • 범위가 없는 데이터: 범위나 목록이 명확하지 않은 경우에 적합하다.
    • 운영 중에 파티션을 추가하기 까다롭다.
  • 예시:
    • 해시 기반 사용자 ID 분할: 사용자 ID를 해시하여 4개의 파티션 중 하나로 분할한다. 해시 함수가 0부터 3까지의 정수를 반환하고, 이를 기반으로 파티션을 결정한다.
CREATE TABLE users (
    user_id INT,
    user_name VARCHAR(100),
    PRIMARY KEY (user_id)
)
PARTITION BY HASH (user_id) PARTITIONS 4;

합성 분할 (Composite Partitioning)

합성 분할은 위의 분할 기법들을 조합하여 사용하는 방식이다. 이 방법은 대규모 데이터셋에 대해 더욱 세밀한 분할이 가능하며, I/O 요청을 효과적으로 분산시킬 수 있다.

  • 특징:
    • 복잡한 분할: 두 개 이상의 파티셔닝 기법을 결합하여 데이터 분할을 세밀하게 조정한다.
    • 효율성: 대규모 데이터의 I/O 성능을 최적화하고, 다양한 쿼리 패턴을 지원할 수 있다.
  • 예시:
    • 범위와 리스트 조합: 먼저 지역에 따라 범위 분할을 하고, 각 지역 내에서 월별로 리스트 분할을 적용하여 데이터를 나누는 방식이다. 예를 들어, North 지역 내에서 January, February 등 월별로 추가적인 파티셔닝을 할 수 있다.
CREATE TABLE sales (
    sale_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2),
    region VARCHAR(50),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE (region) SUBPARTITION BY LIST (MONTH(sale_date)) (
    PARTITION p_north VALUES LESS THAN ('S')
        (SUBPARTITION sp_north_january VALUES IN (1),
         SUBPARTITION sp_north_february VALUES IN (2),
         SUBPARTITION sp_north_march VALUES IN (3),
         SUBPARTITION sp_north_april VALUES IN (4),
         SUBPARTITION sp_north_may VALUES IN (5),
         SUBPARTITION sp_north_june VALUES IN (6),
         SUBPARTITION sp_north_july VALUES IN (7),
         SUBPARTITION sp_north_august VALUES IN (8),
         SUBPARTITION sp_north_september VALUES IN (9),
         SUBPARTITION sp_north_october VALUES IN (10),
         SUBPARTITION sp_north_november VALUES IN (11),
         SUBPARTITION sp_north_december VALUES IN (12)),
    PARTITION p_south VALUES LESS THAN ('W')
        (SUBPARTITION sp_south_january VALUES IN (1),
         SUBPARTITION sp_south_february VALUES IN (2),
         SUBPARTITION sp_south_march VALUES IN (3),
         SUBPARTITION sp_south_april VALUES IN (4),
         SUBPARTITION sp_south_may VALUES IN (5),
         SUBPARTITION sp_south_june VALUES IN (6),
         SUBPARTITION sp_south_july VALUES IN (7),
         SUBPARTITION sp_south_august VALUES IN (8),
         SUBPARTITION sp_south_september VALUES IN (9),
         SUBPARTITION sp_south_october VALUES IN (10),
         SUBPARTITION sp_south_november VALUES IN (11),
         SUBPARTITION sp_south_december VALUES IN (12))
    -- 추가 파티션 정의 가능
);

 

Sharding


샤딩은 수평 파티셔닝에서 파티션을 다른 데이터베이스에 저장하는 것을 의미한다. 샤딩을 통해 데이터베이스의 부하를 여러 서버에 분산시킬 수 있다. 샤드는 파티션을, 샤드키는 파티션키를 의미한다.

장점

  • 성능 향상: 데이터와 쿼리 부하를 여러 서버에 분산시킬 수 있어 성능이 개선된다.
  • 확장성: 시스템의 부하가 증가하면 새로운 샤드를 추가하여 시스템을 수평으로 확장할 수 있다.
  • 장애 격리: 특정 샤드에 장애가 발생하더라도 전체 시스템에 미치는 영향을 최소화할 수 있다.

단점

  • 복잡성 증가: 데이터 분산 및 샤드 간의 데이터 일관성을 유지하는 것이 복잡할 수 있다.
  • 쿼리 복잡성: 데이터가 여러 샤드에 분산되어 있기 때문에, 특정 쿼리가 여러 샤드에서 수행되어야 할 수 있다.
  • 데이터 재분배: 데이터 양이 변화함에 따라 샤드를 재분배해야 할 수도 있다. 이 과정은 상당히 복잡하고 시간 소모적일 수 있습니다.

'Database' 카테고리의 다른 글

Stored Procedure  (0) 2024.08.16
Stored Function  (0) 2024.08.15
데이터베이스 기본 개념  (0) 2024.08.15
인덱스  (0) 2024.08.06
MongoDB  (0) 2024.08.02