Zpět na domů

ClickHouse: deduplikace a ztráty v MV

Článek rozebírá mechanismus ztrát dat v ClickHouse při používání materialized views kvůli deduplikaci bloků. Jsou popsány podmínky atomaritu INSERT, role block_id a doporučená nastavení pro odstranění problému. Vhodné pro middle/senior vývojáře OLAP systémů.

Jak ClickHouse ztrácí data v materialized views
Advertisement 728x90

Ztráty dat v ClickHouse: deduplikace a materialized views

V ClickHouse při používání materialized views se data v cílové tabulce mohou neshodovat se zdrojovými. To je způsobeno deduplikací bloků během INSERT, zejména v replikovaných clusterech. Standardní konfigurace vede k ignorování bloků při opakovaných vložkách, což narušuje očekávání append-only úložiště. Řešení spočívá v úpravě nastavení insert_deduplicate a deduplicate_blocks_in_dependent_materialized_views.

Rassmotrim tipichnyy payplayn:

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;

Data z source_table se kopírují do final_table, ale postupně v final_table mizí záznamy bez zjevných důvodů.

Google AdInline article slot

Atomarita INSERT v detailech

INSERT v ClickHouse rozděluje data na bloky podle nastavení max_insert_block_size. Atomarita je zaručena pouze pro jeden blok v jedné partition MergeTree tabulky. Pokud je INSERT přerušen, ClickHouse se pokusí opakovat vložku chybějících bloků bez upozornění uživatele.

Při opakování se aktivuje deduplikace: každému bloku je přiřazen block_id jako hash obsahu. Pokud je takový block_id již v logu deduplikace, blok je úplně vynechán. Výsledek:

  • Část dat z původního INSERT je ztracena.
  • Materializované zobrazení nedostane kompletní data.

Podmínky pro atomaritu:

Google AdInline article slot
  • Vložení do jedné partition.
  • Absence paralelních INSERT do stejné partition.
  • Data zabalená do jednoho bloku.

Porušení vede k částečné vložce a deduplikaci při opakování.

Mechanismus deduplikace bloků

Deduplikace funguje na úrovni bloků v replikovaných MergeTree tabulkách. Nastavení insert_deduplicate (výchozí 1) zapíná kontrolu block_id. Při nalezení duplikátu je blok ignorován.

V nereplikovaných tabulkách je deduplikace vypnutá (non_replicated_deduplication_window=0). Pro replikaci doporučujeme nastavit:

Google AdInline article slot
insert_deduplicate = 0

To zabraňuje ztrátě bloků při opakovaných INSERT, ale umožňuje duplikáty. Pro analytické zátěže s append-only jsou duplikáty přijatelné a odstraňují se během merges.

Deduplikace v materialized views

Materialized views provádějí INSERT do cílové tabulky na základě dat ze zdroje. Ve výchozím nastavení se deduplikace kontroluje na zdrojové tabulce a stav se přenáší na view.

Nastavení deduplicate_blocks_in_dependent_materialized_views řídí chování:

  • Hodnota 0 (výchozí): deduplikace na source_table, riziko ztrát.
  • Hodnota 1: deduplikace na final_table, bloky se vkládají plně.

Nastavte:

SET deduplicate_blocks_in_dependent_materialized_views = 1;

Dokumentace ClickHouse výslovně varuje: bez úprav materialized views nemusí dostat data při opakovaných vložkách bloků.

Doporučení pro nastavení

Pro odstranění ztrát dat proveďte následující změny v konfiguraci serveru nebo relace:

  • insert_deduplicate = 0 — vypnout deduplikaci při opakovaných INSERT.
  • deduplicate_blocks_in_dependent_materialized_views = 1 — deduplikace v MV na cílové tabulce.
  • Zkontrolujte max_insert_block_size: vyšší hodnoty minimalizují dělení na bloky.
  • Vyhněte se paralelním INSERT do stejné partition.

Monitorujte logy ohledně částečných vložek a porovnávejte COUNT(*) mezi source a final tabulkami.

Co je důležité

  • ClickHouse zaručuje ACID pouze pro jeden blok v jedné partition, zbytek závisí na nastaveních.
  • Deduplikace bloků podle block_id vede k ztrátám při přerušených INSERT v MV-pipelinech.
  • Vypnutí insert_deduplicate řeší problém pro replikované MergeTree.
  • Zapnutí deduplicate_blocks_in_dependent_materialized_views=1 zabraňuje ztrátám ve views.
  • Duplikáty po vypnutí deduplikace se odstraňují standardními merges.

— Editorial Team

Advertisement 728x90

Číst dál