Salam, habr.
Lamun batur exploits sistem
ClickHouse ngabéréskeun masalah anu dijelaskeun ogé. Contona, sanggeus mindahkeun 2TiB data tina harewos, aranjeunna cocog kana 300GiB. Kuring moal cicing dina ngabandingkeun sacara rinci; aya seueur tulisan ngeunaan topik ieu. Salaku tambahan, dugi ka ayeuna, henteu sadayana sampurna sareng panyimpenan ClickHouse kami.
Masalah sareng rohangan anu dikonsumsi
Dina glance kahiji, sagalana kedah dianggo ogé. Nurutan retention
), teras jieun tabel dumasar kana rekomendasi backend anu dipilih pikeun grafit-web:
Pikeun ngartos anu mana, anjeun kedah terang kumaha sisipan jalan sareng jalur kahirupan salajengna data dina tabel mesin kulawarga *MergeTree ClickHouse (bagan dicokot tina
- diselapkeun
блок
data. Dina kasus urang, éta métrik anu sumping.
- Unggal blok sapertos diurutkeun dumasar kana konci sateuacan ditulis kana disk.
ORDER BY
dieusian nalika nyieun tabél. - Sanggeus diurutkeun,
кусок
(part
) data ditulis kana disk.
- Server ngawas di latar tukang supados henteu seueur potongan sapertos kitu, sareng ngaluncurkeun latar
слияния
(merge
, saterusna ngahiji).
- Server eureun ngajalankeun merges sorangan pas data eureun aktip ngalir kana
партицию
(partition
), tapi anjeun tiasa ngamimitian prosés sacara manual ku paréntahOPTIMIZE
. - Upami ngan ukur aya sapotong anu tinggaleun dina partisi, maka anjeun moal tiasa ngajalankeun gabungan nganggo paréntah biasa; anjeun kedah nganggo
OPTIMIZE ... FINAL
Janten, métrik munggaran sumping. Sareng aranjeunna nyandak sababaraha rohangan. Kajadian saterusna bisa rupa-rupa gumantung kana sababaraha faktor:
- Konci partisi tiasa alit pisan (sadinten) atanapi ageung pisan (sababaraha bulan).
- Konfigurasi ingetan tiasa nyocogkeun sababaraha ambang agrégasi data anu penting dina partisi aktip (tempat métrik dirékam), atanapi panginten henteu.
- Upami aya seueur data, maka sakumpulan pangheubeulna, anu kusabab latar tukang ngahiji tiasa ageung (upami anjeun milih konci partisi anu henteu optimal), moal ngahijikeun diri sareng sakumpulan leutik seger.
Sarta eta salawasna ends sarua. Ruang anu dijajah ku métrik di ClickHouse ngan ukur ningkat upami:
- teu nerapkeun
OPTIMIZE ... FINAL
sacara manual atawa - ulah nyelapkeun data kana sagala partitions on hiji basis lumangsung, ku kituna sooner atanapi engké ngahiji latar bakal dimimitian
Metodeu kadua sigana anu panggampangna pikeun dilaksanakeun sareng, ku kituna, éta lepat sareng dicoba heula.
Kuring nulis skrip python anu cukup saderhana anu ngirim métrik dummy pikeun unggal dinten salami 4 taun ka pengker sareng ngajalankeun cron unggal jam.
Kusabab sakabéh operasi ClickHouse DBMS ieu dumasar kana kanyataan yén sistem ieu sooner atanapi engké bakal ngalakukeun sagala pagawean tukang, tapi teu dipikawanoh nalika, Kuring éta teu bisa ngadagoan momen nalika potongan badag heubeul deign pikeun ngamimitian merging kalawan. anyar leutik. Janten jelas yén urang kedah milarian cara pikeun ngajadikeun otomatis optimasi paksa.
Émbaran dina tabel sistem ClickHouse
Hayu urang nempo struktur tabel
- ngaran db (
database
); - ngaran tabel (
table
); - nami partisi sareng ID (
partition
&partition_id
); - nalika potongan diciptakeun (
modification_time
); - tanggal minimum jeung maksimum dina sapotong (partisi dipigawé ku poé) (
min_date
&max_date
);
Aya ogé méja
- ngaran db (
Tables.database
); - ngaran tabel (
Tables.table
); - umur métrik nalika aggregation salajengna kedah diterapkeun (
age
);
jadi:
- Simkuring gaduh tabel sakumpulan sarta tabel aturan aggregation.
- Urang ngagabungkeun simpang maranéhanana sarta meunang sagala tabel *GraphiteMergeTree.
- Kami milarian sadaya partisi dimana:
- leuwih ti hiji sapotong
- atawa waktu geus datangna pikeun nerapkeun aturan aggregation salajengna, jeung
modification_time
heubeul ti moment ieu.
Реализация
pamundut ieu
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
mulih unggal *GraphiteMergeTree partisi tabel nu merging kudu ngosongkeun spasi disk. Hiji-hijina hal anu kedah dilakukeun nyaéta ngaliwat sadayana kalayan pamenta OPTIMIZE ... FINAL
. Palaksanaan ahir ogé tumut kana akun kanyataan yén teu kudu noél partisi jeung rekaman aktip.
Ieu persis naon proyek teu
Upami anjeun ngajalankeun program dina server sareng ClickHouse, éta ngan saukur bakal ngamimitian damel dina modeu daemon. Sakali sajam hiji pamundut bakal dieksekusi, mariksa naha partitions anyar heubeul leuwih tilu poé geus mucunghul nu bisa dioptimalkeun.
Rencana langsung kami nyayogikeun sahenteuna pakét deb, sareng upami mungkin ogé rpm.
Gantina kacindekan
Sapanjang 9+ sasih kuring parantos aya di perusahaan kuring
Sababaraha liter bir jeung admin dinten ieu spent dina ngamekarkeun pamundut, bareng jeung
sumber: www.habr.com