
Përshëndetje, habr.
Nëse ndokush po shfrytëzon sistemin dhe ka hasur në probleme me performancën e ruajtjes (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 ose .
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 , 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: + ose , 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 Alexei Zatelepina):
- Një
bloktë dhënash. Në rastin tonë, këto janë metrikat që mbërritën.

- 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.

- 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ë


- 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ërdorniOPTIMIZE. - 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.

Informacioni në tabelat sistemore ClickHouse
Të shohim strukturën e tabelës . 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 , 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:
- Kemi një tabelë copash dhe një tabelë të rregullave të agregimit.
- Bashkojmë ndërprerjen e tyre dhe marrim të gjitha tabelat *GraphiteMergeTree.
- 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_timemë 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 ASCkthen ç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 . Ish kolegët nga Yandex.Market e provuan atë në prodhim, rezultatin e punës mund ta shihni më poshtë.

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 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 , për të cilin dua të shpreh mirënjohjen time. Gjithashtu për rishikimin e këtij artikulli.
Burimi: habr.com




