Groetnis, habr.
As immen eksploitearret it systeem
ClickHouse lost de beskreaune problemen goed op. Bygelyks, nei it oerbringen fan 2TiB oan gegevens fan flúster, passe se yn 300GiB. Ik sil net yn detail oer de fergeliking stean; d'r binne genôch artikels oer dit ûnderwerp. Derneist, oant koartlyn, wie net alles perfekt mei ús ClickHouse-opslach.
Problemen mei ferbrûkte romte
Op it earste each moat alles goed wurkje. Folgjend retention
), meitsje dan in tabel neffens de oanbefelling fan 'e selekteare backend foar graphite-web:
Om te begripen hokker, moatte jo witte hoe't ynserts wurkje en it fierdere libbenspaad fan gegevens yn tabellen fan motoren fan 'e * famyljeMergeTree ClickHouse (grafiken nommen út
- Ynfoege
блок
data. Yn ús gefal wiene it de metriken dy't oankamen.
- Elk sa'n blok wurdt sorteare neffens de kaai foardat se op skiif skreaun wurde.
ORDER BY
oantsjutte by it meitsjen fan de tabel. - Nei it sortearjen,
кусок
(part
) gegevens wurde skreaun nei skiif.
- De tsjinner kontrolearret op 'e eftergrûn sadat d'r net in protte sokke stikken binne, en lanseart eftergrûn
слияния
(merge
, hjirnei gearfoegje).
- De tsjinner ophâldt te rinnen fúzjes op harsels sa gau as gegevens ophâldt aktyf streamt yn de
партицию
(partition
), mar jo kinne it proses manuell begjinne mei it kommandoOPTIMIZE
. - As d'r mar ien stik oer is yn 'e partysje, dan kinne jo de gearfoeging net útfiere mei it gewoane kommando; jo moatte brûke
OPTIMIZE ... FINAL
Dat, de earste metriken komme. En se nimme wat romte yn. Opfolgjende eveneminten kinne wat ferskille ôfhinklik fan in protte faktoaren:
- De partysjekaai kin heul lyts wêze (in dei) of heul grut (ferskate moannen).
- De behâldkonfiguraasje kin passe by ferskate wichtige gegevensaggregaasjedrompels binnen de aktive dieling (wêr't metriken wurde opnommen), of miskien net.
- As d'r in protte gegevens binne, dan sille de ierste brokken, dy't fanwege eftergrûnfúzje al enoarm wêze kinne (as jo in net-optimale partitioneringskaai kieze), harsels net fusearje mei frisse lytse brokken.
En it einiget altyd itselde. De romte beset troch metriken yn ClickHouse nimt allinich ta as:
- net oanfreegje
OPTIMIZE ... FINAL
hânmjittich of - net trochgeande gegevens yn alle partysjes ynfoegje, sadat ier of let in eftergrûnfúzje begjint
De twadde metoade liket de maklikste te ymplementearjen en is dêrom ferkeard en waard earst besocht.
Ik skreau in frij ienfâldich python-skript dat dummy-metriken stjoerde foar elke dei foar de ôfrûne 4 jier en elke oere cron rûn.
Sûnt de folsleine wurking fan ClickHouse DBMS is basearre op it feit dat dit systeem ier of letter al it eftergrûnwurk sil dwaan, mar it is net bekend wannear, koe ik net wachtsje op it momint dat de âlde enoarme stikken fertsjinje om te begjinnen mei te fusearjen mei nije lytse. It waard dúdlik dat wy moatte sykje nei in manier om twongen optimalisaasjes te automatisearjen.
Ynformaasje yn ClickHouse systeem tabellen
Litte wy ris nei de tabelstruktuer sjen
- db namme (
database
); - tabel namme (
table
); - namme en partition ID (
partition
&partition_id
); - doe't it stik makke waard (
modification_time
); - minimum en maksimum datum yn in stik (ferdieling wurdt dien troch dei) (
min_date
&max_date
);
Der is ek in tafel
- db namme (
Tables.database
); - tabel namme (
Tables.table
); - metryske leeftyd as de folgjende aggregaasje tapast wurde moat (
age
);
Dus:
- Wy hawwe in tabel fan brokken en in tabel fan aggregaasjeregels.
- Wy kombinearje harren krusing en krije alle tabellen * GraphiteMergeTree.
- Wy sykje alle partysjes wêryn:
- mear as ien stik
- of de tiid is kommen om te passen de folgjende aggregaasje regel, en
modification_time
âlder as dit momint.
Ymplemintaasje
Dit fersyk
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
jout elk fan 'e *GraphiteMergeTree-tabelpartysjes werom wêrfan de gearfoeging skiifromte frijmeitsje moat. It iennichste wat oerbliuwt is om se allegear troch te gean mei in fersyk OPTIMIZE ... FINAL
. De definitive ymplemintaasje hâldt ek rekken mei it feit dat d'r gjin needsaak is om partysjes te berikken mei aktive opname.
Dit is krekt wat it projekt docht
As jo it programma útfiere op in server mei ClickHouse, sil it gewoan begjinne te wurkjen yn daemon-modus. Ien kear yn 'e oere sil in fersyk útfierd wurde, kontrolearjen oft nije partysjes âlder dan trije dagen binne ferskynd dy't kinne wurde optimalisearre.
Us direkte plannen binne om op syn minst deb-pakketten te leverjen, en as it kin ek rpm.
Yn stee fan in konklúzje
Yn 'e ôfrûne 9+ moannen haw ik yn myn bedriuw west
Ferskate liters bier en admin dagen waarden bestege oan it ûntwikkeljen fan it fersyk, tegearre mei
Boarne: www.habr.com