
Салом, хабр.
Агар касе системаро истисмор кунад ва бо мушкилоти иҷрои нигаҳдорӣ дучор омад (IO, фазои диски истеъмолшуда), пас имкони пахши ClickHouse ҳамчун ивазкунанда бояд ба як тамоюл дошта бошад. Ин изҳорот маънои онро дорад, ки татбиқи тарафи сеюм аллакай ҳамчун метрикаи қабулкунандаи демон истифода мешавад, масалан ё .
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
Биёед сохтори ҷадвалро дида бароем . Ин маълумоти мукаммал дар бораи ҳар як порчаи ҳамаи ҷадвалҳо дар сервери 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+ моҳи охир ман дар дохили ширкати худ будам дар чорроҳаи ClickHouse ва graphite-web вақти зиёдеро сарф кард. Ин як таҷрибаи хубе буд, ки ба зудӣ аз пичиррос ба ClickHouse ҳамчун анбори метрикӣ гузарад. Умедворам, ки ин мақола як ибтидои як силсила дар бораи он аст, ки мо дар қисматҳои гуногуни ин стек чӣ беҳбудиҳо кардаем ва дар оянда чӣ корҳо анҷом дода мешаванд.
Якчанд литр пиво ва админ рӯз барои таҳияи дархост сарф шуд, дар якҷоягӣ бо , ки барои ин ба у миннатдорй баён кардан мехохам. Ва инчунин барои баррасии ин мақола.
Манбаъ: will.com




