Салам, хабр.
Эгер кимдир бирөө системаны пайдаланса
ClickHouse сүрөттөлгөн көйгөйлөрдү жакшы чечет. Мисалы, 2TiB маалыматтарды шыбыраштан өткөрүп бергенден кийин, алар 300GiBга туура келет. Мен майда-чүйдөсүнө чейин салыштырууга токтолбойм, бул тема боюнча макалалар көп. Мындан тышкары, жакынкы убакка чейин биздин ClickHouse сактагычыбызда баары идеалдуу болгон эмес.
керектелүүчү мейкиндик менен көйгөйлөр
Бир караганда, баары жакшы иштеши керек. Кийинки retention
), андан кийин graphite-web үчүн тандалган сервердин сунушуна ылайык таблицаны түзүңүз:
Кайсынысын түшүнүү үчүн, сиз * үй-бүлөсүнүн кыймылдаткычтарынын таблицаларындагы кошумчалар кантип иштээрин жана маалыматтардын мындан аркы жашоо жолун билишиңиз керек.MergeTree ClickHouse (диаграммалар
- киргизилген
блок
маалыматтар. Биздин учурда, бул келген метрикалар болгон.
- Ар бир мындай блок дискке жазылганга чейин ачкычка жараша сорттолот.
ORDER BY
таблицаны түзүүдө көрсөтүлгөн. - сорттоо кийин,
кусок
(part
) маалыматтар дискке жазылат.
- Сервер фондо көзөмөлдөйт, мындай бөлүктөр көп болбошу үчүн жана фонду ишке киргизет
слияния
(merge
, мындан ары бириктирүү).
- Берилиштер жигердүү агып кирбей калганда сервер өз алдынча бириктирүүнү токтотот
партицию
(partition
), бирок сиз буйрук менен процессти кол менен баштасаңыз болотOPTIMIZE
. - Бөлүмдө бир гана бөлүк калса, анда сиз биригүүнү кадимки буйрукту иштете албайсыз; колдонушуңуз керек
OPTIMIZE ... FINAL
Ошентип, биринчи көрсөткүчтөр келет. Жана алар бир аз орун ээлейт. Кийинки окуялар көптөгөн факторлорго жараша бир аз өзгөрүшү мүмкүн:
- Бөлүү ачкычы өтө кичинекей (бир күн) же өтө чоң (бир нече ай) болушу мүмкүн.
- Сактоо конфигурациясы жигердүү бөлүмдүн ичиндеги бир нече маанилүү маалыматтарды топтоо босоголоруна туура келиши мүмкүн (метрикалар жазылган) же туура эмес.
- Эгерде маалыматтар көп болсо, анда фондун биригүүсүнөн улам эбегейсиз чоң болушу мүмкүн болгон эң алгачкы бөлүктөр (эгер сиз оптималдуу эмес бөлүүчү ачкычты тандасаңыз) жаңы майда бөлүктөр менен биригип кетпейт.
Ал ар дайым бир эле бүтөт. ClickHouse ичиндеги көрсөткүчтөр ээлеген мейкиндик төмөнкү учурларда гана көбөйөт:
- кайрылбаңыз
OPTIMIZE ... FINAL
кол менен же - бардык бөлүмдөргө маалыматтарды дайыма киргизбеңиз, андыктан эртеби-кечпи фондо бириктирүү башталат
Экинчи ыкманы ишке ашыруу эң оңой окшойт, демек, ал туура эмес жана биринчи жолу аракет кылынган.
Мен акыркы 4 жыл ичинде ар бир күн үчүн жасалма метрика жөнөткөн жана ар бир саат сайын cron иштеткен абдан жөнөкөй питон сценарийин жаздым.
ClickHouse DBMSтин бүтүндөй иштеши бул система эртеби-кечпи бардык фонддук иштерди аткара турганына негизделген, бирок качан белгисиз, мен эски чоң бөлүкчөлөр биригип баштоону каалаган учурду күтө албадым. жаңы кичинекейлер. Мажбурлап оптималдаштырууну автоматташтыруунун жолун издөө керек экени айкын болду.
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 менен серверде иштетсеңиз, ал жөн гана демон режиминде иштей баштайт. Саатына бир жолу өтүнүч аткарылып, оптималдаштырыла турган үч күндөн ашкан жаңы бөлүмдөрдүн пайда болгонун текшерет.
Биздин жакынкы пландарыбыз жок дегенде деб пакеттерин жана мүмкүн болсо rpm менен камсыз кылуу.
Ордуна корутундусу
Акыркы 9+ айдын ичинде мен өзүмдүн компаниямдын ичинде болдум
менен бирге, бир нече литр сыра жана админ күн өтүнүчтү иштеп чыгуу үчүн жумшалган
Source: www.habr.com