ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š”, ํ•˜๋ธŒ๋ฅด.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹œ์Šคํ…œ์„ ์•…์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ‘์—ฐ ์›น ์Šคํ† ๋ฆฌ์ง€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์†์‚ญ์ž„ (IO, ์†Œ๋น„๋œ ๋””์Šคํฌ ๊ณต๊ฐ„) ๊ทธ๋ ‡๋‹ค๋ฉด ClickHouse๊ฐ€ ๋Œ€์ฒดํ’ˆ์œผ๋กœ ์บ์ŠคํŒ…๋  ํ™•๋ฅ ์€ XNUMX์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์„ค๋ช…์€ ์ œXNUMX์ž ๊ตฌํ˜„์ด ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐ๋ชฌ์œผ๋กœ ์ด๋ฏธ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์นด๋ณธ๋ผ์ดํ„ฐ ๋˜๋Š” ๊ณ ์นด๋ณธ.

ClickHouse๋Š” ์„ค๋ช…๋œ ๋ฌธ์ œ๋ฅผ ์ž˜ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์†์‚ญ์ž„์—์„œ 2TiB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด 300GiB์— ๋งž์Šต๋‹ˆ๋‹ค. ๋น„๊ต์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ๊ทผ๊นŒ์ง€ ClickHouse ์Šคํ† ๋ฆฌ์ง€์˜ ๋ชจ๋“  ๊ฒƒ์ด ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์†Œ๋น„๋˜๋Š” ๊ณต๊ฐ„์˜ ๋ฌธ์ œ

์–ธ๋œป ๋ณด๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜ํ–‰์› ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜, ๋ฉ”ํŠธ๋ฆญ ์ €์žฅ ์ฒด๊ณ„์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ถ”๊ฐ€ retention), ์„ ํƒํ•œ graphite-web ๋ฐฑ์—”๋“œ์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํƒ„์†Œํด๋ฆญํ•˜์šฐ์Šค+ํ‘์—ฐ ํด๋ฆญ ํ•˜์šฐ์Šค ๋˜๋Š” ๊ทธ๋ž˜ํ”„ํ•˜์šฐ์Šค, ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ... ์‹œํ•œํญํƒ„์ด ํ„ฐ์ง„๋‹ค.

์–ด๋Š ๊ฒƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์‚ฝ์ž…์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ * ์ œํ’ˆ๊ตฐ์˜ ์—”์ง„ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€ ์ˆ˜๋ช… ๊ฒฝ๋กœ๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.๋ณ‘ํ•ฉํŠธ๋ฆฌ ClickHouse(์ฐจํŠธ๋Š” ๋‹ค์Œ์—์„œ ๊ฐ€์ ธ์˜ด) ํ”„๋ฆฌ์   ํ…Œ์ด์…˜ ์•Œ๋ ‰์„ธ์ด ์žํ…”๋ ˆํ•€):

  • ์‚ฝ์ž…๋จ ะฑะปะพะบ ๋ฐ์ดํ„ฐ. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋„์ฐฉํ•œ ๊ฒƒ์€ ์ธก์ •ํ•ญ๋ชฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•
  • ์ด๋Ÿฌํ•œ ๊ฐ ๋ธ”๋ก์€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๊ธฐ ์ „์— ํ‚ค์— ๋”ฐ๋ผ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ORDER BYํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • ์ •๋ ฌํ•œ ํ›„, ะบัƒัะพะบ (part) ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
    ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•
  • ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์กฐ๊ฐ์ด ๋งŽ์ง€ ์•Š๋„๋ก ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ัะปะธัะฝะธั (merge, ์ดํ•˜ ๋ณ‘ํ•ฉ).
    ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•
    ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„๋กœ ํ™œ๋ฐœํ•˜๊ฒŒ ์œ ์ž…๋˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•˜์ž๋งˆ์ž ์„œ๋ฒ„๋Š” ์ž์ฒด์ ์œผ๋กœ ๋ณ‘ํ•ฉ ์‹คํ–‰์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ะฟะฐั€ั‚ะธั†ะธัŽ (partition), ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OPTIMIZE.
  • ํŒŒํ‹ฐ์…˜์— ์กฐ๊ฐ์ด ํ•˜๋‚˜๋งŒ ๋‚จ์•„ ์žˆ์œผ๋ฉด ์ผ๋ฐ˜์ ์ธ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘ํ•ฉ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. OPTIMIZE ... FINAL

๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ์ธก์ •ํ•ญ๋ชฉ์ด ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ์•ฝ๊ฐ„์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ์ด๋ฒคํŠธ๋Š” ์—ฌ๋Ÿฌ ์š”์ธ์— ๋”ฐ๋ผ ๋‹ค์†Œ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ถ„ํ•  ํ‚ค๋Š” ๋งค์šฐ ์ž‘์„ ์ˆ˜๋„ ์žˆ๊ณ (ํ•˜๋ฃจ), ๋งค์šฐ ํด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๋ช‡ ๋‹ฌ).
  • ๋ณด์กด ๊ตฌ์„ฑ์€ ํ™œ์„ฑ ํŒŒํ‹ฐ์…˜(๋ฉ”ํŠธ๋ฆญ์ด ๊ธฐ๋ก๋˜๋Š” ๊ณณ) ๋‚ด์˜ ์—ฌ๋Ÿฌ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ ์ž„๊ณ„๊ฐ’์— ๋งž์„ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ณ‘ํ•ฉ์œผ๋กœ ์ธํ•ด ์ด๋ฏธ ๊ฑฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ดˆ๊ธฐ ์ฒญํฌ(์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ํŒŒํ‹ฐ์…”๋‹ ํ‚ค๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ)๊ฐ€ ์ƒˆ๋กœ์šด ์ž‘์€ ์ฒญํฌ์™€ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ๋˜‘๊ฐ™์ด ๋๋‚˜์ฃ . ClickHouse์—์„œ ์ธก์ •ํ•ญ๋ชฉ์ด ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค OPTIMIZE ... FINAL ์ˆ˜๋™์œผ๋กœ ๋˜๋Š”
  • ์กฐ๋งŒ๊ฐ„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ณ‘ํ•ฉ์ด ์‹œ์ž‘๋˜๋„๋ก ์ง€์†์ ์œผ๋กœ ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์•„์„œ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์•„ ๋จผ์ € ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ง€๋‚œ 4๋…„ ๋™์•ˆ ๋งค์ผ ๋”๋ฏธ ์ง€ํ‘œ๋ฅผ ๋ณด๋‚ด๊ณ  ๋งค์‹œ๊ฐ„ cron์„ ์‹คํ–‰ํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
ClickHouse DBMS์˜ ์ „์ฒด ์ž‘์—…์€ ์ด ์‹œ์Šคํ…œ์ด ์กฐ๋งŒ๊ฐ„ ๋ชจ๋“  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์–ธ์ œ์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ž˜๋œ ๊ฑฐ๋Œ€ํ•œ ์กฐ๊ฐ๋“ค์ด ๋ณ‘ํ•ฉ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆœ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ž‘์€ ๊ฒƒ๋“ค. ๊ฐ•์ œ ์ตœ์ ํ™”๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

ClickHouse + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

ClickHouse ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์ž ์‹œ์Šคํ…œ.๋ถ€ํ’ˆ. ClickHouse ์„œ๋ฒ„์— ์žˆ๋Š” ๋ชจ๋“  ํ…Œ์ด๋ธ”์˜ ๊ฐ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ข…ํ•ฉ์ ์ธ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ ์—ด์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • DB ์ด๋ฆ„(database);
  • ํ…Œ์ด๋ธ” ์ด๋ฆ„(table);
  • ํŒŒํ‹ฐ์…˜ ์ด๋ฆ„ ๋ฐ ID(partition & partition_id);
  • ์ž‘ํ’ˆ์ด ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ(modification_time);
  • ์กฐ๊ฐ์˜ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๋‚ ์งœ(ํŒŒํ‹ฐ์…˜์€ ๋‚ ์งœ๋ณ„๋กœ ์ˆ˜ํ–‰๋จ) (min_date & max_date);

ํ…Œ์ด๋ธ”๋„ ์žˆ์–ด์š” system.graphite_retentions, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฅ๋ฏธ๋กœ์šด ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • DB ์ด๋ฆ„(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 + Graphite: ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

ClickHouse๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ๋ชฌ ๋ชจ๋“œ์—์„œ ์ž‘์—…์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ•œ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ์”ฉ ์š”์ฒญ์ด ์‹คํ–‰๋˜์–ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” XNUMX์ผ๋ณด๋‹ค ์˜ค๋ž˜๋œ ์ƒˆ ํŒŒํ‹ฐ์…˜์ด ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์ฆ‰๊ฐ์ ์ธ ๊ณ„ํš์€ ์ตœ์†Œํ•œ deb ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด rpm๋„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  ๊ฒฐ๋ก 

์ง€๋‚œ 9๊ฐœ์›” ์ด์ƒ ํšŒ์‚ฌ์— ๊ทผ๋ฌดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋…ธ ๊ฒŒ์ž„์ฆˆ ClickHouse์™€ graphite-web์˜ ๊ต์ฐจ์ ์„ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฌ๋ฉฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ์œผ๋ฉฐ ์†์‚ญ์ž„์—์„œ ๋ฉ”ํŠธ๋ฆญ ์ €์žฅ์†Œ์ธ ClickHouse๋กœ ๋น ๋ฅด๊ฒŒ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๊ฐ€ ์ด ์Šคํƒ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์— ์–ด๋–ค ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์— ๋Œ€ํ•œ ์‹œ๋ฆฌ์ฆˆ์˜ ์‹œ์ž‘์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์š”์ฒญ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋ช‡ ๋ฆฌํ„ฐ์˜ ๋งฅ์ฃผ์™€ ๊ด€๋ฆฌ์ผ์ด ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. v0devil, ๊ทธ์—๊ฒŒ ๊ฐ์‚ฌ์˜ ๋งˆ์Œ์„ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ธฐ์‚ฌ๋ฅผ ๊ฒ€ํ† ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Github์˜ ํ”„๋กœ์ ํŠธ ํŽ˜์ด์ง€

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€