
Kumusta habr.
Kung adunay nag-operate sa sistema ug midagan ngadto sa storage performance isyu (IO, ang espasyo sa disk nahurot), unya ang higayon nga ang ClickHouse gitan-aw ingon usa ka kapuli kinahanglan hapit sa usa. Kini nga pahayag nagpasabot nga ang usa ka ikatulo nga partido nga pagpatuman gigamit na ingon nga nakadawat nga daemon, pananglitan o .
Gisulbad sa ClickHouse ang mga problema nga gihulagway nga maayo. Pananglitan, pagkahuman sa pagbubo sa 2TiB nga datos gikan sa hunghong, kini mohaum sa 300GiB. Dili ako maghisgot sa pagtandi sa detalye, adunay igo nga mga artikulo bahin niini nga hilisgutan. Dugang pa, hangtod karon, dili tanan perpekto sa among pagtipig sa ClickHouse.
Mga Isyu sa Gikonsumo nga Luna
Sa una nga pagtan-aw, ang tanan kinahanglan nga molihok nga maayo. Nagsunod , paghimo og config para sa metrics storage scheme (human niini retention), dayon paghimo ug lamesa sumala sa rekomendasyon sa pinili nga graphite-web backend: + o , depende kung asa nga stack ang gigamit. Ug⦠usa ka bomba sa panahon ang gipalihok.
Aron masabtan kung hain, kinahanglan nimo mahibal-an kung giunsa ang mga pagsal-ot ug ang dugang nga agianan sa kinabuhi sa datos sa mga lamesa sa mga makina sa pamilya *MergeTree ClickHouse (mga diagram nga gikuha gikan sa Alexey Zatelepin):
- Gisulod
Π±Π»ΠΎΠΊdatos. Sa among kaso, kini ang mga sukatan.

- Ang matag ingon nga bloke gihan-ay sumala sa yawe sa wala pa isulat sa disk.
ORDER BYAng gipiho kung kanus-a gihimo ang lamesa. - Human sa pag-sorte,
ΠΊΡΡΠΎΠΊ(part) ang datos gisulat sa disk.

- Ang server nag-monitor sa background aron dili daghan ang ingon nga mga piraso, ug maglansad sa background
ΡΠ»ΠΈΡΠ½ΠΈΡ(merge, unya i-merge).


- Ang server mohunong sa paglansad sa paghiusa sa kaugalingon sa diha nga ang data mohunong sa aktibong pag-agos ngadto
ΠΏΠ°ΡΡΠΈΡΠΈΡ(partition), apan mahimo nimong sugdan ang proseso nga mano-mano gamit ang sugoOPTIMIZE. - Kung adunay usa ra ka piraso nga nahabilin sa partisyon, nan dili nimo masugdan ang paghiusa sa naandan nga mando, kinahanglan nimo gamiton
OPTIMIZE ... FINAL
Mao nga, ang una nga mga sukatan moabut. Ug nagkuha sila og luna. Ang sunod nga mga panghitabo mahimong magkalainlain depende sa daghang mga hinungdan:
- Ang yawe sa partisyon mahimong gamay kaayo (usa ka adlaw) o dako kaayo (pila ka bulan).
- Ang retention config mahimong mohaum sa daghang mahinungdanong data aggregation thresholds sulod sa aktibong partition (diin gisulat ang metrics), o tingali dili.
- Kung adunay daghang mga datos, nan ang labing una nga mga tipik, nga mahimoβg dako na tungod sa paghiusa sa background (kung nagpili usa ka dili kamalaumon nga yawe sa partisyon), dili maghiusa sa ilang mga kaugalingon sa bag-ong gagmay nga mga tipik.
Ug kini kanunay nga matapos. Ang lugar nga giokupar sa mga sukatan sa ClickHouse motubo lamang kung:
- ayaw pag-apply
OPTIMIZE ... FINALmanwal o - ayaw pagsal-ot og data sa tanang partisyon sa padayon nga basehan aron makasugod ug background merge sa madugay o sa madali
Ang ikaduha nga pamaagi ingon nga labing kadali nga ipatuman ug, busa, kini sayup ug gisulayan sa una.
Nagsulat ako usa ka yano nga script sa python nga nagpadala mga dummy metric alang sa matag adlaw sa miaging 4 ka tuig ug nagdagan matag oras nga adunay cron.
Tungod kay ang tanan nga mga buhat sa ClickHouse DBMS gibase sa kamatuoran nga kini nga sistema sa madugay o sa madali mobuhat sa tanan nga mga buhat sa background, apan wala mahibal-an kung kanus-a, wala ako makahulat sa higayon nga ang daan nga dagkong mga piraso deign nga magsugod sa paghiusa. uban sa bag-ong mga gagmay. Nahimong klaro nga kinahanglan namon nga mangita usa ka paagi aron ma-automate ang pinugos nga pag-optimize.

Impormasyon sa ClickHouse system tables
Atong tan-awon ang istruktura sa lamesa . Kini usa ka komprehensibo nga kasayuran bahin sa matag piraso sa tanan nga mga lamesa sa ClickHouse server. Naglangkob, taliwala sa ubang mga butang, ang mosunod nga mga kolum:
- ngalan sa database (
database); - ngalan sa lamesa (
table); - ngalan sa partisyon ug ID (
partition&partition_id); - sa dihang gihimo ang piraso (
modification_time); - minimum ug maximum nga petsa sa tipak (pagbahin sa adlaw) (
min_date&max_date);
Adunay usab usa ka lamesa , uban sa mosunod nga makapaikag nga mga natad:
- ngalan sa database (
Tables.database); - ngalan sa lamesa (
Tables.table); - ang edad sa metric kung kanus-a kinahanglan i-apply ang sunod nga aggregation (
age);
Busa:
- Kami adunay usa ka lamesa sa mga tipak ug usa ka lamesa sa mga lagda sa panagsama.
- Among gihiusa ang ilang intersection ug among nadawat ang tanang *GraphiteMergeTree nga mga lamesa.
- Gipangita namon ang tanan nga mga partisyon diin:
- labaw pa sa usa ka piraso
- o niabot na ang panahon nga ipadapat ang sunod nga lagda sa aggregation, ug
modification_timemas tigulang kay niining higayona.
Pagpatuman
Kini nga hangyo
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 ASCibalik ang matag usa sa *GraphiteMergeTree nga mga partisyon sa lamesa nga kinahanglan i-merge aron mapahigawas ang espasyo sa disk. Nagpabilin lamang kini nga kaso alang sa gagmay nga mga butang: susiha ang tanan nga adunay usa ka hangyo OPTIMIZE ... FINAL. Giisip usab sa katapusan nga pagpatuman ang kamatuoran nga dili kinahanglan nga hikapon ang mga partisyon nga adunay aktibo nga rekord.
Mao kini ang gibuhat sa proyekto. . Ang kanhi mga kauban gikan sa Yandex.Market nagsulay niini sa produksyon, ang resulta sa trabaho makita sa ubos.

Kung gipadagan nimo ang programa sa usa ka server nga adunay ClickHouse, magsugod ra kini sa pagtrabaho sa daemon mode. Kausa sa usa ka oras, usa ka pangutana ang ipatuman, pagsusi kung adunay bag-ong mga partisyon nga mas tigulang sa tulo ka adlaw nga mahimong ma-optimize.
Sa duol nga umaabot - sa paghatag sa labing menos deb packages, ug kon mahimo - usab rpm.
Kay sa usa ka konklusyon
For the past 9+ months, naa ko sa sulod sa akong company migahin og daghang panahon sa pagluto sa junction sa ClickHouse ug graphite-web. Kini usa ka maayo nga kasinatian, nga miresulta sa usa ka dali nga pagbalhin gikan sa hunghong ngadto sa ClickHouse isip usa ka tipiganan sa mga sukatan. Nanghinaut ko nga kini nga artikulo usa ka matang sa pagsugod sa usa ka siklo bahin sa kung unsang mga pag-uswag ang among nahimo sa lainlaing mga bahin sa kini nga stack, ug kung unsa ang buhaton sa umaabot.
Pipila ka litro sa beer ug admin nga mga adlaw ang gigugol sa pagpalambo sa hangyo, uban sa nga gusto nakong ipahayag ang akong pagpasalamat kaniya. Ug alang usab sa pagrepaso niini nga artikulo.
Source: www.habr.com




