Pagbati, habr.
Kung may nagsasamantala sa sistema
Niresolba ng ClickHouse ang mga inilarawang problema nang maayos. Halimbawa, pagkatapos maglipat ng 2TiB ng data mula sa whisper, magkasya ang mga ito sa 300GiB. Hindi ako magtatagal sa paghahambing nang detalyado; maraming mga artikulo sa paksang ito. Bilang karagdagan, hanggang kamakailan, hindi lahat ay perpekto sa aming imbakan ng ClickHouse.
Mga problema sa naubos na espasyo
Sa unang sulyap, dapat gumana nang maayos ang lahat. Sumusunod retention
), pagkatapos ay lumikha ng isang talahanayan ayon sa rekomendasyon ng napiling backend para sa graphite-web:
Upang maunawaan kung alin, kailangan mong malaman kung paano gumagana ang mga pagsingit at ang karagdagang landas ng buhay ng data sa mga talahanayan ng mga makina ng * pamilyaMergeTree ClickHouse (mga chart na kinuha mula sa
- Ipinasok
Π±Π»ΠΎΠΊ
datos. Sa aming kaso, ito ay ang mga sukatan na dumating.
- Ang bawat bloke ay pinagsunod-sunod ayon sa susi bago isulat sa disk.
ORDER BY
tinukoy kapag lumilikha ng talahanayan. - Pagkatapos ayusin,
ΠΊΡΡΠΎΠΊ
(part
) ang data ay isinulat sa disk.
- Sinusubaybayan ng server sa background upang walang ganoong mga piraso, at naglulunsad ng background
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, pagkatapos ay pagsamahin).
- Ang server ay huminto sa pagtakbo ay nagsasama sa sarili nitong sa sandaling ang data ay huminto sa aktibong pagdaloy sa
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), ngunit maaari mong simulan ang proseso nang manu-mano gamit ang utosOPTIMIZE
. - Kung may isang piraso na lang na natitira sa partition, hindi mo magagawang patakbuhin ang merge gamit ang karaniwang command; dapat mong gamitin
OPTIMIZE ... FINAL
Kaya, dumating ang mga unang sukatan. At kumukuha sila ng ilang espasyo. Ang mga kasunod na kaganapan ay maaaring medyo mag-iba depende sa maraming mga kadahilanan:
- Ang partitioning key ay maaaring maging napakaliit (isang araw) o napakalaki (ilang buwan).
- Maaaring magkasya ang config ng pagpapanatili sa ilang makabuluhang threshold ng pagsasama-sama ng data sa loob ng aktibong partition (kung saan naitala ang mga sukatan), o maaaring hindi.
- Kung mayroong maraming data, kung gayon ang pinakamaagang mga chunks, na dahil sa pagsasama ng background ay maaaring malaki na (kung pipiliin mo ang isang hindi pinakamainam na partitioning key), ay hindi magsasama sa kanilang mga sarili sa mga sariwang maliliit na chunks.
At palagi itong nagtatapos. Ang puwang na inookupahan ng mga sukatan sa ClickHouse ay tataas lamang kung:
- huwag mag-apply
OPTIMIZE ... FINAL
mano-mano o - huwag magpasok ng data sa lahat ng mga partisyon sa patuloy na batayan, nang sa gayon ay magsisimula ang isang pagsasanib sa background
Ang pangalawang paraan ay tila ang pinakamadaling ipatupad at, samakatuwid, ito ay hindi tama at sinubukan muna.
Sumulat ako ng medyo simpleng script ng python na nagpadala ng mga dummy na sukatan para sa bawat araw sa nakalipas na 4 na taon at nagpapatakbo ng cron bawat oras.
Dahil ang buong operasyon ng ClickHouse DBMS ay batay sa katotohanan na ang sistemang ito ay maaga o huli ay gagawin ang lahat ng gawain sa background, ngunit hindi alam kung kailan, hindi ako makapaghintay para sa sandali kung kailan ang mga lumang malalaking piraso ay naghahangad na magsimulang pagsamahin sa mga bagong maliliit. Naging malinaw na kailangan naming maghanap ng paraan para i-automate ang sapilitang pag-optimize.
Impormasyon sa mga talahanayan ng sistema ng ClickHouse
Tingnan natin ang istraktura ng talahanayan
- db pangalan (
database
); - pangalan ng talahanayan (
table
); - pangalan ng partisyon at ID (
partition
&partition_id
); - kapag ginawa ang piraso (
modification_time
); - minimum at maximum na petsa sa isang piraso (ginagawa ang partitioning ayon sa araw) (
min_date
&max_date
);
May table din
- db pangalan (
Tables.database
); - pangalan ng talahanayan (
Tables.table
); - panukat na edad kung kailan dapat ilapat ang susunod na pagsasama-sama (
age
);
Kaya:
- Mayroon kaming isang talahanayan ng mga chunks at isang talahanayan ng mga panuntunan sa pagsasama-sama.
- Pinagsasama namin ang kanilang intersection at makuha ang lahat ng mga talahanayan *GraphiteMergeTree.
- Hinahanap namin ang lahat ng mga partisyon kung saan:
- higit sa isang piraso
- o dumating na ang oras upang ilapat ang susunod na panuntunan sa pagsasama-sama, at
modification_time
mas matanda kaysa sa sandaling ito.
Pagpapatupad
Ang hiling na ito
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
ibinabalik ang bawat isa sa *GraphiteMergeTree table partition na ang pagsasama ay dapat magbakante ng espasyo sa disk. Ang tanging bagay na natitira upang gawin ay upang pumunta sa pamamagitan ng lahat ng ito na may isang kahilingan OPTIMIZE ... FINAL
. Ang pangwakas na pagpapatupad ay isinasaalang-alang din ang katotohanan na hindi na kailangang hawakan ang mga partisyon na may aktibong pag-record.
Ito mismo ang ginagawa ng proyekto
Kung patakbuhin mo ang program sa isang server na may ClickHouse, magsisimula lang itong magtrabaho sa daemon mode. Isang beses sa isang oras, isasagawa ang isang kahilingan, tinitingnan kung may mga bagong partition na mas matanda sa tatlong araw na lumitaw na maaaring i-optimize.
Ang aming mga agarang plano ay magbigay ng hindi bababa sa mga pakete ng deb, at kung maaari ring rpm.
Sa halip ng isang konklusyon
Sa nakalipas na 9+ na buwan ay nasa loob ako ng aking kumpanya
Ilang litro ng beer at araw ng admin ang ginugol sa pagbuo ng kahilingan, kasama ng
Pinagmulan: www.habr.com