ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje

ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje

Groetnis, habr.

As immen eksploitearret it systeem grafyt-web en tsjinkaam in probleem mei opslachprestaasjes flústerje (IO, skiif romte ferbrûkt), dan moat de kâns dat ClickHouse waard cast as ferfanging oanstriid ta ien. Dizze ferklearring ymplisearret dat in ymplemintaasje fan tredden al brûkt wurdt as in daemon dy't metriken ûntfange, bygelyks koalstofskriuwer of go-koalstof.

ClickHouse lost de beskreaune problemen goed op. Bygelyks, nei it oerbringen fan 2TiB oan gegevens fan flúster, passe se yn 300GiB. Ik sil net yn detail oer de fergeliking stean; d'r binne genôch artikels oer dit ûnderwerp. Derneist, oant koartlyn, wie net alles perfekt mei ús ClickHouse-opslach.

Problemen mei ferbrûkte romte

Op it earste each moat alles goed wurkje. Folgjend dokumintaasje, meitsje in konfiguraasje foar it opslachskema foar metriken (fierder retention), meitsje dan in tabel neffens de oanbefelling fan 'e selekteare backend foar graphite-web: carbon-klikhûs+grafyt-klikhûs of graphouse, ôfhinklik fan hokker stapel wurdt brûkt. En... de tiidbom giet ôf.

Om te begripen hokker, moatte jo witte hoe't ynserts wurkje en it fierdere libbenspaad fan gegevens yn tabellen fan motoren fan 'e * famyljeMergeTree ClickHouse (grafiken nommen út presintaasjes Alexey Zatelepin):

  • Ynfoege блок data. Yn ús gefal wiene it de metriken dy't oankamen.
    ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje
  • Elk sa'n blok wurdt sorteare neffens de kaai foardat se op skiif skreaun wurde. ORDER BYoantsjutte by it meitsjen fan de tabel.
  • Nei it sortearjen, кусок (part) gegevens wurde skreaun nei skiif.
    ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje
  • De tsjinner kontrolearret op 'e eftergrûn sadat d'r net in protte sokke stikken binne, en lanseart eftergrûn слияния (merge, hjirnei gearfoegje).
    ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje
    ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje
  • De tsjinner ophâldt te rinnen fúzjes op harsels sa gau as gegevens ophâldt aktyf streamt yn de партицию (partition), mar jo kinne it proses manuell begjinne mei it kommando OPTIMIZE.
  • As d'r mar ien stik oer is yn 'e partysje, dan kinne jo de gearfoeging net útfiere mei it gewoane kommando; jo moatte brûke OPTIMIZE ... FINAL

Dat, de earste metriken komme. En se nimme wat romte yn. Opfolgjende eveneminten kinne wat ferskille ôfhinklik fan in protte faktoaren:

  • De partysjekaai kin heul lyts wêze (in dei) of heul grut (ferskate moannen).
  • De behâldkonfiguraasje kin passe by ferskate wichtige gegevensaggregaasjedrompels binnen de aktive dieling (wêr't metriken wurde opnommen), of miskien net.
  • As d'r in protte gegevens binne, dan sille de ierste brokken, dy't fanwege eftergrûnfúzje al enoarm wêze kinne (as jo in net-optimale partitioneringskaai kieze), harsels net fusearje mei frisse lytse brokken.

En it einiget altyd itselde. De romte beset troch metriken yn ClickHouse nimt allinich ta as:

  • net oanfreegje OPTIMIZE ... FINAL hânmjittich of
  • net trochgeande gegevens yn alle partysjes ynfoegje, sadat ier of let in eftergrûnfúzje begjint

De twadde metoade liket de maklikste te ymplementearjen en is dêrom ferkeard en waard earst besocht.
Ik skreau in frij ienfâldich python-skript dat dummy-metriken stjoerde foar elke dei foar de ôfrûne 4 jier en elke oere cron rûn.
Sûnt de folsleine wurking fan ClickHouse DBMS is basearre op it feit dat dit systeem ier of letter al it eftergrûnwurk sil dwaan, mar it is net bekend wannear, koe ik net wachtsje op it momint dat de âlde enoarme stikken fertsjinje om te begjinnen mei te fusearjen mei nije lytse. It waard dúdlik dat wy moatte sykje nei in manier om twongen optimalisaasjes te automatisearjen.

ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje

Ynformaasje yn ClickHouse systeem tabellen

Litte wy ris nei de tabelstruktuer sjen system.parts. Dit is wiidweidige ynformaasje oer elk stik fan alle tabellen op de ClickHouse-tsjinner. Befettet ûnder oare de folgjende kolommen:

  • db namme (database);
  • tabel namme (table);
  • namme en partition ID (partition & partition_id);
  • doe't it stik makke waard (modification_time);
  • minimum en maksimum datum yn in stik (ferdieling wurdt dien troch dei) (min_date & max_date);

Der is ek in tafel system.graphite_retentions, mei de folgjende nijsgjirrige fjilden:

  • db namme (Tables.database);
  • tabel namme (Tables.table);
  • metryske leeftyd as de folgjende aggregaasje tapast wurde moat (age);

Dus:

  1. Wy hawwe in tabel fan brokken en in tabel fan aggregaasjeregels.
  2. Wy kombinearje harren krusing en krije alle tabellen * GraphiteMergeTree.
  3. Wy sykje alle partysjes wêryn:
    • mear as ien stik
    • of de tiid is kommen om te passen de folgjende aggregaasje regel, en modification_time âlder as dit momint.

Ymplemintaasje

Dit fersyk

SELECT
    concat(p.database, '.', p.table) AS table,
    p.partition_id AS partition_id,
    p.partition AS partition,
    -- Самое "старое" правило, которое может быть применено для
    -- партиции, но не в будущем, см (*)
    max(g.age) AS age,
    -- Количество кусков в партиции
    countDistinct(p.name) AS parts,
    -- За самую старшую метрику в партиции принимается 00:00:00 следующего дня
    toDateTime(max(p.max_date + 1)) AS max_time,
    -- Когда партиция должна быть оптимизированна
    max_time + age AS rollup_time,
    -- Когда самый старый кусок в партиции был обновлён
    min(p.modification_time) AS modified_at
FROM system.parts AS p
INNER JOIN
(
    -- Все правила для всех таблиц *GraphiteMergeTree
    SELECT
        Tables.database AS database,
        Tables.table AS table,
        age
    FROM system.graphite_retentions
    ARRAY JOIN Tables
    GROUP BY
        database,
        table,
        age
) AS g ON
    (p.table = g.table)
    AND (p.database = g.database)
WHERE
    -- Только активные куски
    p.active
    -- (*) И только строки, где правила аггрегации уже должны быть применены
    AND ((toDateTime(p.max_date + 1) + g.age) < now())
GROUP BY
    table,
    partition
HAVING
    -- Только партиции, которые младше момента оптимизации
    (modified_at < rollup_time)
    -- Или с несколькими кусками
    OR (parts > 1)
ORDER BY
    table ASC,
    partition ASC,
    age ASC

jout elk fan 'e *GraphiteMergeTree-tabelpartysjes werom wêrfan de gearfoeging skiifromte frijmeitsje moat. It iennichste wat oerbliuwt is om se allegear troch te gean mei in fersyk OPTIMIZE ... FINAL. De definitive ymplemintaasje hâldt ek rekken mei it feit dat d'r gjin needsaak is om partysjes te berikken mei aktive opname.

Dit is krekt wat it projekt docht grafyt-ch-optimizer. Eardere kollega's fan Yandex.Market besocht it yn produksje, it resultaat fan it wurk kin hjirûnder sjoen wurde.

ClickHouse + Graphite: hoe kin it konsumpsje fan skiifromte signifikant ferminderje

As jo ​​​​it programma útfiere op in server mei ClickHouse, sil it gewoan begjinne te wurkjen yn daemon-modus. Ien kear yn 'e oere sil in fersyk útfierd wurde, kontrolearjen oft nije partysjes âlder dan trije dagen binne ferskynd dy't kinne wurde optimalisearre.

Us direkte plannen binne om op syn minst deb-pakketten te leverjen, en as it kin ek rpm.

Yn stee fan in konklúzje

Yn 'e ôfrûne 9+ moannen haw ik yn myn bedriuw west innogames bestege in protte tiid oan tinken op 'e krusing fan ClickHouse en grafyt-web. It wie in goede ûnderfining, dy't resultearre yn in rappe oergong fan flústerjen nei ClickHouse as opslach foar metriken. Ik hoopje dat dit artikel wat is fan it begjin fan in searje oer hokker ferbetteringen wy hawwe makke oan ferskate dielen fan dizze stapel, en wat sil dien wurde yn 'e takomst.

Ferskate liters bier en admin dagen waarden bestege oan it ûntwikkeljen fan it fersyk, tegearre mei v0 duvel, dêr't ik myn tank foar uterje wol. En ek foar it besjen fan dit artikel.

Projektside op github

Boarne: www.habr.com

Add a comment