Salam, habr.
Jika seseorang mengeksploitasi sistem
ClickHouse memecahkan masalah yang dijelaskan dengan baik. Misalnya, setelah mentransfer data sebesar 2TiB dari bisikan, data tersebut masuk ke dalam 300GiB. Saya tidak akan membahas perbandingannya secara detail, ada banyak artikel tentang topik ini. Selain itu, hingga saat ini, tidak semuanya sempurna dengan penyimpanan ClickHouse kami.
Masalah dengan ruang yang dikonsumsi
Sekilas, semuanya akan berjalan dengan baik. Mengikuti retention
), lalu buat tabel sesuai rekomendasi backend yang dipilih untuk graphite-web:
Untuk memahami yang mana, Anda perlu mengetahui cara kerja penyisipan dan jalur kehidupan selanjutnya dari data dalam tabel mesin keluarga *Gabungkan Pohon ClickHouse (grafik diambil dari
- Dimasukkan
Π±Π»ΠΎΠΊ
data. Dalam kasus kami, metriklah yang muncul.
- Setiap blok tersebut diurutkan berdasarkan kuncinya sebelum ditulis ke disk.
ORDER BY
ditentukan saat membuat tabel. - Setelah disortir,
ΠΊΡΡΠΎΠΊ
(part
) data ditulis ke disk.
- Server memonitor di latar belakang sehingga tidak banyak potongan seperti itu, dan meluncurkan latar belakang
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, selanjutnya digabungkan).
- Server berhenti menjalankan penggabungan dengan sendirinya segera setelah data berhenti mengalir secara aktif ke dalam
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), tetapi Anda dapat memulai proses secara manual dengan perintahOPTIMIZE
. - Jika hanya ada satu bagian yang tersisa di partisi, maka Anda tidak akan dapat menjalankan penggabungan menggunakan perintah biasa; Anda harus menggunakan
OPTIMIZE ... FINAL
Jadi, metrik pertama telah tiba. Dan mereka memakan ruang. Peristiwa selanjutnya mungkin sedikit berbeda tergantung pada banyak faktor:
- Kunci partisi bisa berukuran sangat kecil (sehari) atau sangat besar (beberapa bulan).
- Konfigurasi retensi mungkin sesuai dengan beberapa ambang batas agregasi data yang signifikan dalam partisi aktif (tempat metrik dicatat), atau mungkin tidak.
- Jika ada banyak data, maka potongan paling awal, yang karena penggabungan latar belakang mungkin sudah berukuran besar (jika Anda memilih kunci partisi yang tidak optimal), tidak akan digabungkan dengan potongan kecil yang baru.
Dan itu selalu berakhir sama. Ruang yang ditempati oleh metrik di ClickHouse hanya bertambah jika:
- jangan diterapkan
OPTIMIZE ... FINAL
secara manual atau - jangan memasukkan data ke semua partisi secara terus-menerus, sehingga cepat atau lambat penggabungan latar belakang akan dimulai
Metode kedua tampaknya paling mudah diterapkan dan oleh karena itu salah dan telah dicoba terlebih dahulu.
Saya menulis skrip python yang cukup sederhana yang mengirimkan metrik dummy setiap hari selama 4 tahun terakhir dan menjalankan cron setiap jam.
Karena seluruh operasi ClickHouse DBMS didasarkan pada kenyataan bahwa sistem ini cepat atau lambat akan melakukan semua pekerjaan latar belakang, tetapi tidak diketahui kapan, saya tidak dapat menunggu saat ketika potongan-potongan besar yang lama berkenan untuk mulai bergabung dengan yang kecil baru. Menjadi jelas bahwa kami perlu mencari cara untuk mengotomatiskan pengoptimalan yang dipaksakan.
Informasi dalam tabel sistem ClickHouse
Mari kita lihat struktur tabelnya
- nama DB (
database
); - nama tabel (
table
); - nama dan ID partisi (
partition
&partition_id
); - kapan karya itu dibuat (
modification_time
); - tanggal minimum dan maksimum dalam satu bagian (partisi dilakukan berdasarkan hari) (
min_date
&max_date
);
Ada juga meja
- nama DB (
Tables.database
); - nama tabel (
Tables.table
); - usia metrik ketika agregasi berikutnya harus diterapkan (
age
);
Jadi:
- Kami memiliki tabel potongan dan tabel aturan agregasi.
- Kami menggabungkan persimpangannya dan mendapatkan semua tabel *GraphiteMergeTree.
- Kami mencari semua partisi di mana:
- lebih dari satu potong
- atau waktunya telah tiba untuk menerapkan aturan agregasi berikutnya, dan
modification_time
lebih tua dari saat ini.
Implementasi
Permintaan ini
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
mengembalikan masing-masing partisi tabel *GraphiteMergeTree yang penggabungannya akan mengosongkan ruang disk. Satu-satunya hal yang harus dilakukan adalah melalui semuanya dengan sebuah permintaan OPTIMIZE ... FINAL
. Implementasi akhir juga memperhitungkan fakta bahwa tidak perlu menyentuh partisi dengan perekaman aktif.
Inilah yang dilakukan proyek ini
Jika Anda menjalankan program di server dengan ClickHouse, program akan mulai bekerja dalam mode daemon. Satu jam sekali permintaan akan dieksekusi, memeriksa apakah telah muncul partisi baru yang lebih lama dari tiga hari yang dapat dioptimalkan.
Rencana segera kami adalah menyediakan setidaknya paket deb, dan jika memungkinkan juga rpm.
Alih-alih sebuah kesimpulan
Selama 9+ bulan terakhir saya telah berada di dalam perusahaan saya
Beberapa liter bir dan hari admin dihabiskan untuk mengembangkan permintaan tersebut, bersama dengan
Sumber: www.habr.com