ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках

ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ, habr.

Если ΠΊΡ‚ΠΎ-Ρ‚ΠΎ эксплуатируСт систСму graphite-web ΠΈ столкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° whisper (IO, потрСбляСмоС дисковоС пространство), Ρ‚ΠΎ шанс Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» Π±Ρ€ΠΎΡˆΠ΅Π½ взгляд Π½Π° ClickHouse Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅. Π”Π°Π½Π½ΠΎΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² качСствС ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π΄Π΅ΠΌΠΎΠ½Π° ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сторонняя рСализация, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ carbonwriter ΠΈΠ»ΠΈ go-carbon.

ClickHouse Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ описанныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, послС ΠΏΠ΅Ρ€Π΅Π»ΠΈΠ²ΠΊΠΈ 2TiB Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· whisper, ΠΎΠ½ΠΈ ΡƒΠΌΠ΅ΡΡ‚ΠΈΠ»ΠΈΡΡŒ Π² 300GiB. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° сравнСнии я ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Ρƒ, статСй Π½Π° эту Ρ‚Π΅ΠΌΡƒ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, Π΄ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с нашим ClickHouse Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ Π±Ρ‹Π»ΠΎ Π½Π΅ всё идСально.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с потрСбляСмым мСстом

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, всё Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. БлСдуя Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, создаём ΠΊΠΎΠ½Ρ„ΠΈΠ³ для схСмы хранСния ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ (Π΄Π°Π»Π΅Π΅ retention), Π·Π°Ρ‚Π΅ΠΌ создаём Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ согласно Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π±Π΅ΠΊΠ΅Π½Π΄Π° для graphite-web: carbon-clickhouse+graphite-clickhouse ΠΈΠ»ΠΈ graphouse, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ стСк ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. Π˜β€¦ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π±ΠΎΠΌΠ±Π° Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ дСйствия.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, какая, Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ вставки ΠΈ дальнСйший ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² сСмСйства *MergeTree ClickHouse (Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ взяты ΠΈΠ· ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ АлСксСя Π—Π°Ρ‚Π΅Π»Π΅ΠΏΠΈΠ½Π°):

  • ВставляСтся Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ нашСм случаС это ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ.
    ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Π΄ записью Π½Π° диск сортируСтся согласно ΠΊΠ»ΡŽΡ‡Ρƒ ORDER BY, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈ создании Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.
  • ПослС сортировки, кусок (part) Π΄Π°Π½Π½Ρ‹Ρ… записываСтся Π½Π° диск.
    ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках
  • Π‘Π΅Ρ€Π²Π΅Ρ€ слСдит Π² Ρ„ΠΎΠ½Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΈΡ… кусков Π±Ρ‹Π»ΠΎ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ запускаСт Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ слияния (merge, Π΄Π°Π»Π΅Π΅ ΠΌΠ΅Ρ€ΠΆΠΈ).
    ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках
    ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках
  • Π‘Π΅Ρ€Π²Π΅Ρ€ пСрСстаёт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ€ΠΆΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡŽ (partition), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ процСсс Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ OPTIMIZE.
  • Если Π² ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ остался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ кусок, Ρ‚ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ€ΠΆ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π½Π΅ получится, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ OPTIMIZE ... FINAL

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ. И ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π΅ΠΊΠΎΠ΅ пространство. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ события ΠΌΠΎΠ³ΡƒΡ‚ нСсколько Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

  • ΠšΠ»ΡŽΡ‡ партиционирования ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‡Π΅Π½ΡŒ малСньким (дСнь), Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ большим (нСсколько мСсяцСв).
  • ΠšΠΎΠ½Ρ„ΠΈΠ³ retention ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ нСсколько Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ² Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ (ΠΊΡƒΠ΄Π° ΠΈΠ΄Ρ‘Ρ‚ запись ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ), Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅Ρ‚.
  • Если Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‚ΠΎ самыС Ρ€Π°Π½Π½ΠΈΠ΅ куски, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·-Π·Π° Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ€ΠΆΠ΅ΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ (ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° партиционирования), Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒΡΡ сами со свСТими малСнькими кусками.

И заканчиваСтся всСгда всё ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. ΠœΠ΅ΡΡ‚ΠΎ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ Π² ClickHouse Ρ‚ΠΎΠ»ΡŒΠΊΠΎ растёт, Ссли:

  • Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ OPTIMIZE ... FINAL Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ
  • Π½Π΅ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²ΠΎ всС ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ Π½Π° постоянной основС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ€ΠΆ

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ каТСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π±Ρ‹Π» ΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π½ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.
Π― написал достаточно простой скрипт Π½Π° python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отправлял Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ дня Π·Π° ΠΏΡ€ΠΎΡˆΠ»Ρ‹Π΅ 4 Π³ΠΎΠ΄Π° ΠΈ запускался ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ час ΠΊΡ€ΠΎΠ½ΠΎΠΌ.
Π’Π°ΠΊ ΠΊΠ°ΠΊ вся Ρ€Π°Π±ΠΎΡ‚Π° ClickHouse DBMS построСна Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта систСма Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ сдСлаСт всю Ρ„ΠΎΠ½ΠΎΠ²ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½ΠΎ нСизвСстно ΠΊΠΎΠ³Π΄Π°, Ρ‚ΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° старыС ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Π΅ куски соизволят Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΌΠ΅Ρ€ΠΆ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ малСнькими, ΠΌΠ½Π΅ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ. Π‘Ρ‚Π°Π»ΠΎ ясно, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ способ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

ClickHouse + Graphite: ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ потрСбляСмоС мСсто Π½Π° дисках

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π² систСмных Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… ClickHouse

ВзглянСм Π½Π° структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ system.parts. Π­Ρ‚ΠΎ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π°Ρ информация ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ кускС всСх Ρ‚Π°Π±Π»ΠΈΡ† Π½Π° сСрвСрС ClickHouse. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚, Π² Ρ‚ΠΎΠΌ числС, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ столбцы:

  • имя Π‘Π” (database);
  • имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (table);
  • имя ΠΈ Π˜Π” ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ (partition & partition_id);
  • ΠΊΠΎΠ³Π΄Π° кусок Π±Ρ‹Π» создан (modification_time);
  • минимальная ΠΈ максимальная Π΄Π°Ρ‚Π° Π² кускС (ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄Ρ‘Ρ‚ ΠΏΠΎ дням) (min_date & max_date);

Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° system.graphite_retentions, со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ интСрСсными полями:

  • имя Π‘Π” (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 с лишним мСсяцСв я Π²Π½ΡƒΡ‚Ρ€ΠΈ своСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ InnoGames ΠΏΡ€ΠΎΠ²Ρ‘Π» ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π²Π°Ρ€ΡΡΡŒ Π½Π° стыкС ClickHouse ΠΈ graphite-web. Π­Ρ‚ΠΎ Π±Ρ‹Π» Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΎΠΏΡ‹Ρ‚, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ стал Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ скорый ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ с whisper Π½Π° ClickHouse Π² качСствС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ. НадСюсь, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ β€” Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π½Π°Ρ‡Π°Π»Π° Ρ†ΠΈΠΊΠ»Π° ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π±Ρ‹Π»ΠΈ внСсСны Π½Π°ΠΌΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ части этого стСка, ΠΈ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ сдСлано Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

На Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ запроса Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ нСсколько Π»ΠΈΡ‚Ρ€ΠΎΠ² ΠΏΠΈΠ²Π° ΠΈ Π°Π΄ΠΌΠΈΠ½ΠΎ-Π΄Π½Π΅ΠΉ совмСстно с v0devil, Π·Π° Ρ‡Ρ‚ΠΎ я Ρ…ΠΎΡ‡Ρƒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ свою Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΎΡΡ‚ΡŒ. А Ρ‚Π°ΠΊΠΆΠ΅ Π·Π° Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ‡ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° github

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ