Cyfarchion habr.
Os oes rhywun yn gweithredu'r system
Mae ClickHouse yn datrys y problemau a ddisgrifir yn dda. Er enghraifft, ar Γ΄l arllwys 2TiB o ddata o sibrwd, maent yn ffitio i mewn i 300GiB. Ni fyddaf yn aros ar y gymhariaeth yn fanwl, mae digon o erthyglau ar y pwnc hwn. Yn ogystal, tan yn ddiweddar, nid oedd popeth yn berffaith gyda'n storfa ClickHouse.
Materion Gofod Defnydd
Ar yr olwg gyntaf, dylai popeth weithio'n dda. Yn dilyn retention
), yna creu tabl yn unol ag argymhelliad yr Γ΄l-wyneb gwe graffit a ddewiswyd:
Er mwyn deall pa un, mae angen i chi wybod sut mae mewnosodiadau'n gweithio a llwybr bywyd pellach data mewn tablau o beiriannau teulu *MergeTree ClickHouse (diagramau wedi'u cymryd o
- Mewnosodwyd
Π±Π»ΠΎΠΊ
data. Yn ein hachos ni, metrigau yw'r rhain.
- Mae pob bloc o'r fath yn cael ei ddidoli yn Γ΄l yr allwedd cyn ei ysgrifennu i ddisg.
ORDER BY
Y pennwyd pryd y crΓ«wyd y tabl. - Ar Γ΄l didoli,
ΠΊΡΡΠΎΠΊ
(part
) bod data wedi'i ysgrifennu ar ddisg.
- Mae'r gweinydd yn monitro yn y cefndir fel nad oes llawer o ddarnau o'r fath, ac yn lansio cefndir
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, yna uno).
- Mae'r gweinydd yn rhoi'r gorau i lansio uno ar ei ben ei hun cyn gynted ag y bydd y data'n stopio llifo i mewn
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), ond gallwch chi gychwyn y broses Γ’ llaw gyda'r gorchymynOPTIMIZE
. - Os mai dim ond un darn sydd ar Γ΄l yn y rhaniad, yna ni fyddwch yn gallu cychwyn yr uno gyda'r gorchymyn arferol, rhaid i chi ddefnyddio
OPTIMIZE ... FINAL
Felly, mae'r metrigau cyntaf yn cyrraedd. Ac maen nhw'n cymryd rhywfaint o le. Gall digwyddiadau dilynol amrywio rhywfaint yn dibynnu ar lawer o ffactorau:
- Gall allwedd y rhaniad fod naill ai'n fach iawn (diwrnod) neu'n fawr iawn (sawl mis).
- Gall y cyfluniad cadw ffitio sawl trothwy agregu data sylweddol y tu mewn i'r rhaniad gweithredol (lle mae'r metrigau wedi'u hysgrifennu), neu efallai ddim.
- Os oes llawer o ddata, yna ni fydd y talpiau cynharaf, a all fod yn enfawr eisoes oherwydd uno cefndirol (wrth ddewis allwedd rhannu nad yw'n optimaidd), yn uno eu hunain Γ’ thapiau bach ffres.
Ac mae bob amser yn dod i ben yr un peth. Dim ond os:
- peidiwch Γ’ gwneud cais
OPTIMIZE ... FINAL
Γ’ llaw neu - peidiwch Γ’ mewnosod data ym mhob rhaniad yn barhaus er mwyn dechrau uno cefndirol yn hwyr neu'n hwyrach
Ymddengys mai'r ail ddull yw'r hawsaf i'w weithredu ac, felly, mae'n anghywir ac fe'i profwyd yn y lle cyntaf.
Ysgrifennais sgript python eithaf syml sy'n anfon metrigau ffug am bob dydd am y 4 blynedd diwethaf ac yn rhedeg bob awr gyda cron.
Gan fod holl waith ClickHouse DBMS yn seiliedig ar y ffaith y bydd y system hon yn gwneud yr holl waith cefndir yn hwyr neu'n hwyrach, ond nid yw'n hysbys pryd, ni lwyddais i aros am y foment pan fydd yr hen ddarnau enfawr yn dylunio i ddechrau uno. gyda rhai bach newydd. Daeth yn amlwg bod angen i ni ddod o hyd i ffordd i awtomeiddio optimeiddiadau gorfodol.
Gwybodaeth yn nhablau system ClickHouse
Gadewch i ni edrych ar strwythur y bwrdd
- enw cronfa ddata (
database
); - enw tabl (
table
); - enw ac ID rhaniad (
partition
&partition_id
); - pan gafodd y darn ei greu (
modification_time
); - dyddiad lleiaf ac uchafswm yn y darn (mae rhaniad fesul dydd) (
min_date
&max_date
);
Mae bwrdd hefyd
- enw cronfa ddata (
Tables.database
); - enw tabl (
Tables.table
); - oedran y metrig pryd y dylid defnyddio'r agregiad nesaf (
age
);
Felly:
- Mae gennym dabl o dalpiau a thabl o reolau cydgasglu.
- Rydym yn cyfuno eu croestoriad ac yn cael yr holl dablau *GraphiteMergeTree.
- Rydym yn chwilio am bob rhaniad lle mae:
- mwy nag un darn
- neu yr amser wedi dyfod i gymhwyso y rheol gydgasglu nesaf, a
modification_time
hΕ·n na'r foment hon.
Gweithredu
Y cais hwn
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
yn dychwelyd pob un o'r rhaniadau tabl *GraphiteMergeTree y dylid eu huno i ryddhau lle ar y ddisg. Nid yw yn aros ond am bethau bychain : ewch trwyddynt oll gyda chais OPTIMIZE ... FINAL
. Roedd y gweithrediad terfynol hefyd yn cymryd i ystyriaeth y ffaith nad oes angen cyffwrdd rhaniadau gyda chofnod gweithredol.
Dyma beth mae'r prosiect yn ei wneud.
Os ydych chi'n rhedeg y rhaglen ar weinydd gyda ClickHouse, bydd yn dechrau gweithio yn y modd daemon. Unwaith yr awr, bydd ymholiad yn cael ei weithredu, gan wirio a oes rhaniadau newydd yn hΕ·n na thri diwrnod y gellir eu hoptimeiddio.
Yn y dyfodol agos - i ddarparu o leiaf pecynnau deb, ac os yn bosibl - hefyd rpm.
Yn hytrach na i gasgliad
Am y 9+ mis diwethaf, rwyf wedi bod yn fy nghwmni
Treuliwyd sawl litr o gwrw a diwrnodau gweinyddol ar ddatblygu'r cais, ynghyd Γ’
Ffynhonnell: hab.com