ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio

ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio

Salve, habr.

Si aliquis utitur systema graphite-web et offendit repono perficientur exitus vix parvam stillam (IO, orbis tractus consumptus est), tunc forte strepita ut substitutio ad unum mitteretur. Haec propositio implicat tertiam partem exsecutionem iam adhibitam esse daemonis metri acceptionem, e.g carbonwriter aut go-carbon.

ClickHouse problemata descripta bene solvit. Exempli gratia, translatis 2TiB notitiarum susurri, aptant in 300GiB. De comparatione singillatim non moror, articulorum in hac re permulta sunt. Praeterea, usque ad recentem, non omnia perfecta sunt cum repositione ClickHouse nostra.

Problematum consumptis spatium

Primo aspectu omnia bene operantur. sequentia documentumFac aboutconfig ad rationem metrics repono (ulterius retention) , deinde mensam creare iuxta commendationem delectus backend pro graphite-textu: carbonis clickhouse+graphite-clickhouse aut graphousesecundum quod ACERVUS adhibetur. Tum bomb... tempus abit.

Ad quorum unum cognoscendum, debes scire quomodo opus inserendi et vitae ulterioris iter notitiarum in tabulis machinis familiae *.MergeTree ClickHouse (charts ex presentations Alexey Zatelepin):

  • insertum Π±Π»ΠΎΠΊ data. In nobis, metrice quod pervenerunt.
    ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio
  • Quisque talis clausus sortitur secundum clavem antequam scriberetur ad disci. ORDER BYcerta mensa creando.
  • Post sorting, кусок (part) data scribitur in disco.
    ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio
  • Ministri monitores in curriculo ita ut non multae partes exstent et in background mittat слияния (mergeinfra merge).
    ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio
    ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio
  • Servus currens cessat migrare in seipsa, quamprimum notitia sistit active influens ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡŽ (partition) , sed processus manually cum imperio potes incipere OPTIMIZE.
  • Si una tantum pars in partitione remanet, tunc merge uti consueto mandato currere non poteris, utendum est. OPTIMIZE ... FINAL

Primae itaque metri venerint. Aliquam et tempus ante. Eventus posteriores aliquantum variari possunt a pluribus causis pendentes;

  • Clavis partitio fieri potest vel perexiguus (dies) vel valde magnus (menses complures).
  • Retentione config aptare possunt ad limina aggregationis notabilium aliquot notabilium intra partitionem activam (ubi metrici notantur), vel fortasse non.
  • Si data est sors, tunc primores chunki, qui ob infuscationem mergi possunt, iam immanes (si clavem partitionem non-optimam eliges), non se cum novis parvis chunkis miscebunt.

Etiam semper finibus ipsum. Spatium metri in ClickHouse occupatum tantum crescit si:

  • non applicare OPTIMIZE ... FINAL manually or *
  • notitias in omnes partitiones in fundamento permanenti non inseres, ut citius aut serius in background merge incipiet

Secundus modus videtur esse facillimus ad efficiendum, et ideo est falsa et primo tentata.
Scripsi pythonem satis simplicem, qui metrice phantasma emisit singulis diebus per annos praeteriti 4 et singulis horis cron currebat.
Cum tota operatio de ClickHouse DBMS innitatur eo quod haec ratio citius aut serius omnia opera curriculi faciet, sed ignoratur quando, exspectare non potui tempus cum veteres ingentes partes mergere dignarentur. nova parva. Patuit nos necessitatem quaerere ad viam automatis optimizations coactam.

ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio

Informationes in tabulis ClickHouse ratio

Inspice in mensa compages system.parts. Haec notitia comprehensiva est de unaquaque parte omnium tabularum in servo strepitato. Continet inter alia sequentia columnae;

  • db nomine (database);
  • mensa nomen (table);
  • partitio nomen et ID (partition & partition_id);
  • quando pars creata est (modification_time);
  • minimum et maximum diem in fragmen (partitio fit per diem) (min_date & max_date);

Est etiam mensa system.graphite_retentionscum sequentibus iucunda agris;

  • db nomine (Tables.database);
  • mensa nomen (Tables.table);
  • aetas metrica cum proxime aggregatione applicandaage);

sic:

  1. Habemus mensam chunkarum et mensam aggregationis regulas.
  2. Intersectionem eorum coniungimus et tabulas omnes *GraphiteMergeTree possidemus.
  3. Quaerimus omnes partitiones in quibus:
    • plus quam una
    • vel tempus venerit ut applicatio regulae proximae aggregationis sit, et modification_time antiquiorem hoc momento.

РСализация

Haec petitio

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

refert singulas tabulas *GraphiteMergeTree partitiones quarum bus in orbis tractus liberare debet. Restat ut per omnia petatur OPTIMIZE ... FINAL. Postrema exsecutio etiam rationem habet quod saepta cum memoria activa attingere non oportet.

Hoc est quod prorsus project facit graphite-ch-optimizer. Collegae superiores Yandex.Market productionem probaverunt, effectus operis infra videri potest.

ClickHouse + Graphite: quam ad signanter reducere orbis tractus consummatio

Si progressio servo cum ClickHouse curris, opus in daemone modo incipiet simpliciter. Semel hora petitio exsecutioni mandabitur, num novae partitiones maiores tribus diebus apparuerint quae optimized possunt.

Consilia immediata nostra de fasciculis saltem debijs provideant, et, si fieri potest, etiam rpm.

Sed in finem

Ad preteritum 9+ mensibus fui intus in mea comitatu innogames multum temporis tinkering per intersectionem ClickHouse et graphite-textus consumpsit. Bona usus fuit, quae consecuta est in celeri transitu e susurro ad ClickHouse sicut in repositione metrica. Spero hunc articulum aliquid initium seriei de quibus emendationibus in variis huius acervi partibus fecimus, et quid in posterum fiet.

Aliquot liters cerevisiae et admin diebus in explicandis precibus absumpti sunt, una cum v0devilpro quo volo ei gratias agere. Et etiam ad hoc articulum recognoscendum.

Project pagina github

Source: www.habr.com