Салом, хабр.
Агар касе системаро истисмор кунад
ClickHouse мушкилоти тавсифшударо хуб ҳал мекунад. Масалан, пас аз интиқоли 2TiB маълумот аз пичиррос, онҳо ба 300GiB мувофиқат мекунанд. Ман дар бораи муқоиса ба таври муфассал таваққуф намекунам; дар ин мавзӯъ мақолаҳои зиёде мавҷуданд. Илова бар ин, то ба наздикӣ, на ҳама чиз бо анбори ClickHouse мо комил буд.
Мушкилот бо фазои истеъмолшуда
Дар назари аввал, ҳама чиз бояд хуб кор кунад. Пайравӣ retention
), пас мувофиқи тавсияи пуштибонии интихобшуда барои graphite-web ҷадвал эҷод кунед:
Барои фаҳмидани кадоме аз онҳо, шумо бояд бидонед, ки чӣ гуна варақаҳо кор мекунанд ва роҳи минбаъдаи маълумот дар ҷадвалҳои муҳаррикҳои оилаи *MergeTree ClickHouse (диаграммаҳо аз
- Дохил карда шуд
блок
маълумот. Дар ҳолати мо, ин нишондиҳандаҳо буданд.
- Ҳар як чунин блок пеш аз навиштан ба диск мувофиқи калид ҷудо карда мешавад.
ORDER BY
ҳангоми сохтани ҷадвал муайян карда мешавад. - Пас аз ҷудокунӣ,
кусок
(part
) маълумот ба диск навишта мешавад.
- Сервер дар замина назорат мекунад, то ки чунин қисмҳо зиёд набошад ва заминаро оғоз кунад
слияния
(merge
, минбаъд якҷоя карда мешавад).
- Сервер баробари қатъ шудани воридшавии фаъоли маълумот ба
партицию
(partition
), аммо шумо метавонед равандро дастӣ бо фармон оғоз кунедOPTIMIZE
. - Агар дар қисмат танҳо як порча боқӣ монад, шумо наметавонед якҷоякуниро бо фармони муқаррарӣ иҷро кунед; шумо бояд истифода баред
OPTIMIZE ... FINAL
Ҳамин тавр, нишондиҳандаҳои аввалин меоянд. Ва онҳо каме ҷойро ишғол мекунанд. Ҳодисаҳои минбаъда метавонанд вобаста ба бисёр омилҳо каме фарқ кунанд:
- Калиди тақсимкунӣ метавонад ё хеле хурд (як рӯз) ё хеле калон (якчанд моҳ) бошад.
- Конфигуратсияи нигоҳдорӣ метавонад ба якчанд ҳадди ниҳоии ҷамъоварии маълумот дар дохили қисмати фаъол мувофиқат кунад (дар он ҷо метрика сабт шудааст) ё шояд не.
- Агар маълумоти зиёд мавҷуд бошад, пас порчаҳои аввалин, ки аз сабаби якҷояшавии замина метавонанд аллакай калон бошанд (агар шумо калиди тақсимкунии ғайримуқаррариро интихоб кунед), бо қисмҳои хурди тоза якҷоя намешаванд.
Ва он ҳамеша як хел анҷом меёбад. Фазое, ки аз рӯи ченакҳо дар ClickHouse ишғол мекунад, танҳо дар ҳолате зиёд мешавад, агар:
- муроҷиат накунед
OPTIMIZE ... FINAL
дастӣ ё - ба таври доимӣ маълумотро ба ҳама қисмҳо дохил накунед, то дер ё зуд якҷояшавии замина оғоз шавад
Чунин ба назар мерасад, ки усули дуюм осонтарин татбиқшаванда аст ва аз ин рӯ, он нодуруст аст ва аввал санҷида шуд.
Ман як скрипти хеле соддаи python навиштам, ки дар тӯли 4 соли охир барои ҳар рӯз ченакҳои муҳоҷир фиристод ва ҳар соат cron кор мекард.
Азбаски тамоми амалиёти DBMS ClickHouse ба он асос ёфтааст, ки ин система дер ё зуд тамоми корҳои пасзаминаро иҷро хоҳад кард, аммо маълум нест, ки кай, ман натавонистам лаҳзаеро интизор шавам, ки қисмҳои азими кӯҳна барои якҷоя шудан бо онҳо мувофиқат мекунанд. нав хурд. Маълум шуд, ки мо бояд роҳи автоматикунонии оптимизатсияи маҷбуриро ҷустуҷӯ кунем.
Маълумот дар ҷадвалҳои системаи ClickHouse
Биёед сохтори ҷадвалро дида бароем
- номи db (
database
); - номи ҷадвал (
table
); - номи бахш ва 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-ро бармегардонад, ки якҷояшавии онҳо бояд фазои дискро холӣ кунад. Ягона коре боқӣ мондааст, ки бо дархост аз ҳамаи онҳо гузаштан OPTIMIZE ... FINAL
. Татбиқи ниҳоӣ инчунин он чизро ба назар мегирад, ки зарурати ламс кардани қисмҳои сабти фаъол вуҷуд надорад.
Ин маҳз ҳамон чизест, ки лоиҳа иҷро мекунад
Агар шумо барномаро дар сервер бо ClickHouse иҷро кунед, он танҳо дар реҷаи демон кор мекунад. Як маротиба дар як соат дархост иҷро карда мешавад ва тафтиш карда мешавад, ки қисмҳои нави аз се рӯз калонтар пайдо шудаанд, ки метавонанд оптимизатсия карда шаванд.
Нақшаҳои фаврии мо ин аст, ки ҳадди аққал бастаҳои deb ва агар имконпазир бошад, инчунин rpm пешниҳод кунанд.
Ба ҷои хулоса
Дар тӯли 9+ моҳи охир ман дар дохили ширкати худ будам
Якчанд литр пиво ва админ рӯз барои таҳияи дархост сарф шуд, дар якҷоягӣ бо
Манбаъ: will.com