ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል

ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል

ሰላም ሀብር።

አንድ ሰው ስርዓቱን እየሰራ ከሆነ ግራፋይት ድር እና የማከማቻ አፈጻጸም ችግር ውስጥ ገብቷል። ሹክሹክታ (አይኦ፣ የዲስክ ቦታ ተበላ)፣ ከዚያ ClickHouse እንደ ምትክ የመታየት እድሉ ወደ አንድ ቅርብ መሆን አለበት። ይህ መግለጫ የሶስተኛ ወገን አተገባበር እንደ ተቀባይ ዴሞን ለምሳሌ ጥቅም ላይ እንደዋለ ያመለክታል የካርቦን ጸሐፊ ወይም ካርቦን ሂድ.

ClickHouse በደንብ የተገለጹትን ችግሮች ይፈታል. ለምሳሌ፣ 2TiB ውሂብ ከሹክሹክታ ካፈሰሱ በኋላ፣ ወደ 300ጊቢ ይስማማሉ። በንጽጽር ላይ በዝርዝር አልቆይም, በዚህ ርዕስ ላይ በቂ ጽሑፎች አሉ. በተጨማሪም፣ እስከ ቅርብ ጊዜ ድረስ፣ በእኛ ClickHouse ማከማቻ ሁሉም ነገር ፍጹም አልነበረም።

የተበላሹ የጠፈር ጉዳዮች

በቅድመ-እይታ, ሁሉም ነገር በደንብ መስራት አለበት. በመከተል ላይ ሰነድ, ለሜትሪክስ ማከማቻ እቅድ ውቅር ይፍጠሩ (ከዚህ በኋላ retention), ከዚያም በተመረጠው የግራፍ-ድር ጀርባ አስተያየት መሰረት ሠንጠረዥ ይፍጠሩ: ካርቦን-ክሊክ ሃውስ+ግራፋይት-ክሊክ ቤት ወይም ግራፕሃውስ, በየትኛው ቁልል ጥቅም ላይ እንደሚውል ይወሰናል. እና…የጊዜ ቦምብ ነቅቷል።

የትኛው እንደሆነ ለመረዳት ፣ ማስገቢያዎች እንዴት እንደሚሠሩ እና በቤተሰብ ሞተሮች ሰንጠረዦች ውስጥ ያለው ተጨማሪ የሕይወት ጎዳና ማወቅ ያስፈልግዎታል *የመዋሃድ ዛፍ ClickHouse (ሥዕላዊ መግለጫዎች ከ презентации አሌክሲ ዛቴሌፒን፦

  • ገብቷል блок ውሂብ. በእኛ ሁኔታ, እነዚህ መለኪያዎች ናቸው.
    ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል
  • እያንዳንዱ እንደዚህ ያለ እገዳ ወደ ዲስክ ከመጻፉ በፊት እንደ ቁልፉ ይደረደራል. ORDER BYሠንጠረዡ ሲፈጠር የተገለጸው.
  • ከተደረደሩ በኋላ፣ кусок (part) ውሂብ ወደ ዲስክ ተጽፏል.
    ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል
  • አገልጋዩ እንደዚህ አይነት ቁርጥራጮች እንዳይበዙ ከበስተጀርባ ይከታተላል እና ዳራውን ይጀምራል слияния (merge, ከዚያም ይዋሃዱ).
    ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል
    ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል
  • ውሂቡ በንቃት ወደ ውስጥ መግባቱን እንዳቆመ አገልጋዩ ውህደቶችን በራሱ ማስጀመር ያቆማል партицию (partition), ግን ሂደቱን በትእዛዙ እራስዎ መጀመር ይችላሉ OPTIMIZE.
  • በክፋዩ ውስጥ አንድ ቁራጭ ብቻ ከቀረ ፣ ከዚያ በተለመደው ትዕዛዝ ውህደቱን መጀመር አይችሉም ፣ መጠቀም አለብዎት። OPTIMIZE ... FINAL

ስለዚህ, የመጀመሪያዎቹ መለኪያዎች ይደርሳሉ. እና የተወሰነ ቦታ ይይዛሉ. ተከታይ ክስተቶች በብዙ ሁኔታዎች ላይ ተመስርተው በመጠኑ ሊለያዩ ይችላሉ፡-

  • የክፋይ ቁልፉ በጣም ትንሽ (አንድ ቀን) ወይም በጣም ትልቅ (በርካታ ወራት) ሊሆን ይችላል.
  • የማቆያ ውቅሩ በንቁ ክፍልፍል ውስጥ (መለኪያዎቹ የተፃፉበት) ወይም ላይሆን ይችላል በርካታ ጉልህ የውሂብ ማጠቃለያ ገደቦችን ሊያሟላ ይችላል።
  • ብዙ ውሂብ ካለ ፣ ከበስተጀርባ ውህደት የተነሳ (ጥሩ ያልሆነ የመከፋፈያ ቁልፍ ሲመርጡ) በጣም ትልቅ ሊሆኑ የሚችሉ የመጀመሪያዎቹ ቁርጥራጮች እራሳቸውን ከትኩስ ትናንሽ ቁርጥራጮች ጋር አይዋሃዱም።

እና ሁልጊዜም እንዲሁ ያበቃል. በ ClickHouse ውስጥ በሜትሪክስ የተያዘው ቦታ የሚያድገው፡-

  • አትመልከቱ OPTIMIZE ... FINAL በእጅ ወይም
  • ፈጥኖም ሆነ ዘግይቶ የጀርባ ውህደት ለመጀመር ቀጣይነት ባለው መልኩ በሁሉም ክፍሎች ውስጥ ውሂብን አታስገባ

ሁለተኛው ዘዴ ለመተግበር በጣም ቀላሉ ይመስላል, ስለዚህም, የተሳሳተ እና በመጀመሪያ ደረጃ የተሞከረ ነው.
ላለፉት 4 ዓመታት ለእያንዳንዱ ቀን ዱሚ መለኪያዎችን የሚልክ እና በየሰዓቱ በክሮን የሚሰራ ትክክለኛ ቀላል የፓይቶን ስክሪፕት ጻፍኩ።
ሁሉም የ ClickHouse DBMS ሥራ ይህ ሥርዓት ይዋል ይደር እንጂ ሁሉ የጀርባ ሥራ ያደርጋል እውነታ ላይ የተመሠረተ ነው, ነገር ግን መቼ አይታወቅም, እኔ አሮጌ ግዙፍ ቁርጥራጮች deign ውህደት ለመጀመር ቅጽበት መጠበቅ አልቻልኩም ነበር. ከአዳዲስ ትናንሽ ጋር. የግዳጅ ማመቻቸትን በራስ ሰር የምንሰራበት መንገድ መፈለግ እንዳለብን ግልጽ ሆነ።

ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል

በ ClickHouse ስርዓት ሰንጠረዦች ውስጥ ያለ መረጃ

የሠንጠረዡን መዋቅር እንመልከት ስርዓት.ክፍሎች. ይህ በ 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. የመጨረሻው አተገባበርም ከንቁ መዝገብ ጋር ክፍልፋዮችን መንካት አያስፈልግም የሚለውን እውነታ ግምት ውስጥ ያስገባ ነበር.

ፕሮጀክቱ የሚያደርገው ይህ ነው። ግራፋይት-ቸ-አመቻች. ከ Yandex.Market የቀድሞ ባልደረቦች በምርት ውስጥ ሞክረው, የሥራው ውጤት ከዚህ በታች ይታያል.

ClickHouse + ግራፋይት፡ የሚበላውን የዲስክ ቦታ እንዴት በከፍተኛ ሁኔታ መቀነስ እንደሚቻል

ፕሮግራሙን በ ClickHouse በአገልጋዩ ላይ ካስኬዱት፣ በቀላሉ በዴሞን ሁነታ መስራት ይጀምራል። ከሶስት ቀናት በላይ የቆዩ አዲስ ክፍልፋዮች መኖራቸውን በማጣራት በሰዓት አንድ ጊዜ መጠይቅ ይፈጸማል።

በቅርብ ጊዜ ውስጥ - ቢያንስ የዴብ ፓኬጆችን ለማቅረብ, እና ከተቻለ - እንዲሁም ራፒኤም.

ከዚህ ይልቅ አንድ መደምደሚያ

ላለፉት 9+ ወራት፣ በኩባንያዬ ውስጥ ነበርኩ። innogames በ ClickHouse እና graphite-web መጋጠሚያ ላይ ምግብ ለማብሰል ብዙ ጊዜ አሳልፏል። ጥሩ ተሞክሮ ነበር፣ ይህም ከሹክሹክታ ወደ ClickHouse እንደ የመለኪያዎች ማከማቻ ፈጣን ሽግግር አስገኝቷል። ይህ ጽሑፍ በተለያዩ የዚህ ቁልል ክፍሎች ላይ ምን ማሻሻያ እንዳደረግን እና ወደፊት ምን እንደሚደረግ እንደ ዑደት መጀመሪያ ያለ ነገር እንደሆነ ተስፋ አደርጋለሁ።

በጥያቄው ልማት ላይ በርካታ ሊትር የቢራ እና የአስተዳዳሪ ቀናት አሳልፈዋል v0ዲያብሎስለዚህም ምስጋናዬን መግለጽ እፈልጋለሁ. እንዲሁም ይህን ጽሑፍ ለመገምገም.

የፕሮጀክት ገጽ በ github ላይ

ምንጭ: hab.com

አስተያየት ያክሉ