áááºá¹ááá¬áá«
áá
áºá
á¯á¶áá
áºáá±á¬ááºá á
áá
áºááᯠá¡áá¯á¶ážáá»áááº
ClickHouse ááẠáá±á¬áºááŒáá¬ážáá±á¬ ááŒá¿áá¬áá»á¬ážááᯠáá±á¬ááºážááœááºá áœá¬ ááŒá±ááŸááºážáá±ážáááºá á¥ááá¬á¡á¬ážááŒáá·áºá á¡áá¶ááá¯ážááá¯ážááŸáá±áᬠ2TiB ááá¯ááœáŸá²ááŒá±á¬ááºážááŒá®ážáá±á¬ááºá áááºážááá¯á·ááẠ300GiB ááá¯á· á¡á¶áááºááœááºáá»ááŒá áºáááºá á¡áá±ážá áááºááŸáá¯ááºážááŸá¥áºááŸá¯ááœáẠáá«ááá±ááá¯áá«á á€á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áº áááºáááºá áá±á¬ááºážáá«ážáá»á¬ážá áœá¬ááŸááá«áááºá ááá¯á·á¡ááŒááºá áááŒá¬áá±ážáá®á¡ááá áá»áœááºá¯ááºááá¯á·á ClickHouse ááá¯ááŸá±á¬ááºááŸá¯ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááẠááŒá®ážááŒáá·áºá á¯á¶ááŒááºážáááŸááá±ážáá«á
áá±á¬ááºáá²á·áá±áá¬áá²á· ááŒá¿áá¬ááœá±
á¡á
ááá¯ááºážááŸá¬áá±á¬á· á¡áá¬á¡á¬ážáá¯á¶ážá áá±á¬ááºážáá±á¬ááºážá¡áá¯ááºáá¯ááºááá·áºáááºá ááá¯ááºáá±áááºá retention
) ááá¯á·áá±á¬áẠááááºááá¯ááº-áááºá¡ááœáẠááœá±ážáá»ááºáá¬ážáá±á¬ áá±á¬ááºááœááºá០á¡ááŒá¶ááŒá¯áá»ááºá¡ááá¯ááºáž ááá¬ážáá
áºáá¯ááᯠáááºáá®ážáá«-
áááºááá·áºá¡áá¬ááᯠáá¬ážáááºáááºá * áááá¬ážá
á¯á á¡ááºáá»ááºááá¬ážáá»á¬ážááœáẠááá·áºááœááºážááŸá¯áá»á¬áž áááºááá¯á·áá¯ááºáá±á¬ááºáá¯á¶ááŸáá·áº áá±áá¬á áá±á¬ááºáááºáááááºážááŒá±á¬ááºážááᯠááááŸáááẠááá¯á¡ááºáá«áááºáMergeTree ClickHouse (ááá¬ážááœááºáá»á¬áž
- ááá·áºááœááºážáá²á·áááºá
блПк
áá±áá¬á áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá áááºážáááºáá±á¬ááºááŸááá¬áá±á¬ááá¯ááºážáá¬ááŸá¯áá»á¬ážááŒá áºáááºá
- ááá¯áá²á·ááá¯á·áá±á¬ ááá±á¬ááºáá
áºáá¯á
á®ááᯠdisk ááá¯á·ááá±ážáá® áá±á¬á·á¡ááá¯ááºá
á®áá¬ážáááºá
ORDER BY
ááá¬ážááá¯áááºáá®ážáá±á¬á¡áá«áááºááŸááºáá¬ážáááºá - á
á®ááŒá®ážáá±á¬ááºá
кÑÑПк
(part
) data ááœá±ááᯠdisk ááŸá¬áá±ážáá¬ážáááºá
- ááá¯ááá¯á·áá±á¬á¡ááá¯ááºážáá»á¬ážá
áœá¬ááá«áááºá
á±ááẠáá¬áá¬ááẠáá±á¬ááºáá¶ááœááºá
á±á¬áá·áºááŒáá·áºááŒá®áž áá±á¬ááºáá¶ááá¯ááœáá·áºáááºá
ÑлОÑМОÑ
(merge
áá±á¬ááºá០áá±á«ááºážá ááºážáá«á)
- áá±áá¬áá»á¬áž áááºááŒáœá
áœá¬ á
á®ážáááºážááŸá¯ áááºááá·áºááœá¬ážáááºááŸáá·áº áááŒáá¯ááºááẠáá¬áá¬ááẠáá°á·áá¬áá¬áá° áá±á«ááºážá
ááºážááŒááºáž áááºááá·áºááœá¬ážáá«áááºá
паÑÑОÑОÑ
(partition
) ááá¯á·áá±á¬áº áááºááẠcommand ááŒáá·áº áá¯ááºáááºážá ááºááᯠááá¯ááºááá¯ááºá áááºááá¯ááºáááºáOPTIMIZE
. - partition ááœáẠá¡ááá¯ááºážáá
áºááá¯ááºážáá¬áá»ááºáá«áá áá¯á¶ááŸáẠcommand ááᯠá¡áá¯á¶ážááŒá¯á áá±á«ááºážá
ááºážááŒááºážááᯠáááºá¡áá¯á¶ážááŒá¯áááẠááá¯ááºáá«á
OPTIMIZE ... FINAL
áá®áá±á¬á· ááááá¯á¶áž ááá¯ááºážáá¬ááŸá¯ááœá± áá±á¬ááºáá¬áááºá ááŒá®ážáá±á¬á· áá°ááá¯á·á áá±áá¬áá°áááºá á¡ááŒá±á¬ááºážáááºážáá»á¬ážá áœá¬áá±á«áºáá°áááºááŒá®áž áá±á¬ááºáááºááœá²ááŒá áºáááºáá»á¬ážááẠá¡áááºážáááºááœá²ááŒá¬ážááá¯ááºáááº-
- á¡ááá¯ááºážááœá²ááŒááºážáá±á¬á·ááẠá¡ááœááºáá±ážáááºáá±á¬ (áá áºáá±á·) ááá¯á·ááá¯áẠá¡ááœááºááŒá®áž (ááá±á«ááºážáá»á¬ážá áœá¬) ááŒá áºááá¯ááºáááºá
- ááááºážááááºážááŸá¯áá¯á¶á á¶ááẠáááºááŒáœáá±á¬á¡ááá·áº (áááºááá áºáá»á¬ážááᯠááŸááºáááºážáááºáá¬ážááá·áº) á¡ááœááºáž áááá¬áááºááŸá¬ážáá±á¬ áá±áá¬á á¯á ááºážááŸá¯ áááºááŸááºáá»ááºáá»á¬ážááŸáá·áº ááá¯ááºáá®ááá¯ááºááẠááá¯á·ááá¯áẠááŒá áºááá¯ááºáááºá
- áá±áá¬áá»á¬ážá áœá¬ááŸááá«áá áá±á¬ááºáá¶áá±á«ááºážá ááºááŸá¯ááŒá±á¬áá·áº ááŒá®ážáá¬ážáá±ááŒá®ááŒá áºáá±á¬ (á¡ááá·áºáá±á¬áºáá¯á¶ážááá¯ááºáá±á¬ á¡ááá¯ááºážááœá²ááŒááºážáá®ážááᯠááœá±ážáá»ááºáá«á) á¡á á±á¬áá¯á¶ážá¡ááá¯ááºážáá»á¬ážááẠáááºážááá¯á·ááᯠáá±ážáááºáá±á¬á¡ááá¯ááºážáá»á¬ážááŸáá·áº áá±á«ááºážá ááºáááºááá¯ááºáá«á
ááŒá®ážáá±á¬á· á¡ááŒá²áááºáž á¡áá°áá°áá«áá²á ClickHouse ááŸá áááºááá áºáá»á¬ážááŒáá·áº ááááºážááá¯ááºáá¬ážáá±á¬ áá±áá¬ááẠááá¯ážáá¬áá«á-
- ááááºááá¯ááºáá«á
OPTIMIZE ... FINAL
ááá¯ááºááá¯áẠááá¯á·ááá¯áẠ- áááºáááºáá¯ááºáá±á¬ááºáá±ááá·áº á¡ááá¯ááºážáá»á¬ážá¡á¬ážáá¯á¶ážááœáẠáá±áá¬áááá·áºáá«ááŸáá·áºá ááá¯á·ááŒá±á¬áá·áº áááŒá¬áá® ááá¯á·ááá¯áẠáá±á¬ááºááá¯ááºážááœáẠáá±á¬ááºáá¶áá±á«ááºážá ááºážááŸá¯ á áááºááá¯ááºáááºááŒá áºáááºá
áá¯ááááááºážáááºážááẠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠá¡ááœááºáá°áá¯á¶ážááŒá
áºáá¯á¶áááŒá®áž áááºážááẠááŸá¬ážááœááºážáá±ááŒá®áž áŠážá
áœá¬ááŒáá¯ážá
á¬ážáá²á·áááºá
áá»áœááºá¯ááºááẠááœááºáá²á·áá±á¬ 4 ááŸá
áºáá¬áá¬áá¡ááœááºáž áá±á·á
ááºáá±á·ááá¯ááºážá¡ááœáẠdummy metrics áá»á¬ážáá±ážááá¯á·ááŒá®áž áá¬áá®ááá¯ááºáž cron áááºáááºá
á±áá±á¬ á¡áá±á¬áºáá±ážááá¯ážááŸááºážáá±á¬ python script ááá¯áá±ážáá²á·áááºá
ClickHouse DBMS á áááºáááºááŸá¯áá
áºáá¯áá¯á¶ážááẠá€á
áá
áºááẠáááŒá¬áá® ááá¯á·ááá¯áẠáá±á¬ááºááá¯ááºážááœáẠáá±á¬ááºáá¶á¡áá¯ááºá¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºáááºáá°áá±á¬á¡áá»ááºá¡áá±á«áº á¡ááŒá±áá¶áá¬ážáá±á¬ááŒá±á¬áá·áºá ááá¯á·áá±á¬áº áááºááá·áºá¡áá»áááºááœáẠáá¯ááºáá±á¬ááºáááºááᯠáááááá±ážáá«á ááŒá®ážáá¬ážáá±á¬á¡ááá¯ááºážá¡á
áá»á¬ážááŸáá·áº á
áááºáá±á«ááºážá
ááºááá·áºá¡áá»áááºááᯠáá»áœááºá¯áẠáá
á±á¬áá·áºááá¯ááºáá²á·áá«á á¡áá
áºáá±ážááœá±á á¡áááºážá¡ááŒáẠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááẠáááºážáááºážááŸá¬ááœá±ááẠááá¯á¡ááºááŒá±á¬ááºáž áááºááŸá¬ážáá¬áá«áááºá
ClickHouse á áá áºááá¬ážáá»á¬ážááŸá á¡áá»ááºá¡áááº
ááá¬ážááœá²á·á
ááºážáá¯á¶ááá¯ááŒáá·áºáá¡á±á¬ááº
- db á¡ááẠ(
database
); - ááá¬ážá¡ááẠ(
table
); - partition á¡áááºááŸáá·áº ID (
partition
&partition_id
); - á¡ááá¯ááºážááᯠáááºáá®ážáá²á·áá¯ááºážá (
modification_time
); - á¡ááá¯ááºážáá
áºáá¯ááœáẠá¡áááºážáá¯á¶ážááŸáá·áº á¡áá»á¬ážáá¯á¶ážáááºá
áœá² (á¡ááá¯ááºážááœá²ááŒááºážááᯠáá±á·á¡ááá¯ááºáá¯ááºáá±á¬ááºáááº) (
min_date
&max_date
);
á
á¬ážááœá²áááºážááŸááááºá
- db á¡ááẠ(
Tables.database
); - ááá¬ážá¡ááẠ(
Tables.table
); - áá±á¬ááºáá
áºáá¯áá±á«ááºážá
ááºážááŒááºážááᯠá¡áá¯á¶ážááŒá¯ááá·áºáá±á¬á¡áá« áááºááá
áºá¡ááẠ(
age
);
áá®áá±á¬á·:
- áá»áœááºá¯ááºááá¯á·ááœáẠá¡ááá¯ááºážááá¬ážáá áºáá¯ááŸáá·áº áá±á«ááºážá ááºá ááºážáá»ááºážáá»á¬áž ááá¬ážáá áºáá¯ááŸááááºá
- áá»áœááºá¯ááºááá¯á·ááẠáááºážááá¯á·á áááºážáá¯á¶áá»á¬ážááᯠáá±á«ááºážá ááºááŒá®áž *GraphiteMergeTree ááá¬ážá¡á¬ážáá¯á¶ážááᯠááá°ááá¯ááºáá«á
- áá»áœááºá¯ááºááá¯á·ááẠá¡ááá¯ááºážááá¯ááºážá¡á¬ážáá¯á¶ážááᯠááŸá¬ááœá±áá±áá«áááºá
- áá áºáá¯á¶ážáááºááá¯áááºá
- ááá¯á·ááá¯áẠáá±á¬ááºáá
áºáá¯áá±á«ááºážá
ááºážááŸá¯á
ááºážáá»ááºážááᯠáá»áá·áºáá¯á¶ážááẠá¡áá»áááºáá»áá±á¬ááºáá¬ááŒá®ááŒá
áºáááºá
modification_time
áá®á¡áá»áááºááẠá¡áááºááŒá®ážáááºá
á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯
áá®áá±á¬ááºážááá¯áá»ááº
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
*GraphiteMergeTree table partitions áá
áºáá¯á
á®ááᯠáá±á«ááºážá
ááºážááŒááºážááẠdisk space ááᯠááœááºá
á±ááá·áºáááºá áá±á¬ááºážááá¯áá»ááºáá
áºáá¯ááŒáá·áº áááºážááá¯á·á¡á¬ážáá¯á¶ážááᯠááŒááºáá»á±á¬áºááẠáá
áºáá¯áááºážáᬠáá»ááºáá±á¬á·áááºá OPTIMIZE ... FINAL
. áá±á¬ááºáá¯á¶áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááœáẠáááºááŒáœá
áœá¬ ááŸááºáááºážáááºááŒááºážááŒáá·áº partitions áá»á¬ážááᯠáááááºáááá¯á¡ááºáá°áá±á¬á¡áá»ááºááá¯áááºáž ááá·áºááœááºážá
ááºážá
á¬ážáá«áááºá
áá«á ááá±á¬áá»ááºáá¯ááºáᬠá¡ááá¡áá»áá²á
á¡áááºá áááºááẠClickHouse ááŒáá·áºáá¬áá¬áá áºáá¯áá±á«áºááœááºáááá¯ááááºááᯠrun áá«áá áááºážááẠdaemon áá¯ááºááœááºááá¯ážááŸááºážá áœá¬á áááºá¡áá¯ááºáá¯ááºáááá·áºáááºá áá áºáá¬áá® áá áºááŒááẠáá±ážááŒááºážááŸá¯ááᯠáá¯ááºáá±á¬ááºáááºááŒá áºááŒá®ážá áá¯á¶ážáááºááẠáá±á¬ááºážáá±á¬ á¡ááá¯ááºážá¡áá áºáá»á¬áž áá±á«áºááœááºááŒááºáž ááŸáá áááŸá á á áºáá±ážááŒááºážááŒáá·áº ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬áẠááŒá¯áá¯ááºááá¯ááºáááºá
áá»áœááºá¯ááºááá¯á·ááá»ááºáá»ááºážá¡á á®á¡á á¥áºáá»á¬ážááẠá¡áááºážáá¯á¶áž deb áááºáá±á·áá»áºáá»á¬ážááᯠáá±ážáá±á¬ááºáááºááŒá áºááŒá®áž ááŒá áºááá¯ááºáá«á rpm áááºážááŒá áºáááºá
á¡á²áá®á¡á á¬ážáá áºá¥á®ážáááá¯á¶ážááá¯ááºážá
ááœááºáá²á·ááá·áº 9 ááá»á±á¬áºá¡ááœááºáž áá»áœááºá¯ááºááẠáá»áœááºá¯ááºá áá¯áá¹ááá®ááœáẠááŸááá±áá«áááºá
áá±á¬ááºážááá¯ááŸá¯ááŸáá·áºá¡áá° áá®áá¬áá®áá¬áá»á¬ážá
áœá¬ááŸáá·áº á
á®áá¶ááá·áºááœá²áá°áá±á·áááºáá»á¬ážá
áœá¬ááᯠáá¯á¶ážá
áœá²áá²á·áááºá
source: www.habr.com