테이블 파츠(Table Parts)

테이블 파츠(Table Parts)

ClickHouse의 MergeTree 테이블 데이터는 디스크에 변경 불가능한 데이터 파츠(data parts)의 집합으로 저장됩니다. 이 문서에서는 파츠가 무엇인지, 어떻게 생성되는지, 그리고 어떻게 모니터링하는지 기본부터 설명할게요.

출처: 문서

본문

ClickHouse의 테이블 파츠란 무엇인가요?

ClickHouse MergeTree 엔진 계열의 각 테이블 데이터는 디스크에 변경 불가능한 데이터 파츠(data parts)의 집합으로 구성됩니다. 이를 설명하기 위해 영국에서 판매된 부동산의 날짜, 도시, 거리, 가격을 추적하는 이 테이블(UK 부동산 가격 데이터셋에서 각색)을 사용하겠습니다:

CREATE TABLE uk.uk_price_paid_simple
(
    date Date,
    town LowCardinality(String),
    street LowCardinality(String),
    price UInt32
)
ENGINE = MergeTree
ORDER BY (town, street);

ClickHouse SQL Playground에서 이 테이블을 조회해 볼 수 있습니다. 행 집합이 테이블에 삽입될 때마다 데이터 파트가 생성됩니다. 다음 다이어그램이 이를 보여줍니다. ClickHouse 서버가 위 다이어그램에 그려진 4개 행의 예제 삽입을 처리할 때(예: INSERT INTO 문을 통해) 여러 단계를 수행합니다:

1 정렬(Sorting)

행은 테이블의 정렬 키 (town, street)로 정렬되고, 정렬된 행에 대해 희소 프라이머리 인덱스가 생성됩니다.

2 분할(Splitting)

정렬된 데이터가 컬럼으로 분할됩니다.

3 압축(Compression)

각 컬럼이 압축됩니다.

4 디스크에 쓰기(Writing to disk)

압축된 컬럼들이 삽입의 데이터 파트를 나타내는 새 디렉터리 안에 바이너리 컬럼 파일로 저장됩니다. 희소 프라이머리 인덱스도 압축되어 같은 디렉터리에 저장됩니다.

테이블의 특정 엔진에 따라 정렬과 함께 추가적인 변환이 일어날 수 있습니다. 데이터 파츠는 자체 완결적이라, 내용을 해석하는 데 필요한 모든 메타데이터를 중앙 카탈로그 없이도 포함합니다. 희소 프라이머리 인덱스 외에도 파츠에는 보조 데이터 스킵핑 인덱스, 컬럼 통계(column statistics), 체크섬, (파티셔닝을 사용한다면) min-max 인덱스 등 더 많은 메타데이터가 포함됩니다.

파츠 머지 (Part merges)

테이블당 파츠 수를 관리하기 위해 백그라운드 머지 작업이 주기적으로 작은 파츠들을 더 큰 파츠로 결합하여 설정 가능한 압축 크기(보통 약 150 GB)에 도달할 때까지 진행합니다. 머지된 파츠는 비활성으로 표시되고 설정 가능한 시간 간격 후에 삭제됩니다. 시간이 지나면 이 과정이 머지된 파츠의 계층 구조를 만들며, 그래서 MergeTree 테이블이라고 부릅니다. 초기 파츠 수와 머지 오버헤드를 최소화하기 위해 데이터베이스 클라이언트는 튜플을 대량으로(예: 한 번에 20,000행) 삽입하거나, ClickHouse가 여러 수신 INSERT의 행을 같은 테이블에 버퍼링했다가 버퍼 크기가 설정 가능한 임계값을 초과하거나 타임아웃이 지나면 새 파츠를 만드는 비동기 삽입 모드를 사용하도록 권장됩니다.

테이블 파츠 모니터링하기

가상 컬럼 _part를 사용하여 예제 테이블의 현재 존재하는 모든 활성 파츠 목록을 조회할 수 있습니다:

SELECT _part
FROM uk.uk_price_paid_simple
GROUP BY _part
ORDER BY _part ASC;
   ┌─_part───────┐
1. │ all_0_5_1   │
2. │ all_12_17_1 │
3. │ all_18_23_1 │
4. │ all_6_11_1  │
   └─────────────┘

위 쿼리는 디스크상 디렉터리 이름을 가져옵니다. 각 디렉터리는 테이블의 활성 데이터 파트를 나타냅니다. 이 디렉터리 이름의 구성 요소에는 특정한 의미가 있으며, 더 자세히 알고 싶은 분들을 위해 여기에 문서화되어 있습니다. 또는 ClickHouse는 system.parts 시스템 테이블에 모든 테이블의 모든 파츠 정보를 추적하며, 다음 쿼리는 예제 테이블에 대해 현재 활성인 모든 파츠, 머지 레벨, 그리고 이 파츠에 저장된 행 수를 반환합니다:

SELECT
    name,
    level,
    rows
FROM system.parts
WHERE (database = 'uk') AND (`table` = 'uk_price_paid_simple') AND active
ORDER BY name ASC;
   ┌─name────────┬─level─┬────rows─┐
1. │ all_0_5_1   │     1 │ 6368414 │
2. │ all_12_17_1 │     1 │ 6442494 │
3. │ all_18_23_1 │     1 │ 5977762 │
4. │ all_6_11_1  │     1 │ 6459763 │
   └─────────────┴───────┴─────────┘

머지 레벨은 파츠에 추가 머지가 발생할 때마다 1씩 증가합니다. 레벨 0은 아직 머지되지 않은 새 파츠임을 나타냅니다.

더 알아보기 (Learn more)