ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike

ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike

Silav, habr.

Ger kesek pergalê îstîsmar bike graphite-web û rastî pirsgirêkek performansa hilanînê hat pispisî (IO, cîhê dîskê tê xerckirin), wê hingê şansê ku ClickHouse wekî veguhezek were avêtin divê bibe yek. Ev gotin tê vê wateyê ku pêkanîna sêyemîn-ê jixwe wekî metrîka wergirtina daemon tê bikar anîn, mînakî carbonwriter an go-karbon.

ClickHouse pirsgirêkên diyarkirî baş çareser dike. Mînakî, piştî veguheztina 2TiB daneyên ji whisper, ew di 300GiB de cih digirin. Ez ê bi berfirehî li ser berhevdanê nesekinim; li ser vê mijarê gelek gotar hene. Wekî din, heya vê dawiyê, ne her tişt bi hilanîna meya ClickHouse re bêkêmasî bû.

Pirsgirêkên cîhê vexwarinê

Di nihêrîna pêşîn de, divê her tişt baş bixebite. Pêketînî belgekirin, ji bo nexşeya hilanîna metrîkan mîhengek biafirînin (bêtir retention), dûv re li gorî pêşniyara paşîna hilbijartî ji bo grafît-web tabloyek çêbikin: carbon-clickhouse+graphite-clickhouse an graphouse, li gor kîjan stack tê bikaranîn. Û... bombeya demjimêr diteqe.

Ji bo ku hûn fêm bikin ka kîjan, hûn hewce ne ku hûn zanibin ka inserts çawa dixebitin û riya jiyanê ya din a daneyan di tabloyên motorên malbata * deMergeTree ClickHouse (grafikên ku ji hatine girtin pêşkêşiyan Alexey Zatelepin):

  • Têxistin блок jimare. Di doza me de, ew metrîkên ku hatin.
    ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike
  • Her blokek weha berî ku li ser dîskê were nivîsandin li gorî mifteyê tê rêz kirin. ORDER BYdema çêkirina tabloyê hatiye diyarkirin.
  • Piştî dabeşkirinê, кусок (part) Daneyên li ser dîskê têne nivîsandin.
    ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike
  • Pêşkêşkar di paşperdeyê de çavdêrî dike da ku pir perçeyên weha nebin, û paşîn dest pê dike слияния (merge, ji vir şûnde yek dibin).
    ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike
    ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike
  • Dema ku daneyan bi awayekî aktîf diherikin nav serverê rawestîne, server bi serê xwe yekbûnê disekine партицию (partition), lê hûn dikarin bi fermanê pêvajoyê bi destan dest pê bikin OPTIMIZE.
  • Ger di dabeşkirinê de tenê perçeyek maye, wê hingê hûn ê nikaribin bi fermana asayî yekbûnê bimeşînin; divê hûn bikar bînin OPTIMIZE ... FINAL

Ji ber vê yekê, metrîkên yekem têne. Û ew hinek cîh digirin. Bûyerên paşerojê li gorî gelek faktoran dikarin hinekî cûda bibin:

  • Mifteya dabeşkirinê dikare pir piçûk (rojek) an pir mezin (çend meh) be.
  • Veavakirina ragirtinê dibe ku çend bendên berhevkirina daneya girîng di hundurê dabeşkirina çalak de (li cihê ku metrîk têne tomar kirin) bicîh bîne, an jî dibe ku nebe.
  • Ger gelek dane hebin, wê hingê perçeyên herî pêşîn, yên ku ji ber hevgirtina paşîn dibe ku jixwe pir mezin bin (heke hûn mifteyek dabeşkirinê ya ne-optimal hilbijêrin), dê xwe bi perçeyên piçûk ên nû re nekin yek.

Û her tim bi heman dawî dibe. Cihê ku ji hêla metrîkan ve li ClickHouse hatî dagir kirin tenê zêde dibe heke:

  • serîlêdanê nakin OPTIMIZE ... FINAL bi destan an
  • li ser hemî parçeyên li ser bingehek domdariyê danasîn nakin, da ku zûtir an paşê paşde bavêjin

Metoda duyemîn xuya dike ku hêsantir e ku were bicîh anîn û, ji ber vê yekê, ew çewt e û pêşî hate ceribandin.
Min skrîptek pythonek pir hêsan nivîsand ku 4 salên borî ji bo her rojê metrîkên derewîn dişand û her demjimêrek cron dimeşand.
Ji ber ku tevahiya xebata ClickHouse DBMS li ser vê rastiyê ye ku ev pergal zû an dereng dê hemî karên paşerojê bike, lê nayê zanîn kengê, min nikarîbû li benda wê kêliyê bimînim ku perçeyên mezin ên kevin debara xwe bikin da ku dest bi hevgirtinê bikin. yên nû yên piçûk. Eşkere bû ku hewce bû ku em li rêyek bigerin ku xweşbîniyên bi zorê otomatîk bikin.

ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike

Agahdarî di tabloyên pergala ClickHouse de

Ka em li avahiya tabloyê binêrin sîstem.parçe. Ev agahdariya berfireh li ser her perçeyek hemî tabloyên li ser servera ClickHouse ye. Di nav tiştên din de, stûnên jêrîn hene:

  • Navê db (database);
  • navê maseyê (table);
  • Nav û nasnameya partiyê (partition & partition_id);
  • dema ku perçe hate afirandin (modification_time);
  • Dîroka herî kêm û herî zêde di perçeyekê de (dabeşkirin bi roj tê kirin) (min_date & max_date);

Tabloyek jî heye system.graphite_retentions, bi qadên balkêş ên jêrîn:

  • Navê db (Tables.database);
  • navê maseyê (Tables.table);
  • temenê metrîk dema ku kombûna paşîn divê were sepandin (age);

Ji ber vê yekê

  1. Tabloyek me ya perçeyan û tabloyek qaîdeyên berhevkirinê hene.
  2. Em xaçerêya wan li hev dikin û hemî tabloyan *GraphiteMergeTree distînin.
  3. Em li hemî dabeşan digerin ku tê de:
    • bêtir ji yek perçe
    • an jî dem hatiye ku qaîdeya komkirina paşîn were sepandin, û modification_time ji vê gavê kevntir.

Реализация

Ev daxwaz

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

her yek ji dabeşên tabloya *GraphiteMergeTree vedigerîne ku yekbûna wan divê cîhê dîskê azad bike. Tiştê ku tenê maye ev e ku meriv bi daxwazek wan hemî derbas bike OPTIMIZE ... FINAL. Pêkanîna paşîn di heman demê de vê rastiyê jî dihesibîne ku ne hewce ye ku bi dabeşkirina bi tomarkirina çalak re dest bixin.

Ya ku proje dike ev e graphite-ch-optimizer. Hevalên berê yên Yandex.Market ew di hilberînê de ceribandin, encama xebatê li jêr tê dîtin.

ClickHouse + Graphite: meriv çawa vexwarina cîhê dîskê bi girîngî kêm dike

Ger hûn bernameyê li ser serverek bi ClickHouse re bimeşînin, ew ê tenê di moda daemon de dest bi xebatê bike. Saet carekê daxwazek dê were bicîh kirin, kontrol bikin ka dabeşên nû yên ji sê rojan kevntir xuya bûne ku dikarin werin xweşbîn kirin.

Planên me yên bilez in ku bi kêmî ve pakêtên herî kêm rebigirin, û heke gengaz be jî RPM.

Şûna encamê

Di nav 9+ mehên borî de ez di hundurê pargîdaniya xwe de bûm innogames gelek dem li ser xaçerêya ClickHouse û grafît-webê derbas kir. Ew ezmûnek baş bû, ku di encamê de veguheztinek bilez ji whisper-ê berbi ClickHouse-ê wekî hilanîna metrîkê bû. Ez hêvî dikim ku ev gotar tiştek ji destpêka rêzek be li ser ka çi çêtirkirinên ku me li beşên cihêreng ên vê stakê çêkiriye, û dê di pêşerojê de çi were kirin.

Li ser pêşxistina daxwazê, bi hev re gelek lître û rojên rêveberiyê derbas bûn v0şeytan, ji bo ku ez dixwazim spasiyên xwe ji wî re diyar bikim. Û her weha ji bo nirxandina vê gotarê.

Rûpelê projeyê li ser github

Source: www.habr.com

Add a comment