Salam, habr.
Jika seseorang mengeksploitasi sistem
ClickHouse menyelesaikan masalah yang diterangkan dengan baik. Sebagai contoh, selepas memindahkan 2TiB data daripada bisikan, ia masuk ke dalam 300GiB. Saya tidak akan memikirkan perbandingan secara terperinci; terdapat banyak artikel mengenai topik ini. Di samping itu, sehingga baru-baru ini, tidak semuanya sempurna dengan storan ClickHouse kami.
Masalah dengan ruang yang digunakan
Pada pandangan pertama, semuanya harus berfungsi dengan baik. Mengikuti retention
), kemudian buat jadual mengikut cadangan hujung belakang yang dipilih untuk graphite-web:
Untuk memahami yang mana satu, anda perlu tahu cara sisipan berfungsi dan laluan hayat selanjutnya data dalam jadual enjin keluarga *MergeTree ClickHouse (carta diambil daripada
- Disisipkan
Π±Π»ΠΎΠΊ
data. Dalam kes kami, metrik yang tiba.
- Setiap blok tersebut diisih mengikut kekunci sebelum ditulis ke cakera.
ORDER BY
dinyatakan semasa membuat jadual. - Selepas menyusun,
ΠΊΡΡΠΎΠΊ
(part
) data ditulis ke cakera.
- Pelayan memantau di latar belakang supaya tidak terdapat banyak bahagian seperti itu, dan melancarkan latar belakang
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, selepas ini bergabung).
- Pelayan berhenti berjalan bergabung dengan sendirinya sebaik sahaja data berhenti mengalir secara aktif ke dalam
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), tetapi anda boleh memulakan proses secara manual dengan arahanOPTIMIZE
. - Jika hanya tinggal satu bahagian dalam partition, maka anda tidak akan dapat menjalankan gabungan menggunakan arahan biasa; anda mesti menggunakan
OPTIMIZE ... FINAL
Jadi, metrik pertama tiba. Dan mereka mengambil sedikit ruang. Peristiwa seterusnya mungkin agak berbeza bergantung pada banyak faktor:
- Kunci pembahagian boleh sama ada sangat kecil (sehari) atau sangat besar (beberapa bulan).
- Konfigurasi pengekalan mungkin sesuai dengan beberapa ambang pengagregatan data yang ketara dalam partition aktif (tempat metrik direkodkan), atau mungkin tidak.
- Jika terdapat banyak data, maka ketulan terawal, yang disebabkan penggabungan latar belakang mungkin sudah besar (jika anda memilih kekunci pembahagian yang tidak optimum), tidak akan bergabung dengan ketulan kecil yang baru.
Dan ia sentiasa berakhir sama. Ruang yang diduduki oleh metrik dalam ClickHouse hanya meningkat jika:
- jangan memohon
OPTIMIZE ... FINAL
secara manual atau - jangan masukkan data ke dalam semua partition secara berterusan, supaya lambat laun gabungan latar belakang akan bermula
Kaedah kedua nampaknya paling mudah untuk dilaksanakan dan, oleh itu, ia tidak betul dan telah dicuba terlebih dahulu.
Saya menulis skrip python yang agak mudah yang menghantar metrik tiruan untuk setiap hari selama 4 tahun yang lalu dan menjalankan cron setiap jam.
Oleh kerana keseluruhan operasi ClickHouse DBMS adalah berdasarkan fakta bahawa sistem ini lambat laun akan melakukan semua kerja latar belakang, tetapi tidak diketahui bila, saya tidak dapat menunggu saat apabila kepingan besar lama berkenan untuk mula bergabung dengan yang baru kecil. Ia menjadi jelas bahawa kami perlu mencari cara untuk mengautomasikan pengoptimuman paksa.
Maklumat dalam jadual sistem ClickHouse
Mari kita lihat struktur jadual
- nama db (
database
); - nama jadual (
table
); - nama partition dan ID (
partition
&partition_id
); - apabila sekeping itu dicipta (
modification_time
); - tarikh minimum dan maksimum dalam sekeping (pembahagian dilakukan mengikut hari) (
min_date
&max_date
);
Terdapat juga meja
- nama db (
Tables.database
); - nama jadual (
Tables.table
); - umur metrik apabila pengagregatan seterusnya harus digunakan (
age
);
Jadi:
- Kami mempunyai jadual ketulan dan jadual peraturan pengagregatan.
- Kami menggabungkan persimpangan mereka dan mendapatkan semua jadual *GraphiteMergeTree.
- Kami sedang mencari semua partition di mana:
- lebih daripada sehelai
- atau sudah tiba masanya untuk menggunakan peraturan pengagregatan seterusnya, dan
modification_time
lebih tua daripada saat ini.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
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 setiap sekatan jadual *GraphiteMergeTree yang penggabungannya akan mengosongkan ruang cakera. Satu-satunya perkara yang perlu dilakukan ialah melalui mereka semua dengan permintaan OPTIMIZE ... FINAL
. Pelaksanaan akhir juga mengambil kira hakikat bahawa tidak perlu menyentuh partition dengan rakaman aktif.
Inilah yang dilakukan oleh projek itu
Jika anda menjalankan program pada pelayan dengan ClickHouse, ia hanya akan mula berfungsi dalam mod daemon. Sekali sejam permintaan akan dilaksanakan, menyemak sama ada partition baharu yang lebih lama daripada tiga hari telah muncul yang boleh dioptimumkan.
Rancangan segera kami adalah untuk menyediakan sekurang-kurangnya pakej deb, dan jika boleh juga rpm.
Daripada kesimpulan
Sepanjang 9+ bulan yang lalu saya telah berada di dalam syarikat saya
Beberapa liter bir dan hari pentadbir dihabiskan untuk membangunkan permintaan itu, bersama-sama dengan
Sumber: www.habr.com