ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск

ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск

Салом, хабр.

Агар касе системаро истисмор кунад графит-веб ва бо мушкилоти иҷрои нигаҳдорӣ дучор омад пичинг (IO, фазои диски истеъмолшуда), пас имкони пахши ClickHouse ҳамчун ивазкунанда бояд ба як тамоюл дошта бошад. Ин изҳорот маънои онро дорад, ки татбиқи тарафи сеюм аллакай ҳамчун метрикаи қабулкунандаи демон истифода мешавад, масалан карбоннавис ё рафтани карбон.

ClickHouse мушкилоти тавсифшударо хуб ҳал мекунад. Масалан, пас аз интиқоли 2TiB маълумот аз пичиррос, онҳо ба 300GiB мувофиқат мекунанд. Ман дар бораи муқоиса ба таври муфассал таваққуф намекунам; дар ин мавзӯъ мақолаҳои зиёде мавҷуданд. Илова бар ин, то ба наздикӣ, на ҳама чиз бо анбори ClickHouse мо комил буд.

Мушкилот бо фазои истеъмолшуда

Дар назари аввал, ҳама чиз бояд хуб кор кунад. Пайравӣ хуччатхо, конфигуратсияро барои нақшаи нигоҳдории метрҳо эҷод кунед (минбаъд retention), пас мувофиқи тавсияи пуштибонии интихобшуда барои graphite-web ҷадвал эҷод кунед: карбон-клик+graphite-clickhouse ё анбор, вобаста ба кадом стек истифода мешавад. Ва... бомбаи соатй мепарад.

Барои фаҳмидани кадоме аз онҳо, шумо бояд бидонед, ки чӣ гуна варақаҳо кор мекунанд ва роҳи минбаъдаи маълумот дар ҷадвалҳои муҳаррикҳои оилаи *MergeTree ClickHouse (диаграммаҳо аз муаррифӣ Алексей Зателепин):

  • Дохил карда шуд блок маълумот. Дар ҳолати мо, ин нишондиҳандаҳо буданд.
    ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск
  • Ҳар як чунин блок пеш аз навиштан ба диск мувофиқи калид ҷудо карда мешавад. ORDER BYҳангоми сохтани ҷадвал муайян карда мешавад.
  • Пас аз ҷудокунӣ, кусок (part) маълумот ба диск навишта мешавад.
    ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск
  • Сервер дар замина назорат мекунад, то ки чунин қисмҳо зиёд набошад ва заминаро оғоз кунад слияния (merge, минбаъд якҷоя карда мешавад).
    ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск
    ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск
  • Сервер баробари қатъ шудани воридшавии фаъоли маълумот ба партицию (partition), аммо шумо метавонед равандро дастӣ бо фармон оғоз кунед OPTIMIZE.
  • Агар дар қисмат танҳо як порча боқӣ монад, шумо наметавонед якҷоякуниро бо фармони муқаррарӣ иҷро кунед; шумо бояд истифода баред OPTIMIZE ... FINAL

Ҳамин тавр, нишондиҳандаҳои аввалин меоянд. Ва онҳо каме ҷойро ишғол мекунанд. Ҳодисаҳои минбаъда метавонанд вобаста ба бисёр омилҳо каме фарқ кунанд:

  • Калиди тақсимкунӣ метавонад ё хеле хурд (як рӯз) ё хеле калон (якчанд моҳ) бошад.
  • Конфигуратсияи нигоҳдорӣ метавонад ба якчанд ҳадди ниҳоии ҷамъоварии маълумот дар дохили қисмати фаъол мувофиқат кунад (дар он ҷо метрика сабт шудааст) ё шояд не.
  • Агар маълумоти зиёд мавҷуд бошад, пас порчаҳои аввалин, ки аз сабаби якҷояшавии замина метавонанд аллакай калон бошанд (агар шумо калиди тақсимкунии ғайримуқаррариро интихоб кунед), бо қисмҳои хурди тоза якҷоя намешаванд.

Ва он ҳамеша як хел анҷом меёбад. Фазое, ки аз рӯи ченакҳо дар ClickHouse ишғол мекунад, танҳо дар ҳолате зиёд мешавад, агар:

  • муроҷиат накунед OPTIMIZE ... FINAL дастӣ ё
  • ба таври доимӣ маълумотро ба ҳама қисмҳо дохил накунед, то дер ё зуд якҷояшавии замина оғоз шавад

Чунин ба назар мерасад, ки усули дуюм осонтарин татбиқшаванда аст ва аз ин рӯ, он нодуруст аст ва аввал санҷида шуд.
Ман як скрипти хеле соддаи python навиштам, ки дар тӯли 4 соли охир барои ҳар рӯз ченакҳои муҳоҷир фиристод ва ҳар соат cron кор мекард.
Азбаски тамоми амалиёти DBMS ClickHouse ба он асос ёфтааст, ки ин система дер ё зуд тамоми корҳои пасзаминаро иҷро хоҳад кард, аммо маълум нест, ки кай, ман натавонистам лаҳзаеро интизор шавам, ки қисмҳои азими кӯҳна барои якҷоя шудан бо онҳо мувофиқат мекунанд. нав хурд. Маълум шуд, ки мо бояд роҳи автоматикунонии оптимизатсияи маҷбуриро ҷустуҷӯ кунем.

ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск

Маълумот дар ҷадвалҳои системаи ClickHouse

Биёед сохтори ҷадвалро дида бароем система.қисмҳо. Ин маълумоти мукаммал дар бораи ҳар як порчаи ҳамаи ҷадвалҳо дар сервери ClickHouse мебошад. Дар байни чизҳои дигар, сутунҳои зеринро дар бар мегирад:

  • номи db (database);
  • номи ҷадвал (table);
  • номи бахш ва ID (partition & partition_id);
  • вақте ки порча офарида шуд (modification_time);
  • санаи ҳадди ақал ва ҳадди аксар дар як порча (тақсимкунӣ аз рӯи рӯз анҷом дода мешавад) (min_date & max_date);

Инчунин миз мавҷуд аст system.graphite_retentions, бо соҳаҳои ҷолиби зерин:

  • номи db (Tables.database);
  • номи ҷадвал (Tables.table);
  • синну соли метрикӣ, ки ҷамъбасти навбатӣ бояд татбиқ карда шавад (age);

Пас,

  1. Мо ҷадвали қисмҳо ва ҷадвали қоидаҳои ҷамъоварӣ дорем.
  2. Мо чорроҳаи онҳоро муттаҳид мекунем ва ҳама ҷадвалҳоро мегирем *GraphiteMergeTree.
  3. Мо ҳама қисмҳоро меҷӯем, ки дар онҳо:
    • зиёда аз як дона
    • ё вакти ба кор бурдани коидаи чамъоварии навбатй расидааст ва 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. Татбиқи ниҳоӣ инчунин он чизро ба назар мегирад, ки зарурати ламс кардани қисмҳои сабти фаъол вуҷуд надорад.

Ин маҳз ҳамон чизест, ки лоиҳа иҷро мекунад graphite-ch-optimizer. Ҳамкорони собиқи Яндекс.Маркет онро дар истеҳсолот санҷиданд, натиҷаи корро дар зер дидан мумкин аст.

ClickHouse + Graphite: чӣ тавр ба таври назаррас коҳиш додани масрафи фазои диск

Агар шумо барномаро дар сервер бо ClickHouse иҷро кунед, он танҳо дар реҷаи демон кор мекунад. Як маротиба дар як соат дархост иҷро карда мешавад ва тафтиш карда мешавад, ки қисмҳои нави аз се рӯз калонтар пайдо шудаанд, ки метавонанд оптимизатсия карда шаванд.

Нақшаҳои фаврии мо ин аст, ки ҳадди аққал бастаҳои deb ва агар имконпазир бошад, инчунин rpm пешниҳод кунанд.

Ба ҷои хулоса

Дар тӯли 9+ моҳи охир ман дар дохили ширкати худ будам Бозиҳо дар чорроҳаи ClickHouse ва graphite-web вақти зиёдеро сарф кард. Ин як таҷрибаи хубе буд, ки ба зудӣ аз пичиррос ба ClickHouse ҳамчун анбори метрикӣ гузарад. Умедворам, ки ин мақола як ибтидои як силсила дар бораи он аст, ки мо дар қисматҳои гуногуни ин стек чӣ беҳбудиҳо кардаем ва дар оянда чӣ корҳо анҷом дода мешаванд.

Якчанд литр пиво ва админ рӯз барои таҳияи дархост сарф шуд, дар якҷоягӣ бо v0devil, ки барои ин ба у миннатдорй баён кардан мехохам. Ва инчунин барои баррасии ин мақола.

Саҳифаи лоиҳа дар github

Манбаъ: will.com

Илова Эзоҳ