홈으로 돌아가기

ClickHouse: MV에서의 중복 제거와 손실

이 기사는 매터리얼라이즈드 뷰 사용 시 ClickHouse의 블록 중복 제거로 인한 데이터 손실 메커니즘을 분석합니다. INSERT 원자성 조건, block_id 역할, 문제 해결을 위한 권장 설정을 설명합니다. OLAP 시스템의 중급/시니어 개발자에게 적합합니다.

ClickHouse 매터리얼라이즈드 뷰에서 데이터가 손실되는 방법
Advertisement 728x90

ClickHouse에서의 데이터 손실: 중복 제거와 물리화 뷰

ClickHouse에서 물리화 뷰를 사용할 때 대상 테이블의 데이터가 원본과 일치하지 않을 수 있습니다. 이는 INSERT 중 블록 중복 제거 때문으로, 특히 복제 클러스터에서 발생합니다. 기본 설정에서는 반복 삽입 시 블록이 무시되어 추가 전용 저장소의 기대를 저버립니다. 해결책은 insert_deduplicate와 deduplicate_blocks_in_dependent_materialized_views 설정을 조정하는 것입니다.

전형적인 파이프라인을 고려해 보십시오:

CREATE TABLE source_table (
    message     String
) engine=MergeTree()
ORDER BY (message);

CREATE TABLE final_table (
    message     String
) engine=MergeTree()
ORDER BY (message);

CREATE MATERIALIZED VIEW mv_source_table TO final_table AS
SELECT 
    message
FROM source_table;

source_table의 데이터가 final_table로 복사되지만, 시간이 지나면서 final_table에서 레코드가 명확한 이유 없이 사라집니다.

Google AdInline article slot

INSERT 원자성 상세 설명

ClickHouse는 max_insert_block_size 설정에 따라 INSERT 데이터를 블록으로 나눕니다. 원자성은 하나의 MergeTree 테이블 파티션 내 단일 블록에 대해서만 보장됩니다. INSERT가 중단되면 ClickHouse는 사용자에게 알리지 않고 누락된 블록 삽입을 재시도합니다.

재시도 시 중복 제거가 작동합니다: 각 블록은 내용의 해시로 block_id를 부여받습니다. 해당 block_id가 중복 제거 로그에 이미 있으면 전체 블록이 건너뜁니다. 결과적으로:

  • 원래 INSERT의 일부 데이터가 손실됩니다.
  • 물리화 뷰가 전체 데이터를 받지 못합니다.

원자성 조건:

Google AdInline article slot
  • 단일 파티션으로 삽입.
  • 동일 파티션에 대한 동시 INSERT 없음.
  • 데이터가 단일 블록으로 패킹.

이 조건을 충족하지 못하면 부분 삽입과 재시도 시 중복 제거가 발생합니다.

블록 중복 제거 메커니즘

중복 제거는 복제 MergeTree 테이블에서 블록 수준으로 작동합니다. insert_deduplicate 설정(기본값 1)이 block_id 검사를 활성화합니다. 중복이 발견되면 블록이 무시됩니다.

비복제 테이블에서는 중복 제거가 비활성화됩니다(non_replicated_deduplication_window=0). 복제의 경우 다음 설정을 권장합니다:

Google AdInline article slot
insert_deduplicate = 0

이 설정은 반복 INSERT 시 블록 손실을 방지하지만 중복을 허용합니다. 분석적 추가 전용 워크로드에서는 중복이 허용되며 병합 중 정리됩니다.

물리화 뷰에서의 중복 제거

물리화 뷰는 원본 데이터에 기반해 대상 테이블로 INSERT를 수행합니다. 기본적으로 원본 테이블에서 중복 제거를 확인하며 상태가 뷰로 전파됩니다.

deduplicate_blocks_in_dependent_materialized_views 설정이 이를 제어합니다:

  • 0 (기본값): source_table에서 중복 제거, 데이터 손실 위험.
  • 1: final_table에서 중복 제거, 블록이 완전히 삽입.

설정:

SET deduplicate_blocks_in_dependent_materialized_views = 1;

ClickHouse 문서에서는 조정 없이는 반복 블록 삽입 시 물리화 뷰가 데이터를 놓칠 수 있다고 명시적으로 경고합니다.

권장 설정

데이터 손실을 없애려면 서버 또는 세션 구성에 다음 변경을 적용하십시오:

  • insert_deduplicate = 0 — 반복 INSERT 중복 제거 비활성화.
  • deduplicate_blocks_in_dependent_materialized_views = 1 — MV에서 대상 테이블 중복 제거.
  • max_insert_block_size 확인: 더 큰 값으로 블록 분할 최소화.
  • 동일 파티션에 대한 동시 INSERT 피함.

부분 삽입을 로그로 모니터링하고 원본과 final 테이블 간 COUNT(*) 비교.

주요 요점

  • ClickHouse는 하나의 파티션 내 단일 블록에 대해서만 ACID를 보장합니다; 나머지는 설정에 따름.
  • block_id에 의한 블록 중복 제거가 MV 파이프라인 내 중단된 INSERT에서 손실을 유발.
  • insert_deduplicate 비활성화로 복제 MergeTree 문제 해결.
  • deduplicate_blocks_in_dependent_materialized_views=1 설정으로 뷰 손실 방지.
  • 중복 제거 비활성화 후 중복은 표준 병합으로 제거.

— Editorial Team

Advertisement 728x90

다음 읽기