Sugeng rawuh, habr.
Yen wong eksploitasi sistem
ClickHouse ngrampungake masalah sing diterangake kanthi apik. Contone, sawise nransfer 2TiB data saka whisper, padha pas menyang 300GiB. Aku ora bakal mikir babagan perbandingan kanthi rinci; ana akeh artikel babagan topik iki. Kajaba iku, nganti saiki, ora kabeh sampurna karo panyimpenan ClickHouse kita.
Masalah karo papan sing dikonsumsi
Ing kawitan marketing, kabeh kudu bisa uga. Nderek retention
), banjur gawe tabel miturut rekomendasi backend sing dipilih kanggo graphite-web:
Kanggo ngerti sing endi, sampeyan kudu ngerti cara kerjane sisipan lan jalur urip data luwih lanjut ing tabel mesin kulawarga *MergeTree ClickHouse (grafik dijupuk saka
- Dilebokake
Π±Π»ΠΎΠΊ
data. Ing kasus kita, iku metrik sing teka.
- Saben blok kasebut diurutake miturut kunci sadurunge ditulis menyang disk.
ORDER BY
ditemtokake nalika nggawe tabel. - Sawise diurutake,
ΠΊΡΡΠΎΠΊ
(part
) data ditulis menyang disk.
- Server ngawasi ing latar mburi supaya ora akeh potongan kasebut, lan miwiti latar mburi
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, salajengipun gabung).
- Server mandheg mlaku merges dhewe sanalika data mandheg aktif mili menyang
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), nanging sampeyan bisa miwiti proses kanthi manual nganggo printahOPTIMIZE
. - Yen mung ana siji potong ing partisi, sampeyan ora bakal bisa mbukak gabungan nggunakake printah biasanipun; sampeyan kudu nggunakake
OPTIMIZE ... FINAL
Dadi, metrik pisanan teka. Lan padha njupuk sawetara papan. Acara sakteruse bisa beda-beda gumantung saka akeh faktor:
- Tombol partisi bisa dadi cilik banget (sedina) utawa gedhe banget (sawetara sasi).
- Konfigurasi retensi bisa uga cocog karo sawetara ambang agregasi data sing signifikan ing partisi aktif (ing ngendi metrik dicathet), utawa bisa uga ora.
- Yen ana akeh data, mula potongan paling awal, sing amarga latar mburi gabung bisa uga ageng (yen sampeyan milih kunci pemisahan sing ora optimal), ora bakal gabung karo potongan cilik sing seger.
Lan tansah ends padha. Spasi sing dikuwasani dening metrik ing ClickHouse mung mundhak yen:
- ora nglamar
OPTIMIZE ... FINAL
kanthi manual utawa - aja nglebokake data menyang kabeh partisi kanthi terus-terusan, supaya cepet utawa mengko gabungan latar mburi bakal diwiwiti
Cara kapindho katon paling gampang kanggo dileksanakake lan mulane ora bener lan dicoba dhisik.
Aku nulis skrip python sing cukup prasaja sing ngirim metrik dummy kanggo saben dina suwene 4 taun kepungkur lan mlayu cron saben jam.
Wiwit kabeh operasi ClickHouse DBMS adhedhasar kasunyatan sing sistem iki cepet utawa mengko bakal nindakake kabeh karya latar mburi, nanging ora dikenal nalika, Aku ora bisa ngenteni wayahe nalika bΓͺsik ageng lawas deign kanggo miwiti gabung karo. anyar cilik. Dadi jelas yen kita kudu golek cara kanggo ngotomatisasi optimasi paksa.
Informasi ing tabel sistem ClickHouse
Ayo ndeleng struktur meja
- jeneng db (
database
); - jeneng meja (
table
); - jeneng partisi lan ID (
partition
&partition_id
); - nalika potongan kasebut digawe (
modification_time
); - tanggal minimal lan maksimum ing sepotong (pemisahan ditindakake saben dina) (
min_date
&max_date
);
Ana uga meja
- jeneng db (
Tables.database
); - jeneng meja (
Tables.table
); - umur metrik nalika agregasi sabanjure kudu ditrapake (
age
);
Dadi:
- Kita duwe tabel potongan lan tabel aturan agregasi.
- Kita gabungke persimpangan lan entuk kabeh tabel *GraphiteMergeTree.
- We are looking for kabeh partisi kang:
- luwih saka siji potong
- utawa wektu wis teka kanggo aplikasi aturan panggabungan sabanjurΓ©, lan
modification_time
luwih tuwa tinimbang wayahe iki.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
panjalukan iki
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
ngasilake saben partisi tabel *GraphiteMergeTree sing gabung kudu mbebasake ruang disk. Siji-sijine perkara sing kudu ditindakake yaiku ngliwati kabeh kanthi panjaluk OPTIMIZE ... FINAL
. Implementasi pungkasan uga nyathet kasunyatan manawa ora perlu ndemek partisi kanthi rekaman aktif.
Iki persis apa sing ditindakake proyek kasebut
Yen sampeyan mbukak program ing server karo ClickHouse, iku mung bakal miwiti digunakake ing mode daemon. Sawise jam panjaluk bakal dileksanakake, mriksa manawa partisi anyar sing luwih lawas saka telung dina wis katon sing bisa dioptimalake.
Rencana langsung kita nyedhiyakake paling ora paket deb, lan yen bisa uga rpm.
Tinimbang kesimpulan
Swara 9+ sasi kepungkur aku wis nang perusahaan
Sawetara liter bir lan dina admin digunakake kanggo ngembangake panyuwunan kasebut, bebarengan karo
Source: www.habr.com