Arhitektūra

ClickHouse rindu dzēšana: vieglais DELETE, mutācijas vai DROP PARTITION

Rindu dzēšana ClickHouse izskatās pēc SQL, bet tā nav rindu krātuve. Izvēlieties nepareizu metodi lielai tabulai, un jūs pārrakstīsiet terabaitus, piepildīsiet disku un nostādīsiet rindā aiz tā katru nākamo izmaiņu.

· 13 min lasīšanai · AG Data komanda

Kad jādzēš rindas ClickHouse, SQL izskatās pazīstams, bet dzinējs zem tā nav. MergeTree tabulas glabā datus nemainīgās daļās, tāpēc "dzēšana" vai nu paslēpj rindas un gaida, kamēr sapludināšana tās iztīrīs, vai pārraksta veselas daļas uz diska. Mazā tabulā atšķirību gandrīz nemana. Tabulā ar miljardiem rindu izvēle nosaka, vai dzēšana beidzas sekundēs, ilgst dienu vai iestrēgst un bloķē katru nākamo izmaiņu.

Trīs dzēšanas veidi, no lētākā līdz dārgākajam

  1. Dzēst veselas particijas (vai izpildīt TRUNCATE tabulai), ja dzēšamie dati sakrīt ar particiju atslēgu. Tas izņem daļas kā failus, neko nepārrakstot.
  2. Vieglais DELETE FROM mērķtiecīgai dzēšanai. Tas atzīmē rindas kā dzēstas un ļauj vēlākām sapludināšanām tās izņemt.
  3. ALTER TABLE ... DELETE, klasiska mutācija, kas pārraksta katru daļu ar atbilstošām rindām.

Pati DELETE dokumentācija norāda uz pirmo variantu: biežai lielapjoma dzēšanai tabulā ar piemērotu particiju atslēgu ALTER TABLE ... DROP PARTITION ir ātrāks.

Vieglais DELETE: kas notiek patiesībā

-- vieglā dzēšana: atzīmē rindas, fiziski tās izņem vēlākas sapludināšanas
DELETE FROM events WHERE user_id = 42;

-- ierobežojiet ar vienu particiju (nereplicētam MergeTree jānorāda tieši)
DELETE FROM events IN PARTITION '202611' WHERE user_id = 42;

Vieglais DELETE joprojām ir mutācija, bet lēta. ClickHouse skartajām daļām pievieno slēptu kolonnu _row_exists un izpilda dzēšanu kā šīs kolonnas atjaunināšanu uz 0. SELECT vaicājumi tiek pārrakstīti tā, lai izlaistu rindas, kur tā ir false. Platajās (wide) daļās tiek rakstīta tikai šī viena kolonna; kompaktās daļas tiek pārrakstītas pilnībā.

Kas jāzina, pirms uz to paļauties:

ALTER TABLE DELETE: pārrakstīšana maskā

-- klasiskā mutācija: pārraksta katru skarto daļu
ALTER TABLE events DELETE WHERE event_date < '2024-01-01';

-- veciem datiem parasti daudz lētāk: dzēsiet veselas particijas
ALTER TABLE events DROP PARTITION '202312';

Mutāciju dokumentācija skaidri saka, kā tas darbojas: mutācijas MergeTree tabulās tiek izpildītas, pārrakstot veselas datu daļas. Daļa ar vienu atbilstošu rindu no piecdesmit miljoniem tiek uzrakstīta no jauna pilnībā. Dažas sekas:

Mutāciju uzraudzība un apturēšana

Katrai mutācijai ir rinda tabulā system.mutations:

SELECT database, table, mutation_id, command, create_time,
       parts_to_do, is_done, latest_failed_part, latest_fail_reason
FROM system.mutations
WHERE is_done = 0
ORDER BY create_time;

-- atceliet iestrēgušu mutāciju (jau pārrakstītās daļas paliek pārrakstītas)
KILL MUTATION WHERE database = 'default' AND table = 'events'
  AND mutation_id = 'mutation_3.txt';

parts_to_do rāda, cik daļu vēl gaida. latest_fail_reason ir pirmā vieta, kur skatīties, ja mutācija nevirzās: bieži iemesli ir izteiksme, kas dažām rindām neizdodas, vai diska vietas vai atmiņas trūkums pārrakstīšanai. Ņemiet vērā, ka replicētām tabulām parts_to_do = 0 ne vienmēr nozīmē, ka mutācija ir pabeigta, jo ilga ievietošana vēl var radīt daļu, kas jāmutē.

KILL MUTATION atceļ iestrēgušu mutāciju, bet jau veiktās izmaiņas netiek atritinātas. Pārrakstītās daļas paliek pārrakstītas; pārējās saglabā vecās rindas. Pēc dzēšanas atcelšanas tabula ir daļēji izdzēstā stāvoklī, un jāizlemj, vai iesniegt laboto komandu atkārtoti.

Pabeigtās mutācijas sarakstā tiek glabātas līdz finished_mutations_to_keep (MergeTree iestatījumos pēc noklusējuma 100). Replicētām tabulām mutāciju rinda atrodas Keeper, tāpēc, ja Keeper nav pieejams, apstājas arī mutācijas; šo atkarību skaidrojām rakstā table is in readonly mode.

Lielas tabulas: kas mainās

Plānojiet dzēšanu jau sākumā

Lētākā dzēšana ir tā, ko ieplānojāt, veidojot tabulu. Particionējiet pa mēnešiem vai dienām, ja vecos datus dzēš pēc vecuma, un tad dzēsiet particijas vai izmantojiet TTL klauzulu, lai dati beigtos automātiski. Ja regulāri jādzēš atsevišķi lietotāji vai ieraksti, apvienojiet šīs dzēšanas un rēķinieties ar maskētām rindām, līdz sapludināšana panāk. Atjauninājumiem, nevis dzēšanai, jaunākās ClickHouse versijās ir arī vieglais UPDATE ar ielāpu daļām (patch parts). Dokumentācija saka, ka tas paredzēts nelielām izmaiņām, līdz aptuveni 10% tabulas, un ka tas palielina slodzi vaicājumiem, kuriem jāpiemēro ielāpi.

Mūsu īkšķa likums: veci dati aiziet ar DROP PARTITION vai TTL, mērķtiecīgas dzēšanas ar apvienotu vieglo DELETE, un ALTER TABLE ... DELETE tikai tad, ja vieta vajadzīga tūlīt un disks ir pārbaudīts. Pirms jebkuras dzēšanas lielā tabulā apskatiet system.mutations: ja tur jau kaut kas ir iestrēdzis, jūsu dzēšana gaidīs aiz tā.

Kontrolsaraksts pirms rindu dzēšanas ClickHouse

  1. Vai dzēšanu var izteikt kā particiju dzēšanu vai TTL? Izmantojiet to.
  2. Pārbaudiet system.mutations, vai tabulai nav nepabeigtu vai neveiksmīgu mutāciju.
  3. Vieglajam DELETE pārbaudiet projekcijas un nereplicētām tabulām pievienojiet IN PARTITION.
  4. ALTER TABLE ... DELETE gadījumā novērtējiet skarto daļu izmēru un pārliecinieties par brīvo diska vietu.
  5. Apvienojiet daudzas mazas dzēšanas vienā komandā.
  6. Izlemiet, kā gaidīt: mutations_sync vai lightweight_deletes_sync, vai uzraugiet system.mutations katrā replikā.
  7. Sagatavojiet plānu KILL MUTATION gadījumam, atceroties, ka tas neatceļ jau pabeigtās daļas.

Galvenās atziņas

ClickHouse Mutācijas DELETE MergeTree
Sadarbība ar mums

Jāsakārto liela ClickHouse tabula?

Mēs plānojam dzēšanu, datu glabāšanas termiņus un GDPR tīrīšanu lielos ClickHouse klasteros: izvēlamies metodi, pārbaudām disku un mutāciju rindu un veicam to, nepalēninot vaicājumus.

Sazināties Vairāk no emuāra