Silav, habr.
Ger kesek pergalê îstîsmar bike
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î retention
), dûv re li gorî pêşniyara paşîna hilbijartî ji bo grafît-web tabloyek çêbikin:
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
- Têxistin
блок
jimare. Di doza me de, ew metrîkên ku hatin.
- Her blokek weha berî ku li ser dîskê were nivîsandin li gorî mifteyê tê rêz kirin.
ORDER BY
dema çêkirina tabloyê hatiye diyarkirin. - Piştî dabeşkirinê,
кусок
(part
) Daneyên li ser dîskê têne nivîsandin.
- 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).
- 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ê bikinOPTIMIZE
. - 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.
Agahdarî di tabloyên pergala ClickHouse de
Ka em li avahiya tabloyê binêrin
- 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
- 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ê
- Tabloyek me ya perçeyan û tabloyek qaîdeyên berhevkirinê hene.
- Em xaçerêya wan li hev dikin û hemî tabloyan *GraphiteMergeTree distînin.
- 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
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
Li ser pêşxistina daxwazê, bi hev re gelek lître û rojên rêveberiyê derbas bûn
Source: www.habr.com