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에서 레코드가 명확한 이유 없이 사라집니다.
INSERT 원자성 상세 설명
ClickHouse는 max_insert_block_size 설정에 따라 INSERT 데이터를 블록으로 나눕니다. 원자성은 하나의 MergeTree 테이블 파티션 내 단일 블록에 대해서만 보장됩니다. INSERT가 중단되면 ClickHouse는 사용자에게 알리지 않고 누락된 블록 삽입을 재시도합니다.
재시도 시 중복 제거가 작동합니다: 각 블록은 내용의 해시로 block_id를 부여받습니다. 해당 block_id가 중복 제거 로그에 이미 있으면 전체 블록이 건너뜁니다. 결과적으로:
- 원래 INSERT의 일부 데이터가 손실됩니다.
- 물리화 뷰가 전체 데이터를 받지 못합니다.
원자성 조건:
- 단일 파티션으로 삽입.
- 동일 파티션에 대한 동시 INSERT 없음.
- 데이터가 단일 블록으로 패킹.
이 조건을 충족하지 못하면 부분 삽입과 재시도 시 중복 제거가 발생합니다.
블록 중복 제거 메커니즘
중복 제거는 복제 MergeTree 테이블에서 블록 수준으로 작동합니다. insert_deduplicate 설정(기본값 1)이 block_id 검사를 활성화합니다. 중복이 발견되면 블록이 무시됩니다.
비복제 테이블에서는 중복 제거가 비활성화됩니다(non_replicated_deduplication_window=0). 복제의 경우 다음 설정을 권장합니다:
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
아직 댓글이 없습니다.