
Salam, habr.
Lamun batur exploits sistem sarta encountered masalah kinerja gudang (IO, spasi disk dihakan), lajeng kasempetan nu ClickHouse ieu tuang salaku ngagantian kedah condong hiji. Pernyataan ieu nunjukkeun yén palaksanaan pihak katilu parantos dianggo salaku métrik anu nampi daemon, contona. atawa .
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 , jieun konfigurasi pikeun skéma panyimpen métrik (salajengna retention), teras jieun tabel dumasar kana rekomendasi backend anu dipilih pikeun grafit-web: + atawa , gumantung kana tumpukan nu dipaké. Jeung... bom waktu pareum.
Pikeun ngartos anu mana, anjeun kedah terang kumaha sisipan jalan sareng jalur kahirupan salajengna data dina tabel mesin kulawarga *MergeTree ClickHouse (bagan dicokot tina Alexey Zatelepin):
- diselapkeun
блокdata. Dina kasus urang, éta métrik anu sumping.

- Unggal blok sapertos diurutkeun dumasar kana konci sateuacan ditulis kana disk.
ORDER BYdieusian 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 ... FINALsacara 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 . Ieu informasi komprehensif ngeunaan unggal sapotong sadaya tabel dina server ClickHouse. Ngandung, antara séjén, kolom handap:
- 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 , kalayan widang anu pikaresepeun ieu:
- 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_timeheubeul 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 ASCmulih 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 . Urut kolega ti Yandex.Market diusahakeun eta dina produksi, hasil karya bisa ditempo di handap ieu.

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 spent loba waktu tinkering di simpang ClickHouse jeung grafit-web. Ieu pangalaman alus, nu nyababkeun transisi gancang ti harewos ka ClickHouse salaku gudang métrik. Kuring miharep artikel ieu mangrupa awal runtuyan ngeunaan naon perbaikan kami geus dijieun pikeun sagala rupa bagian tina tumpukan ieu, sarta naon anu bakal dilakukeun dina mangsa nu bakal datang.
Sababaraha liter bir jeung admin dinten ieu spent dina ngamekarkeun pamundut, bareng jeung , pikeun anu kuring hoyong ngucapkeun sukur ka anjeunna. Sarta ogé pikeun reviewing artikel ieu.
sumber: www.habr.com




