Groete, habr.
As iemand die stelsel uitbuit
ClickHouse los die beskryf probleme goed op. Byvoorbeeld, na die oordrag van 2TiB data vanaf fluister, pas hulle in 300GiB. Ek sal nie in detail by die vergelyking stilstaan ββnie; daar is baie artikels oor hierdie onderwerp. Boonop was alles tot onlangs nie perfek met ons ClickHouse-berging nie.
Probleme met verbruikte spasie
Met die eerste oogopslag behoort alles goed te werk. Volgende retention
), skep dan 'n tabel volgens die aanbeveling van die geselekteerde agterkant vir graphite-web:
Om te verstaan ββwatter een, moet jy weet hoe insetsels werk en die verdere lewenspad van data in tabelle van enjins van die * familieMergeTree ClickHouse (kaarte geneem uit
- Ingevoeg
Π±Π»ΠΎΠΊ
data. In ons geval was dit die maatstawwe wat opgedaag het.
- Elke so 'n blok word volgens die sleutel gesorteer voordat dit na skyf geskryf word.
ORDER BY
gespesifiseer wanneer die tabel geskep word. - Na sortering,
ΠΊΡΡΠΎΠΊ
(part
) data word na skyf geskryf.
- Die bediener monitor in die agtergrond sodat daar nie baie sulke stukke is nie, en begin agtergrond
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, hierna saamsmelt).
- Die bediener hou op om saamsmelt op sy eie te loop sodra data ophou aktief in die
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), maar jy kan die proses handmatig begin met die opdragOPTIMIZE
. - As daar net een stuk in die partisie oor is, sal jy nie die samevoeging met die gewone opdrag kan laat loop nie; jy moet gebruik
OPTIMIZE ... FINAL
So, die eerste maatstawwe kom. En hulle neem 'n bietjie spasie op. Daaropvolgende gebeurtenisse kan ietwat verskil, afhangende van baie faktore:
- Die partisiesleutel kan Γ³f baie klein ('n dag) Γ³f baie groot ('n paar maande) wees.
- Die behoudopstelling kan verskeie beduidende data-aggregasiedrempels binne die aktiewe partisie pas (waar metrieke aangeteken word), of dalk nie.
- As daar baie data is, sal die vroegste stukke, wat as gevolg van agtergrondsamevoeging reeds groot kan wees (as jy 'n nie-optimale partisiesleutel kies), nie hulself met vars klein stukke saamsmelt nie.
En dit eindig altyd dieselfde. Die spasie wat deur maatstawwe in ClickHouse in beslag geneem word, neem net toe as:
- aansoek doen nie
OPTIMIZE ... FINAL
handmatig of - moenie data op 'n deurlopende basis in alle partisies invoeg nie, sodat vroeΓ«r of later 'n agtergrondsamesmelting sal begin
Die tweede metode blyk die maklikste te wees om te implementeer en daarom is dit verkeerd en is eers probeer.
Ek het 'n redelik eenvoudige luislangskrif geskryf wat die afgelope 4 jaar dummy-statistieke vir elke dag gestuur het en elke uur cron gehardloop het.
Aangesien die hele werking van ClickHouse DBMS gebaseer is op die feit dat hierdie stelsel vroeΓ«r of later al die agtergrondwerk sal doen, maar dit is nie bekend wanneer nie, kon ek nie wag vir die oomblik wanneer die ou groot stukke waardig is om te begin saamsmelt met nuwe kleintjies. Dit het duidelik geword dat ons 'n manier moet soek om gedwonge optimalisering te outomatiseer.
Inligting in ClickHouse-stelseltabelle
Kom ons kyk na die tabelstruktuur
- db naam (
database
); - tabel naam (
table
); - partisie naam en ID (
partition
&partition_id
); - toe die stuk geskep is (
modification_time
); - minimum en maksimum datum in 'n stuk (verdeling word per dag gedoen) (
min_date
&max_date
);
Daar is ook 'n tafel
- db naam (
Tables.database
); - tabel naam (
Tables.table
); - metrieke ouderdom wanneer die volgende samevoeging toegepas moet word (
age
);
Dus:
- Ons het 'n tabel van stukke en 'n tabel van samevoegingsreΓ«ls.
- Ons kombineer hul kruising en kry alle tabelle *GraphiteMergeTree.
- Ons is opsoek na alle partisies waarin:
- meer as een stuk
- of die tyd het aangebreek om die volgende samevoegingsreΓ«l toe te pas, en
modification_time
ouer as hierdie oomblik.
Implementering
Hierdie versoek
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
gee elkeen van die *GraphiteMergeTree-tabelpartisies terug waarvan die samevoeging skyfspasie moet vrymaak. Die enigste ding om te doen is om deur hulle almal te gaan met 'n versoek OPTIMIZE ... FINAL
. Die finale implementering neem ook die feit in ag dat dit nie nodig is om partisies met aktiewe opname aan te raak nie.
Dit is presies wat die projek doen
As jy die program op 'n bediener met ClickHouse laat loop, sal dit eenvoudig in daemon-modus begin werk. Een keer per uur sal 'n versoek uitgevoer word, om te kyk of nuwe partisies ouer as drie dae verskyn het wat geoptimaliseer kan word.
Ons onmiddellike planne is om ten minste deb-pakkette te verskaf, en indien moontlik ook rpm.
In plaas daarvan om 'n gevolgtrekking
Oor die afgelope 9+ maande was ek in my maatskappy
Etlike liters bier en admin dae is bestee aan die ontwikkeling van die versoek, tesame met
Bron: will.com