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ů.
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:
- 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:
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
Zatím žádné komentáře.