ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe

ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe

Përshëndetje, habr.

Nëse ndokush po shfrytëzon sistemin graphite-web dhe ka hasur në probleme me performancën e ruajtjes whisper (IO, hapësira e përdorur disk), atëherë mundësia që të jetë shqyrtuar ClickHouse si zëvendësim duhet të jetë afër një. Ky pohim nënkupton se një zbatim tjetër është duke u përdorur për të marrë metrikat, për shembull carbonwriter ose go-carbon.

ClickHouse zgjidh mirë problemet e përmendura. Për shembull, pas një transferimi të 2TiB të dhënash nga whisper, ato përfshihen në 300GiB. Nuk do të ndalem në krahasime, ka mjaft artikuj mbi këtë temë. Po ashtu, deri kohët e fundit, ndonjëherë nuk ka qenë krejtësisht e përsosur me ruajtjen tonë ClickHouse.

Problemet me hapësirën e përdorur

NĂ« pamje tĂ« parĂ«, gjithçka duket se duhet tĂ« funksionojĂ« mirĂ«. Duke ndjekur dokumentacion, krijojmĂ« konfigurimin pĂ«r skemĂ«n e ruajtjes sĂ« metrikave (mĂ« pas retention), pastaj krijojmĂ« tabelĂ«n sipas rekomandimeve tĂ« backend tĂ« zgjedhur pĂ«r graphite-web: PĂ«r leximin e tĂ« dhĂ«nave nga ClickHouse u zgjodh graphite-slickhouse (golang). Si API pĂ«r Graphite — carbonapi (golang). PĂ«r organizimin e replikimit mes tabelave ClickHouse u pĂ«rdor carbon-c-relay. PĂ«r ruterimin e metrikave ne lanĂ« carbon-c-relay, tĂ« cilin e duam shumĂ« (shihni artikullin e kaluar).+graphite-clickhouse ose graphouse, nĂ« varĂ«si tĂ« stack-ut qĂ« pĂ«rdoret. Dhe
 ndizet bomba e vonuar.

Për të kuptuar se cila është ajo, duhet të dimë si funksionojnë inserimet dhe rruga e mëtejshme e jetës së të dhënave në tabelat e motorëve të familjes *MergeTree ClickHouse (grafikët janë marrë nga prezentim Alexei Zatelepina):

  • NjĂ« blok tĂ« dhĂ«nash. NĂ« rastin tonĂ«, kĂ«to janĂ« metrikat qĂ« mbĂ«rritĂ«n.
    ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe
  • Secili nga kĂ«to blloqe para se tĂ« shkruhen nĂ« disk sortohen sipas çelĂ«sit RENDIT ME, tĂ« specifikuar gjatĂ« krijimit tĂ« tabelĂ«s.
  • Pas renditjes, njĂ« pjesĂ« (part) e tĂ« dhĂ«nave shkruhet nĂ« disk.
    ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe
  • Serveri monitoron nĂ« sfond qĂ« tĂ« ketĂ« pak kĂ«shtu blloqesh, dhe nis proceset e prapambetjes , pastaj bashkimeve). (bashkĂ«Serveri ndalon tĂ« nisĂ« bashkimet automatikisht, kur tĂ« dhĂ«nat ndalojnĂ« sĂ« hyrĂ« aktivisht nĂ«
    ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe
    ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe
  • particion partition (), por mund tĂ« nisni procesin dorazi me komandĂ«nNĂ«se nĂ« particion ka mbetur vetĂ«m njĂ« pjesĂ«, atĂ«herĂ« nuk mund tĂ« nisni njĂ« bashkim me komandĂ«n normale, duhet tĂ« pĂ«rdorni OPTIMIZE.
  • OPTIMIZE ... FINAL Pra, tĂ« dhĂ«nat e para mbĂ«rrijnĂ«. Ato zĂ«nĂ« njĂ« hapĂ«sirĂ« tĂ« caktuar. Ngjarjet e mĂ«passhme mund tĂ« ndryshojnĂ« disi, nĂ« varĂ«si tĂ« shumĂ« faktorĂ«ve:

ÇelĂ«si i ndarjes mund tĂ« jetĂ« shumĂ« i vogĂ«l (diti), ose shumĂ« i madh (disa muaj).

  • Konfigurimi i retention mund tĂ« pĂ«rmbajĂ« disa pragje tĂ« rĂ«ndĂ«sishme tĂ« agregimit tĂ« tĂ« dhĂ«nave brenda particionit aktiv (ku shkojnĂ« metrikat), ose ndoshta jo.
  • Konfigu i retention mund tĂ« pĂ«rmbajĂ« disa pragje tĂ« rĂ«ndĂ«sishme pĂ«r agregimin e tĂ« dhĂ«nave brenda seksionit aktiv (ku shkruhen metrikat), ose ndoshta jo.
  • NĂ«se ka shumĂ« tĂ« dhĂ«na, copat mĂ« tĂ« hershme, tĂ« cilat pĂ«r shkak tĂ« bashkimeve nĂ« sfond mund tĂ« jenĂ« tashmĂ« tĂ« mĂ«dha (nĂ« rastin e zgjedhjes sĂ« njĂ« çelĂ«si tĂ« papĂ«rshtatshĂ«m tĂ« particionimit), nuk do tĂ« bashkohen vetĂ« me copat e reja tĂ« vogla.

Dhe gjithmonë përfundon gjithçka njësoj. Hapsira e zënë nga metrikat në ClickHouse vetëm rritet, nëse:

  • nuk aplikohet Pra, tĂ« dhĂ«nat e para mbĂ«rrijnĂ«. Ato zĂ«nĂ« njĂ« hapĂ«sirĂ« tĂ« caktuar. Ngjarjet e mĂ«passhme mund tĂ« ndryshojnĂ« disi, nĂ« varĂ«si tĂ« shumĂ« faktorĂ«ve: manually ose
  • nuk futen tĂ« dhĂ«nat nĂ« tĂ« gjitha partitĂ« nĂ« vazhdimĂ«si, pĂ«r ta filluar herĂ«t ose vonĂ« njĂ« bashkim nĂ« sfond

Mënyra e dytë duket më e thjeshtë për t'u realizuar dhe, pra, ajo është e gabuar dhe është provuar e para.
Kam shkruar një skript të mjaftueshëm të thjeshtë në python, i cili dërgonte metrika fiktive për çdo ditë për katër vitet e fundit dhe ekzekutohej çdo orë nga cron.
Duke qenë se e gjithë puna e ClickHouse DBMS bazohen në faktin që kjo sistem do të kryejë të gjithë punën në sfond, por nuk dihet kur, nuk arrita të prisja momentin kur copat e vjetra të mëdha do të fillonin bashkimin me të reja të vogla. U bë e qartë se duhej të kërkoja një mënyrë për të automatizuar optimizimet e detyruara.

ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe

Informacioni në tabelat sistemore ClickHouse

Të shohim strukturën e tabelës system.parts. Ky është informacioni gjithëpërfshirës rreth çdo cope të të gjitha tabelave në serverin ClickHouse. Përfshin, ndër të tjera, kolonat e mëposhtme:

  • emri i DB (database);
  • emri i tabelĂ«s (tavolina);
  • emri dhe ID e partitĂ«s (), por mund tĂ« nisni procesin dorazi me komandĂ«n & partition_id);
  • kur u krijua copa (modification_time);
  • data minimale dhe maksimale nĂ« cope (particionimi bĂ«het sipas ditĂ«ve) (min_date & max_date);

Ka gjithashtu tabelën system.graphite_retentions, me fushat e mëposhtme interesante:

  • emri i DB (Tables.database);
  • emri i tabelĂ«s (Tables.table);
  • mosha e metrikĂ«s, kur duhet tĂ« aplikohet agregimi i ardhshĂ«m (age);

Pra:

  1. Kemi një tabelë copash dhe një tabelë të rregullave të agregimit.
  2. Bashkojmë ndërprerjen e tyre dhe marrim të gjitha tabelat *GraphiteMergeTree.
  3. Kërkojmë të gjitha partitë, ku:
    • mĂ« shumĂ« se njĂ« copĂ«
    • ose ka ardhur koha tĂ« aplikohet rregulli i ardhshĂ«m i agregimit, dhe modification_time mĂ« i vjetĂ«r se ky moment.

Realizimi

Ky kërkesë

SELECT
    concat(p.database, '.', p.table) AS table,
    p.partition_id AS partition_id,
    p.partition AS partition,
    -- Rregulli më "i vjetër" që mund të aplikohet për
    -- parti, por jo në të ardhmen, shiko *
    max(g.age) AS age,
    -- Numri i pjesëve në parti
    countDistinct(p.name) AS parts,
    -- Metri i më i vjetër në parti merret si 00:00:00 e ditës tjetër
    toDateTime(max(p.max_date + 1)) AS max_time,
    -- Kur duhet optimizuar partia
    max_time + age AS rollup_time,
    -- Kur është përditësuar për herë të parë copëza më e vjetër në parti
    min(p.modification_time) AS modified_at
FROM system.parts AS p
INNER JOIN
(
    -- Të gjitha rregullat për të gjitha tabelat *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
    -- Vetëm copëza aktive
    p.active
    -- (*) Dhe vetëm rreshtat, ku rregullat e agregatës duhet të aplikohen
    AND ((toDateTime(p.max_date + 1) + g.age) < now())
GROUP BY
    table,
    partition
HAVING
    -- Vetëm partitë që janë më të reja se momenti i optimizimit
    (modified_at  1)
ORDER BY
    table ASC,
    partition ASC,
    age ASC

kthen çdo njërën nga partitë e tabelave *GraphiteMergeTree, të cilat duhet të merren për të liruar hapësirë disk. Mbetej vetëm të ecësh përmes të gjitha këtyre me një kërkesë Pra, të dhënat e para mbërrijnë. Ato zënë një hapësirë të caktuar. Ngjarjet e mëpasshme mund të ndryshojnë disi, në varësi të shumë faktorëve:. Në realizimin përfundimtar gjithashtu është marrë parasysh momenti që partitë me regjistrim aktiv nuk ka nevojë të preken.

Kjo është ajo që bën projekti graphite-ch-optimizer. Ish kolegët nga Yandex.Market e provuan atë në prodhim, rezultatin e punës mund ta shihni më poshtë.

ClickHouse + Graphite: si të reduktoni ndjeshëm hapësirën e përdorur në disqe

NĂ«se e nisni programin nĂ« njĂ« server me ClickHouse, ai thjesht do tĂ« fillojĂ« tĂ« punojĂ« nĂ« modalitetin demon. Çdo orĂ« do tĂ« ekzekutohet njĂ« kĂ«rkesĂ«, duke kontroluar nĂ«se kanĂ« dalĂ« parti tĂ« reja mĂ« tĂ« vjetra se tri ditĂ«, tĂ« cilat mund tĂ« optimizohen.

NĂ« planet e afĂ«rta Ă«shtĂ« tĂ« ofrohen, tĂ« paktĂ«n, paketat deb, dhe nĂ«se Ă«shtĂ« e mundur — pĂ«r mĂ« tepĂ«r edhe rpm.

Në vend të përfundimit

Gjatë këtyre mbi 9 muajve brenda kompanisë sime InnoGames kam kaluar shumë kohë, duke u angazhuar në lidhje me ClickHouse dhe graphite-web. Kjo ka qenë një përvojë e mirë, rezultati i së cilës ka bërë të mundur kalimin e shpejtë nga whisper në ClickHouse si depo të metrikeve. Shpresoj se ky artikull është një lloj fillimi i një cikli mbi përmirësimet që kemi bërë në pjesë të ndryshme të këtij staku dhe se çfarë do të bëhet në të ardhmen.

Disa për zhvillimin e kërkesës u shpenzuan disa litra birrë dhe ditë administrative së bashku me v0devil, për të cilin dua të shpreh mirënjohjen time. Gjithashtu për rishikimin e këtij artikulli.

Faqja e projektit në github

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster