์˜คํ”ˆ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ๋ฅด๋Š” ์€ํ–‰ ๋ฐ์ดํ„ฐ์— ๋นจ๋Œ€๋ฅผ ๊ฝ‚์•„๋ณด๋‹ค.

์„ฑ๋™์ฐฌ๋‹˜ - ์นด์นด์˜ค ๋ฑ…ํฌ

  • ์นด์นด์˜ค๋ฑ…ํฌ๋Š”?
    • ๊ธˆ์œต ํƒˆ์„ ์“ด ์†Œ์…œ ์„œ๋น„์Šค
    • ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๋ฐ์ดํ„ฐ

๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ์žฌ๋ฐฐ์น˜๋ฅผ ํ•ด๋ณด์ž

  • SQL๋กœ ๋ฐ์ดํ„ฐ ํผ๊ฐ€๊ธฐ
  • CDC ๋ณ€๊ฒฝ๋ถ„ ํผ๊ฐ€๊ธฐ
  • ์† ํƒ€์ดํ•‘ ๋…ธ๊ฐ€๋‹คํ•ด์„œ ํผ๊ฐ€๊ธฐ

SQL๋กœ ๋ฐ์ดํ„ฐ ํผ๊ฐ€๊ธฐ

  • ์žฅ์ 
    • SQL๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ œ์–ด
    • ๋กœ์ง์— ํฌํ•จ๋˜๋ฉฐ, ์ƒ๋Œ€์ ์œผ๋กœ ๊ตฌ์กฐ๊ฐ€ ๊ฐ„๊ฒฐ
  • ๋‹จ์ 
    • ์†Œ์ŠคDB์— ๋ถ€ํ•˜(Select / Index)
    • ์ง€์—ฐ๋œ ์ปค๋ฐ‹์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๋ˆ„๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

What is Uldra?

  • Source DB โ†’ Target DB ์‚ฌ์ด์— ์กด์žฌํ•˜์—ฌ Sharding ์ง€์›๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด
  • Java๋กœ ์ž‘์„ฑ
  • Uldraman์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๊นŒ?
    • BinaryLog Parser๋กœ ๋ณ€๊ฒฝ๋ถ„์„ ํŒŒ์•…ํ•ด์„œ
    • Task Worker๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” DB์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹
  • Goals
    • ์‰ฝ๊ณ  ์ •ํ™•ํ•˜๊ณ  ๋นจ๋ผ์•ผ ํ•œ๋‹ค.

What is BinaryLog in MySQL?

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ - MySQL Korea

  • DB ์ƒ์—์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋กœ๊ทธ

  • Uldraman์€ Row Event ๋‹จ์œ„๋กœ ํŒŒ์‹ฑ

    • Query Event Start
      • Table Map Event
        • ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•œ ํ…Œ์ด๋ธ” ์ •๋ณด
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / ํ…Œ์ด๋ธ” / ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ํƒ€์ž…
      • Row Event (Write, Delete, Update)
        • Write - ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ
        • Update - ๋ณ€๊ฒฝ ์ด์ „ / ์ดํ›„ ๋ฐ์ดํ„ฐ
        • Delete - ์‚ญ์ œ ์ด์ „ ๋ฐ์ดํ„ฐ
    • Query Event End

Uldraman ์ด์ „ ๋ชจ์Šต์€?

  • Kakao ADT๋Š” ์ฃผ๋กœ ๋ฐฐ์น˜ ํ”„๋กœ์„ธ์Šค์— ์ดˆ์ 
    • ํƒ€๊ฒŸ์ชฝ์— ๊ตฌ์กฐ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„
    • ์‹ค์ œ๋กœ ์„œ๋น„์Šค์—๋Š” ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ Uldraman์€?

  • ์‹ค์ œ๋กœ ์„œ๋น„์Šคํ•˜๋Š” ์˜จ๋ผ์ธ ์„œ๋น„์Šค์— ํฌ์ปค์‹ฑ์„ ๋งž์ถ˜ ํ”„๋กœ์ ํŠธ
  • ํŠน๊ธ‰ ์„œ๋น„์Šค

Uldraman์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”?

  • Binary Log format์€?
    • Row Format์œผ๋กœ ๊ธฐ๋ก๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์—ฌ์•ผ๋งŒ ํ•œ๋‹ค.
  • Binary Log Full Image
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๋ณ€๊ฒฝ ์ „ / ํ›„ ์ด๋ฏธ์ง€๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.

Kakao ADT & Uldraman์˜ ๊ณตํ†ต ๋ชฉํ‘œ

  • ๋ณต์ œ๊ฐ€ ์‹œ์Šคํ…œ์ด ์ด์ƒ์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ?
    • ์‹คํŒจํ•œ ์ง€์ ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘์„ ํ•ด์•ผํ•˜๋Š”๋ฐ..
    • ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ?
    • Overwrite
      • ๋ฎ์–ด์“ฐ๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ„ ๋งž์ถฐ์ง„๋‹ค.
      • ๋ˆ„๋ฝ๋œ๊ฑด ์—†๋Š”์ง€..
      • ์„ฑ๊ณตํ–ˆ๋˜ ํฌ์ง€์…˜๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ณต์‚ฌํ•˜์ž!
      • Update Row Event์ธ ๊ฒฝ์šฐ ํ•ญ์ƒ Delete๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
        • ์ƒค๋“œํ‚ค ํ˜น์€ PK ๋ณ€๊ฒฝ (์ƒค๋“œํ‚ค๋Š” ๊ตญ์ , PK๋Š” ์ง‘์ฃผ์†Œ)
        • YES
          • Delete
        • No
          • Replace
    • Sequential
      • ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•˜๊ณ 
      • ๋™์ผํ•œ ๊ทธ๋ฃน์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ž.
    • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
      • ์—ฐ๊ด€์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋น ๋ฅด์ง€ ์•Š์„๊นŒ?
      • 1์ฐจ ์ƒค๋”ฉ ๋ฃฐ
      • 2์ฐจ ์ƒค๋”ฉ ๋ฃฐ
        • ๋ช‡๋ฒˆ์งธ Thread์—์„œ ์ง„ํ–‰ํ• ์ง€ ๊ฒฐ์ •

Uldraman์˜ ๊ฐ€์ง„ Feature

  • Recover Mode

    • ๋ฐ์ดํ„ฐ ๋ฒ„์ ผ ์ฒดํฌ๋ฅผ ํ•ด๋ณด์ž.
    • ์–ธ์  ๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์‹ ์€ ๋˜์ง€๋งŒ.. ์ •ํ•ฉ์„ฑ์„ ์š”๊ตฌํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด?
      • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋‚ด์šฉ์— ๋ฒ„์ ผ์„ ๋„ฃ๊ณ 
      • ๋ฐ์ดํ„ฐ ๋ฒ„์ ผ์ด ๋‚ฎ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด Overwriteํ•˜๋Š” ๋ชจ์Šต
      • ๋งค๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์€ ์•„๋‹˜
  • Generate Sharding Key

    • ์ƒค๋”ฉํ‚ค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ณ€ํ˜•ํ•ด์„œ, ๊ทธ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜์ž.
  • Performance๋Š”?

    • ์Šค์ผ€์ผ ์•„์›ƒ์ธ ๊ฒฝ์šฐ
      • 1 Node โ†’ Uldraman โ†’ 8 Shard
      • 30,000 rows/sec
    • ์Šค์ผ€์ผ์ธ์ธ ๊ฒฝ์šฐ
      • 4 Shard โ†’ Uldraman โ†’ 1 Node
      • 1 Node์˜ ๋‚ด์žฅ DB๋Š” tokudb ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ
        • ๋†’์€ ์••์ถ•์œจ โ†’ I/O ๋น„์šฉ ๊ฐ์†Œ
      • Shard DB : innodb โ†’ 1 Node : tokudb๋กœ ์ง„ํ–‰ํ•œ ๊ฒฝ์šฐ
        • ์†๋„๊ฐ€ ๋ฐ€๋ฆฌ์ง€ ์•Š์Œ
  • Alerting & Monitoring

๋‹ค์Œ ๋ชฉํ‘œ๋Š”?

  • ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” MySQL์— ์ €์žฅํ•˜์ง€๋งŒ?
    • Sharding์€ ๋‹ค์–‘ํ•œ Database์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ž
      • Redis
      • Oracle
      • MySQL
      • PostgreSQL

Reference

์ดˆ๋‹น์˜ฅ์ˆ˜์ˆ˜์˜ ์ทจ์†Œ๋ฅผ ๋ง‰์•„๋ผ! : ์ˆ˜๋งŒ ๊ฑด์˜ ์ฃผ๋ฌธ์„ 1์ดˆ๋‚ด์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ 

๊ณ ํฌ๊ฒฝ๋‹˜, ๋งˆํƒœ์ผ๋‹˜ - ์นด์นด์˜ค ์ปค๋จธ์Šค

์ดˆ๋‹น ์˜ฅ์ˆ˜์ˆ˜์˜ ๋น„๋ฐ€

  • ์ดˆ๋‹น ์˜ฅ์ˆ˜์ˆ˜๋Š” ์—„์ฒญ ๋‹ฌ๋‹ฌํ•œ ์˜ฅ์ˆ˜์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค :)
  • ํ”„๋กœ์„ธ์Šค๋Š”?
    • ๊ตฌ๋งค์ž โ†’ ์ฃผ๋ฌธ โ†’ ํŒ๋งค์ž ํ™•์ธ โ†’ ๋ฌผ๊ฑด ์ค€๋น„ โ†’ ๋ฐฐ์†ก
    • ์†Œ๋น„์ž๊ฐ€ ์„ ์ฃผ๋ฌธ โ†’ ์˜ฅ์ˆ˜์ˆ˜๋ฅผ ์žฌ๋ฐฐ ํ›„ ๋ฐœ์†ก
    • ๋ฐฐ์†ก์ง€์—ฐ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋Š”?
      • ํŒ๋งค์ž๊ฐ€ ๋ฐฐ์†ก ์ง€์—ฐ ๊ณต์ง€

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š”?

ํ•ด๋‹น ๊ณต์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ์†Œ๋น„์ž์—๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ.

Legacy ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ผ๊นŒ?

๋ฐฐ์†ก์ง€์—ฐ ์•ˆ๋‚ด๋Š” ์–ด๋–ป๊ฒŒ ์ „์†กํ• ๊นŒ?

  • TMS(์นด์นด์˜คํ†ก Message Service)ํ†ตํ•ด ๋ฐฐ์น˜ ์ˆ˜ํ–‰
  • ์‹ค์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
  • ๋ฐฐ์น˜ ์ฃผ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ?
    • ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐ

๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

  • ๋„ˆ๋ฌด ๋ณต์žกํ•ด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•˜๊ธฐ ์–ด๋ ค์›€
  • ์ฝ”๋“œ๊ฐ€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ตฌ์„ฑ

๋Š๋ฆฐ ์ฒ˜๋ฆฌ ์†๋„

  • ํ•˜๋‚˜์˜ ์š”์ฒญ์— - ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ
  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” Task ์ˆ˜ํ–‰ํ•˜๋Š” ์ .
  • ์š”์ฒญ ๋ฐ›์€ ๋Œ€๋Ÿ‰์˜ ์ฃผ๋ฌธ ๋ฆฌ์ŠคํŠธ ๋Œ€์ƒ

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ์„๊นŒ?

  • ์‹ค์‹œ๊ฐ„ TMS ๋ฐœ์†ก์„ ์œ„ํ•œ Worker ๊ตฌ์„ฑํ•˜์ž
    • ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ API
    • ๋น„๋™๊ธฐ ์›Œ์ปค๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด๋ณด์ž.
    • ๊ธฐ์กด์˜ ๋ฐฐ์น˜๋ฅผ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋‹ˆ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.
  • ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€?
    • ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ท„๋‹ค.
    • ๊ณตํ†ต์ ์ธ Validation ์ฒดํฌ๋Š” ValidatorUtil๋กœ ์ง„ํ–‰
  • ์ฒ˜๋ฆฌ์†๋„ ๊ฐœ์„ ์€?
    • ๋ถˆํ•„์š”ํ•œ / ์ค‘๋ณตํ•˜๋Š” ๋กœ์ง์„ ๋ชจ์œผ๊ณ 
    • Validation ๋‹จ์ผํ™”
    • ๋น„์ฆˆ๋‹ˆ์Šค ์ฒ˜๋ฆฌ - ๋น„๋™๊ธฐ ์›Œ์ปค๋ฅผ ํ†ตํ•ด
    • TMS ๋ฐœ์†ก - ๋น„๋™๊ธฐ ์›Œ์ปค๋ฅผ ํ†ตํ•ด

Actor๊ฐ€ ๋œ ๋น„๋™๊ธฐ ์›Œ์ปค

  • ๋ถ„์‚ฐ์ฒ˜๋ฆฌ
    • ๋‹จ ํ•˜๋‚˜์˜ Queue๋ฅผ ํ†ตํ•ด ์†Œ๋น„
    • Consumer๋งŒ ๋Š˜๋ฆฌ๋ฉด ์„ฑ๋Šฅ์ด ์˜ฌ๋ผ๊ฐˆ๊นŒ?
      • Atomicํ•œ ๋‹จ์œ„๋กœ Event๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์ž.
    • Spring SimpleRabbitListenerContainerFactory์„ ๊ฐ์‹ผ Custom ๋ฆฌ์Šค๋„ˆ ์ œ์ž‘
      • ์ตœ์†Œ Concurrent : 5
      • ์ตœ๋Œ€ ConCurrent : 20
      • ๊ฐ๊ฐ์˜ Consumer ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์„ค์ •
    • ์ž๋™ ์žฌ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ๊ฐ์ง€
      • Rabbit MQ์˜ Queue์™€ Message header๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ
      • Queue - Queue.retriable ๋กœ ๊ตฌ์„ฑ
        • ์†Œ๋น„์ž๊ฐ€ ์žฌ์ˆ˜ํ–‰ํ•˜์˜€์ง€๋งŒ ์‹คํŒจํ•ด์„œ nack๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด?
          • x-death.cnt++
          • x-dead-letter-*
          • x-message-ttl๋ฅผ ์„ค์ •ํ•˜๊ณ 
          • ๋‹ค์‹œ Queue์— ์žฌ์ง„์ž…ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค.
          • https://www.rabbitmq.com/dlx.html
      • ํ•˜์ง€๋งŒ ๊ฒŒ์†ํ•ด์„œ ์‹คํŒจํ•˜๋ฉด?
        • ์ตœ๋Œ€ Count๊ฐ€ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด?
        • DB์— ์ €์žฅํ•˜๊ณ  / Noti๋ฐ›๊ณ 
        • ์–ด๋“œ๋ฏผ์ด๋‚˜ ๋ฐฐ์น˜ ์‹คํ–‰ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
    • ๊ตฌํ˜„์€ ์–ด๋–ป๊ฒŒ ํ–ˆ์„๊นŒ?
      • Method Interceptor๋ฅผ ํ†ตํ•ด ๊ฐ์ง€ํ•˜๊ณ 
      • ์ƒํƒœ์— ๋”ฐ๋ผ ์„ฑ๊ณต / ์žฌ์ฒ˜๋ฆฌ / ์‹คํŒจ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‹ ๋ขฐ์„ฑ์„ ๋†’ํ˜”๋‹ค.

๋” ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ?

  • Actor Model
    • ์•กํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ Tracingํ•˜๊ณ  ์‹ถ๋‹ค.
      • tracing ID๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ง‘๊ณ„ํ•˜๊ณ  ์‹ถ๋‹ค.

๋ฐฐํฌ์—†์ด ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑํ•˜๋Š” ์ „๋žต

  • ๋ฐฐํฌ์—†์ด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?
    • SwitchManager๋ฅผ ํ†ตํ•ด on/off๋กœ ์กฐ์ ˆ๊ฐ€๋Šฅ
    • ํ•ด๋‹น ์„ค์ •์€ Zookeeper๋กœ ๊ด€๋ฆฌ
    • LocalCache๋กœ ์ €์žฅํ•˜๊ณ  Zookeeper Watcher๋ฅผ ํ†ตํ•ด ๊ฐฑ์‹ 

Practical Microservices in gRPC Go feat. GraphQL, Kafka(์„œํฌํ„ฐ์ฆˆ ๊ธฐ์‚ฌ ๊ฐœ๋ฐœ๊ธฐ)

๊ฐ•ํƒœํ›ˆ๋‹˜, ๊น€๋ฏผ์˜๋‹˜, ๋ฌธ์ฃผ์„ฑ๋‹˜, ์–‘์ง„์„ ๋‹˜, ์ดํ•˜๊ฑด๋‹˜ - ์นด์นด์˜ค ๋ชจ๋นŒ๋ฆฌํ‹ฐ

์„œํฌํ„ฐ์ฆˆ ๊ธฐ์‚ฌ ์„œ๋น„์Šค - ์š”๊ตฌ ์‚ฌํ•ญ

  • ๊ธฐ๊ณ„ํ•™์Šต์— ๊ธฐ๋ฐ˜ํ•œ ๋”์šฑ ์ง€๋Šฅ์ ์ธ ๋ฐฐ์ •์˜ ๋Œ€์ƒ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์ž๋™ ๋ฐฐ์ •๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฑด๋‹น ์ง€๊ธ‰์—์„œ - ์‹œ๊ฐ„์ œ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์กด์žฌ

๊ฐœ๋ฐœํŒŒํŠธ ์ƒํ™ฉ์€ ์–ด๋–ค์ƒํ™ฉ์ด์˜€์„๊นŒ?

  • ์™ธ๋ถ€ ์˜์ž…์œผ๋กœ ๋“ค์–ด์˜จ ์ƒˆ๋กœ์šด ์ธ์žฌ
  • ํŒŒํŠธ ์ฃผ์š” ๊ธฐ์ˆ  ์Šคํƒ์€?
    • Rails
    • Vert.x
    • Java
    • Groovy
    • JRuby
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์šด์˜ ๋Œ€์‘
  • ํ•™์Šต ๋น„์šฉ ์ฆ๊ฐ€
    • ๊ธ‰๊ฒฉํžˆ ๋ณต์žกํ•ด์ง€๋Š” ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ดํ•ด

๊ฐœ๋ฐœ ๋ณต์žก๋„์˜ ์ƒ๊ด€ ๊ด€๊ณ„

  • ์ œํ’ˆ ๊ฐœ๋ฐœ ๋ณต์žก๋„์˜ ์„ธ๊ฐ€์ง€ ์š”์†Œ
    • ์š”๊ตฌ์‚ฌํ•ญ
    • ์‚ฌ๋žŒ
    • ๊ธฐ์ˆ 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ƒ๊ฐ์˜ ์ •๋ฆฌ๋ถ€ํ„ฐ ํ•˜๊ธฐ๋กœ

  • ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์•ž์„œ ์ƒ๊ฐ์„ ์ •๋ฆฌํ•˜๊ณ 
  • ๋ฌธ์„œ์— ์ž‘์„ฑํ•˜๊ณ  ๊ณต์œ ํ•˜์ž.
  • RFC๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด๋ณด์ž.
    • ์ž‘์„ฑ์ž ๋ชฉ๋ก
    • ์Šน์ธ์ž ๋ชฉ๋ก
    • ์š”์•ฝ
    • ๋ฐฐ๊ฒฝ
    • ๊ตฌ์กฐ
    • ๊ณ ๋ คํ–ˆ๋˜ ๋Œ€์•ˆ
    • ๊ตฌํ˜„
    • ์„œ๋น„์Šค SLA
    • ์„œ๋น„์Šค ์˜์กด์„ฑ
    • ๋ถ€ํ•˜ ๋ฐ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
    • ๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ
    • ํ…Œ์ŠคํŠธ ๋ฐ ์ถœ์‹œ ๊ณ„ํš
    • ์ง€ํ‘œ ๊ด€๋ จ ๋‚ด์šฉ ๋“ฑ๋“ฑ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

Java์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ?

  • ์žฅ์ 
    • ์ต์ˆ™ํ•˜๋‹ค.
    • Spring Framework๊ฐ€ ์ž˜ ํ•ด์ค€๋‹ค.
    • ๊ฐœ๋ฐœ์ž ๊ตฌ์ธ์ด ์‰ฝ๋‹ค.
    • OS์— ๋…๋ฆฝ์ ์ธ ์–ธ์–ด์ด๋‹ค.
  • ๋‹จ์ 
    • Spring Framework ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ ์–ด๋ ต๋‹ค.
    • ๊ฐœ๋ฐœ์ž์˜ ํŽธ์ฐจ๊ฐ€ ํฌ๋‹ค.
    • JVM ํŠœ๋‹์„ ํ•ด์•ผํ•˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค.
    • OS ๋…๋ฆฝ์ ์ธ๊ฒŒ ๊ณผ์—ฐ ์ข‹์€๊ฒƒ์ธ๊ฐ€?

ํŒŒํŠธ์› ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์„ ํ˜ธ๋„

  • Java ๊ทนํ˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค / Java ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค
  • ์ค‘์žฌ์•ˆ์„ ์ฐพ๋‹ค๋ณด๋‹ˆ..
    • Go Lang์œผ๋กœ ๊ฒฐ์ •
  • ์–ธ์–ด๋ณ„ HTTP ์„œ๋ฒ„ ์„ฑ๋Šฅ
    • Go๊ฐ€ Java๋ณด๋‹ค 2๋ฐฐ์ •๋„ ๋น ๋ฅธ ๊ฒƒ์„ ํ™•์ธ
  • 25 / 56
    • go ์–ธ์–ด์˜ keyword ์ˆซ์ž / Java ์–ธ์–ด์˜ keyword ์ˆซ์ž
    • ๊ทธ๋งŒํผ go ์–ธ์–ด๋Š” ๋‹จ์ˆœํ•จ.

Go

  • ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค
  • ์ž์œ ๋„ ๋‚ฎ์€ Coding Style
  • ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
  • JVM๊ฐ™์€ ๋ฌด๊ฑฐ์šด VM์ด ์—†์Œ
  • Compile์–ธ์–ด ๊ฒฝ๋Ÿ‰์˜ ์ •์  Compile ๊ฒฐ๊ณผ๋ฌผ
  • No magic ๋ชจ๋‘ ๋“ค์—ฌ๋‹ค ๋ณผ ์ˆ˜ ์žˆ์Œ
  • 500๋ฐฐ ๊ฒฝ๋Ÿ‰์˜ Thread์™€ Queue = Gorutine๊ณผ Channel ์‹ค์ˆ˜์˜ ์—ฌ์ง€๊ฐ€ ์ ๊ณ  ๊ณ ์„ฑ๋Šฅ
  • ์ง๊ด€์ ์ธ ์˜ค๋ฅ˜ ์กฐ์ž‘. ์˜ˆ์™ธ ๋˜์ง€๊ธฐ ์—†์Œ

์˜์กด์„ฑ ์ฃผ์ž…์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ?

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ€์žฅ ํฐ ์žฅ์  ์˜์กด์„ฑ ์ฃผ์ž…
    • ์˜์กด ๊ด€๊ณ„ ์„ค์ •์ด ์‹คํ–‰์‹œ์— ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถค
  • Go - FX
    • ๋‹จ์ 
      • ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†๋‹ค.

์„œ๋น„์Šค ๊ตฌ์กฐ ์ƒํ™ฉ์€?

  • ์‚ฌ์šฉ์ž ๊ธฐ์‚ฌ, ์šด์˜ ๊ด€๋ จ๋“ฑ๋“ฑ ์—„์ฒญ ๋ณต์žก
  • Line์ˆ˜๋„ 269878
  • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋„ 35%์ •๋„..

์™œ MSA?

  • ๊ณ ๋ฆฝ๋œ ๊ธฐ๋Šฅ
  • ๊ณ ๋ฆฝ๋œ ๋ฐ์ดํ„ฐ / ์ƒํƒœ
  • ๋ณ‘๋ ฌ์ ์œผ๋กœ ๊ฐ„์„ญ์—†์ด ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์‹ถ๋‹ค.
  • ์„œ๋น„์Šค๋ณ„๋กœ ํ™•์žฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค.
  • ์ž์ฃผ ์ž‘์€ ๋ฐฐํฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค.
  • ์ „์‚ฌ ์ฐจ์›์˜ DKOS๋ผ๋Š” Cloud ์ง€์› ์ด๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ ค๋ฉด MSA๊ฐ€ ์ ์ ˆ
  • ์ œํ’ˆ์˜ ๊ฐ ๋ถ€๋ถ„์ด ๋‹จ์ˆœํ™” ๋˜์–ด ์˜์‚ฌ์†Œํ†ต์ด ์›ํ™œ
  • ๋„ทํ”Œ๋ฆญ์Šค, ํŠธ์œ„ํ„ฐ, ์šฐ๋ฒ„๊ฐ™์€ ํšŒ์‚ฌ์—์„œ ๋ฏธ๋ฆฌ ๊ฒ€์ฆ
  • ๋‹จ์ ์€ ์—†์„๊นŒ?
    • ๊ธฐ์กด ํ•˜๋‚˜์˜ APIํ˜ธ์ถœ์ด MicroService์—์„œ๋Š” ๋‹ค์ˆ˜๋กœ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Œ
      • API Gateway
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋น„์šฉ
      • DC๋‚ด๋ถ€ ๋น„์šฉ, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœ
    • ์„œ๋น„์Šค ๋ฐœ๊ฒฌ์ด ๋ณต์žกํ•จ
      • DNS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ etcd, consil๋“ฑ์œผ๋กœ ํšจ์œจ์  ๊ฐœ์„  ํ•„์š”
    • ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๋Œ€ํ•œ ์ค‘๋ณต ๋ฐœ์ƒ
      • ์ค‘๋ณต๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™”
    • ํ…Œ์ŠคํŒ… ๋ฐ ์šด์˜ ๋ณต์žก
      • Testing strategies in a Microservice

์„œํฌํ„ฐ์ฆˆ ์„œ๋น„์Šค ๊ตฌ์กฐ

  • graphql gateway
  • routing service gRPC go
  • ์„œ๋น„์Šค ๊ณ„์ธต
    • RESTful vs gRPC
      • gRPC๊ฐ€ ์›”๋“ฑํ•˜๊ฒŒ ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๋‹ค.
    • Stubby์˜ ์˜คํ”ˆ ์†Œ์Šค ๊ตฌํ˜„์ฒด - gRPC
      • ๊ตฌ๊ธ€์—์„œ 1์ฃผ์ผ์— 20์–ต๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰
      • 1์ดˆ์— 100์–ต๊ฑด์˜ RPC๋ฅผ ์ฒ˜๋ฆฌ
    • gRPC๋Š” ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ• ๊นŒ?
    • ํ•ญ์ƒ RPC๋งŒ ๋…ธ์ถœํ•ด์•ผํ• ๊นŒ?
    • IDL Registry
      • gRPC Proto ํŒŒ์ผ๋“ค์„ ์ค‘์•™ํ™”ํ•ด์„œ ๊ด€๋ฆฌ

ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ?

  • ghz - gRPC Load Test
  • nGrinder - HTTP Load Test
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
    • Docker Compose๋กœ ๋ฌถ์–ด์„œ ์ง„ํ–‰
    • Postman์„ ํ†ตํ•˜์—ฌ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํ–‰

๋‚จ์€ ๋„์ „๋“ค?

  • ํ˜‘์—…์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ
  • Api Gateway - ์ธ์ฆ, ๋กœ๊น…

kafka

  • kafka๊ฐ€ ์—†๋‹ค๋ฉด?
    • ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋„ ETL์„ ํ†ตํ•ด ๋™๊ธฐํ™”
  • kafka๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด?
    • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ์œผ๋กœ ์–ป์€ ์ด์ 
    • ์„œ๋น„์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€ ํ๋ฆ„ ๋‹จ์ˆœํ™”
    • ๋ฉ”์‹œ์ง€์˜ ์˜์†์„ฑ์„ ๋ณด์žฅ, ์œ ์‹ค ๋ฐฉ์ง€
    • ํŒจํ‚ท ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ
    • ์ž์œ ๋กœ์šด ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
    • ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์—์„œ ์†Œ๋น„
    • ๋ฉ”์‹œ์ง€ ๋ฒ„์ €๋‹

API Gateway

  • API ๋ฒ„์ ธ๋‹์€ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

    • GraphQL
      • No Versioning
  • GraphQL ๊ตฌํ˜„์ฒด

    • Node๊ฐ€ ์—„์ฒญ๋‚œ Library ์ง€์›
    • Go
    • Java
  • Middleware

    • ์›ํ•˜๋Š” ์ธ์ฆ ๊ด€๋ จ ๋‚ด์šฉ์€ Middleware์— ์ถ”๊ฐ€ํ•ด์„œ ์ง„ํ–‰
    • ์ธ์ฆ / ๊ฒ€์ฆ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • gRPC Interceptor๋กœ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

    • Zipkin Tracer
    • New Relic
  • Monitoring

    • ์ˆ˜์ • ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์„œ๋น„์Šค ์ „์ฒด์˜ ์ง€์—ฐ ๋ฐœ์ƒ
    • ์ถœ์‹œ์ผ์ด ๊ฐœ๋ฐœ ์™„๋ฃŒ ์ด์ „์— ํ™•์ •๋œ ์ƒํ™ฉ
      • ๋น ๋ฅธ ์ ์šฉ์ด ๊ด€๊ฑด์ธ ์ƒํ™ฉ
    • Prometheus
      • Pull ๋ฐฉ์‹์˜ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘
      • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ผ์ • ์ฃผ๊ธฐ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘
      • ๋„์ปค ๊ธฐ๋ฐ˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด๋Š”๋ฐ ์ข‹์Œ
    • Grafana
      • ๊ณ ์œ ์˜ Query Language๊ฐ€ ์กด์žฌ
    • ์žฅ์• ์˜ ์›์ธ
      • ์ž‘์€ ์„œ๋น„์Šค์˜ ์‚ฌ์†Œํ•œ ์‹ค์ˆ˜๊ฐ€ ์ „์ฒด ์ œํ’ˆ์— ์˜ํ–ฅ
      • ๋ถ„์‚ฐ ๋กœ๊ทธ ์ถ”์  ์‹œ์Šคํ…œ์ด ํ•„์š”
  • Legacies

    • ๋„ˆ๋ฌด๋‚˜ ์ž˜ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” ๋ ˆ๊ฑฐ์‹œ์˜ ๋ณ€ํ™”๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ถ๋‹ค.
    • feature flag
      • traffic throttling ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€
      • ์„ค์ • ์„œ๋ฒ„
    • nginx ์„ค์ •
    • kubernates

Airflow๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ฆ„๋‹ค์šด ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑํ•˜๊ธฐ - R2

์ตœ์ฃผ์›๋‹˜ - ์นด์นด์˜คํŽ˜์ด์ง€

์นด์นด์˜คํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฌธ์ œ

์นด์นด์˜ค ํŽ˜์ด์ง€์˜ ์„ฑ์žฅ

  • 2014๋…„๋ณด๋‹ค 100๋ฐฐ
  • 2015๋…„๋ณด๋‹ค 10๋ฐฐ
  • ์ง€์†์ ์ธ ์„ฑ์žฅ์„ ์œ„ํ•ด ๋…ธ๋ ฅ

์นด์นด์˜ค ํŽ˜์ด์ง€ & ๋‹ค์Œ ์›นํˆฐ๋Š” MSA๋กœ ๊ตฌ์„ฑ

  • MSA์œผ๋กœ ์ธํ•ด DB๋„ ๋ถ„ํ™”
    • ๊ทธ๋Ÿผ ๋ฐ์ดํ„ฐ ๋ถ„์„์€?
    • ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ์ž…์žฅ์—์„œ๋Š” DB๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์š” ใ… ใ… 
    • ์„œ๋กœ ๋‹ค๋ฅธ DB๊ฐ„์— JOIN์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š”?
  • Data Lake (Data warehouse)
    • ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์˜์กด
      • HDFS or S3
      • ์‹ธ๊ณ  ์•ˆ์ •์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค.
      • ๋ถ„์‚ฐํ˜• ์ฟผ๋ฆฌ / ๋ถ„์„ ์—”์ง„
        • Hive
        • Spark
        • Impala
        • Presto
    • ๋ชฝ๋•… ๋‹ค ๋ฐ€์–ด๋„ฃ์–ด ๋ณด์ž
      • MySQL DB๋กœ ๋ณต์ œ
      • ๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค / ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ์ž…์žฅ
        • ์›๋ณธ๋ฐ์ดํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ ์ž…์žฅ์œผ๋กœ ๋ณ€ํ™˜
          • ์—ด๋žŒ / ๊ตฌ๋งค
          • ๊ด‘๊ณ  / ์ด๋ฒคํŠธ
          • ํšŒ์› ๋“ฑ๊ธ‰
          • ์ž‘ํ’ˆ๋ณ„ ์ง€ํ‘œ
      • ๋ถ„์„๊ฐ€์ž…์žฅ์—์„œ๋Š” ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ”๋ผ๋ณด๋ฉด๋œ๋‹ค.
      • ์ด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” Airflow๋กœ ์ง„ํ–‰

Workflow management System

Workflow๋ž€?

  • ์ž‘์—…
    • ์ˆ˜์ง‘ ์ž‘์—…
    • ์ •์ œ ์ž‘์—…
    • ์ง€ํ‘œ ์ƒ์„ฑ ์ž‘์—…
    • ๋ฆฌํฌํŒ… ์ž‘์—…
  • ์ž‘์—… ๊ฐ„ ์˜์กด์„ฑ
  • ์ด ์ „์ฒด๋ฅผ์˜ ํ”Œ๋กœ์šฐ๋ฅผ ์›Œํฌํ”Œ๋กœ์šฐ
  • DAG(Directed Acycli Graph)

Workflow Platform์—์„œ๋Š”?

  • DAG ์ž‘์—… ์˜์กด ๊ด€๊ณ„์— ๋”ฐ๋ผ ์ˆœ์ฐจ ์‹คํ–‰
  • ๋ชจ๋“  ์ž‘์—…์€ ASAP์œผ๋กœ ์ข…๋ฃŒ
  • ์ค‘๊ฐ„์— ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด?
    • ์—ฐ๊ด€์„ฑ ์—†๋Š” ์ž‘์—…์€ ๊ณ„์† ์‹คํ–‰
    • ์‹คํŒจํ•œ ์ž‘์—…์„ ์žฌ์‹คํ–‰
    • ์„ฑ๊ณตํ•˜๋ฉด ํ›„์†์ž‘์—… ์ด์–ด์„œ ์‹คํ–‰

Oozie vs Airflow

  • First Commit
    • Oozie๊ฐ€ ๋” ๋น ๋ฆ„
  • Number of Commits
    • Airflow๊ฐ€ 3๋ฐฐ์ •๋„ ์ฐจ์ด
  • Contributors
    • Airflow๊ฐ€ ๋” ๋งŽ์€ ์ธ์›
  • Release ํšŸ์ˆ˜
    • Airflow๊ฐ€ ๋” ๋งŽ๋‹ค.
  • DAG ํ‘œํ˜„ ๋ฐฉ์‹
    • Oozie - XML
    • Airflow - Python
  • GUI
    • Airflow๊ฐ€ ๋” ๋งŽ์€ ์ง€์›
  • ๊ฐ€์šฉ์„ฑ
    • Oozie๊ฐ€ ๋” ์ข‹๋‹ค.
    • Airflow๋Š” SPOF ์กด์žฌ

Airflow Architecture

  • Scheduler
    • ์‹คํ–‰ ์ฃผ๊ธฐ๊ฐ€ ๋˜๋ฉด ์ž‘์—…์„ ์ƒ์„ฑ
    • ์˜์กดํ•˜๋Š” ์ž‘์—…์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๋ฉด Broker์— ๋„˜๊น€
  • Worker
    • ์‹ค์ œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์ฃผ์ฒด
  • Broker
    • ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์ž‘์—…๋“ค์ด ๋“ค์–ด๊ฐ€๋Š” ๊ณต๊ฐ„
  • Meta DB
    • DAG, Task๋“ฑ์ด ์ •์˜ ๋˜์–ด์žˆ์Œ
    • DAG RUN, Task RUN๋“ค์ด ์กด์žฌ

Airflow - SPOF

  • Scheduler
  • Broker
  • MetaDB

Airflow - HA

  • HA Broker
  • Master - Slave ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ
  • ์Šค์ผธ์ค„๋Ÿฌ๋ฅผ 2๊ฐœ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด?
    • ๋™์ผํ•œ DAG๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ด์Šˆ
    • FailOver - Controller
      • ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์นด์นด์˜ค ํŽ˜์ด์ง€์˜ Airflow ํ™œ์šฉ

  • DAG : 100์—ฌ๊ฐœ
  • Task : 5000์—ฌ๊ฐœ
  • ํ•˜๋ฃจ์— ๋Œ์•„๊ฐ€๋Š” Task ๊ฐœ์ˆ˜
    • 15000์—ฌ๊ฐœ
  • ์ƒ๋‹น ์ˆ˜๊ฐ€ Spark Application
    • Spark ๊ธฐ๋™์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฝค ํ•„์š”ํ•จ
    • ๋‹ค์ˆ˜์˜ Worker๋ฅผ ๋ฌผ๋ฆฌ ์žฅ๋น„ , VM ์žฅ๋น„๋„ ์‚ฌ์šฉ
  • ๋ฌธ์ œ๋Š” DB์•ˆ์— ํ…Œ์ด๋ธ” ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ๋‹ค.
    • DB์•ˆ์— ํ…Œ์ด๋ธ”์ด 350๊ฐœ, 160๊ฐœ
    • ๋ชจ๋“  ํ…Œ์ด๋ธ”์„ ์ˆœ์„œ๋Œ€๋กœ ๋‚ด๋ ค๋ฐ›์ž๋‹ˆ 350๊ฐœ ํ…Œ์ด๋ธ”์„ ๋ถ„๋‹น 1๊ฐœ์”ฉ ์ฒ˜๋ฆฌํ•ด๋„
    • ์•ฝ 6์‹œ๊ฐ„?
    • ๋™์‹œ์— ๋‚ด๋ ค๋ฐ›์ž๋‹ˆ ๋ถ€ํ•˜ ๊ฑฑ์ •

๊ทธ๋ž˜์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ โ†’ Pool and priority weight

Pool

  • ๋™์‹œ์„ฑ์˜ ํ•œ๊ณ„์น˜๋ฅผ ์ œ์–ด
  • ์ง€์ •๋œ Slot ๊ฐœ์ˆ˜ ๋งŒํผ ๋™์‹œ์— ์‹คํ–‰

Priority weight

  • Task ๋‹จ์œ„๋กœ Integer value๋กœ ์ง€์ •
  • ์˜์กดํ•˜๋Š” ํ…Œ์Šคํฌ๊ฐ€ ๋งŽ์œผ๋ฉด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€

Pool ๊ด€๋ฆฌ

  • ์ž‘์€ ํ…Œ์ด๋ธ”, ํฐ ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌ

๋งŽ์€ ํ…Œ์ด๋ธ”์„ ์ ์ ˆํ•œ ๋ถ€ํ•˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š”?

  • Pool, Priority weight๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์ž

Airflow Impala, Spark ํ˜ธ์ถœ

  • Worker๋Š” ํ˜ธ์ถœํ•˜๋Š” ๊ป๋ฐ๊ธฐ ์—ญํ• 

  • ์‹ค์ œ ๋ถ€ํ•˜๋Š” ํ•˜๋‘ก ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐœ์ƒ

  • Worker ์—ญํ•  ๋ถ„๋ฆฌ

    • Queue๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ง„ํ–‰
    • Spark์šฉ , R์šฉ
    • ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜์ง€?
      • Celery ํ™œ์šฉ์‹œ์—๋Š” airflow.cfg ์ˆ˜์ •
      • Worker ์‹คํ–‰์‹œ์— -q ์˜ต์…˜๊ณผ ๊ฐ™์ด ์‹คํ–‰
      • Task ์ƒ์„ฑ์‹œ Queue ํŒŒ๋ผ๋ฏธํ„ฐ ์ง€์ •
  • ๋ถ€ํ•˜ ๋•Œ๋ฌธ์— ๊ผญ ๋ถ„๋ฆฌํ•ด์•ผ๋ผ?

    • ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ
    • ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ฌ๋•Œ (s3์™€ ๊ฐ™์€ ๋ถ€๋ถ„)
    • ๊ณ„์ • ๋ถ„๋ฆฌ
  • ์ดํ† ๋ก ๊ฑฐ๋Œ€ํ•œ DAG ์˜์กด ๊ด€๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ?

    • External Task Sensor
    • ํŠน์ • ์กฐ๊ฑด์ด ์ฑ„์›Œ์ง€๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” Operator
      • Poke_interval : ์ฒดํฌ ์ฃผ๊ธฐ
      • Timeout
      • ์›ํ•˜๋Š” ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉด ์ข…๋ฃŒ
      • execution_delta
      • execution_fn
    • DAG๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ถ”๊ฐ€ Flow ์ง„ํ–‰
      • ๋†’์€ ๋ณต์žก๋„์˜ DAG๋ฅผ ์—†์• ๋Š” ์žฅ์ 

์นด์นด์˜ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง NEO - R5

๊น€์€์ˆ˜๋‹˜ - ์นด์นด์˜ค

Neo๋ž€?

  • Neo๋Š” ์นด์นด์˜ค์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค

์„œ๋น„์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

  • NEO์˜ ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ๊ด€์ ์œผ๋กœ ์„ฑ๋Šฅ์„ ๋ณผ ๊ฒƒ์ธ๊ฐ€?
    • ์„œ๋น„์Šค 1: N ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ 1 : N ์ธ์Šคํ„ด์Šค
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„ - ์„œ๋น„์Šค ์†๋„

Neo Usage

  • ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
  • ์ธ์Šคํ„ด์Šค ๋ณ„ ์›Œํ‚น ์“ฐ๋ ˆ๋“œ ์นด์šดํŠธ
  • ํŠธ๋žœ์žญ์…˜ ์œˆ๋„์šฐ
  • Method
  • Map. ComputeIfAbsent
    • Mutex ์‚ฌ์šฉ
    • ์งง๊ณ  ๊ฐ„๋‹จํ•œ ๋‚ด์šฉ

Neo๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ• ๊นŒ?

  • JMX๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘
  • NeoAgent๋ฅผ ์ถ”๊ฐ€
  • Default ํŠธ๋žœ์žญ์…˜
    • HttpServlet.service()
    • ์„œ๋ธ”๋ฆฟ ๊ธฐ๋ฐ˜์˜ ์š”์ฒญ์ด ์•„๋‹ˆ๋ฉด?
      • ์‚ฌ์šฉ์ž์—๊ฒŒ ํŠธ๋žœ์žญ์…˜ ์ •์˜๋ฅผ ๋งž๊ธฐ์ž.

APM ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•

  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค.
    • ๋ฐ์ดํ„ฐ ํ•˜๋‚˜์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ตœ์†Œํ™” ํ•˜์ž
  • ์ ๋‹นํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๋ฒ„๋ฆฌ์ž
    • Metrics ๋ฐ์ดํ„ฐ ์ˆ˜์น˜ํ˜•
    • ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ
      • ์˜ˆ์ธก ๊ฐ€๋Šฅ
    • ๋กœ๊ทธํ˜• ๋ฐ์ดํ„ฐ
      • ์ธ์Šคํ„ด์Šค ์ˆ˜์˜ ๋น„๋ก€
      • ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅ
      • ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋Š” ๋” ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
      • ๊ทธ๋ž˜์„œ Agent์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋Œ€์‹  Samplingํ•˜์ž
        • ํŠธ๋žœ์žญ์…˜์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ Sampling
        • ๋‚ฎ์€ ํŠธ๋žœ์žญ์…˜์€ ์ ์€ ๋น„์œจ๋กœ Sampling
      • ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ Sampling ์ˆ˜๋ฅผ ๋ชจ์ง‘
        • ์ž‘์€ ์‹œ๊ฐ„๋‹จ์œ„๋กœ Samplingํ•˜๋‹ค ๋ณด๋ฉด
        • ํฐ ๊ทธ๋ฆผ์€ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ž˜ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋ž€?
      • ๋ณธ๋ž˜์˜ ๋ชฉ์ ์€ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ์€ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•˜์ž.
    • Back Pressure
      • Reactive Programming
  • ๋ฉ”์ธ ์Šคํ† ๋ฆฌ์ง€๋Š” ์นด์‚ฐ๋“œ๋ผ์— ์ €์žฅ

์™œ ์นด์‚ฐ๋“œ๋ผ์ธ๊ฐ€?

  • High Performance writing

    • ๋Œ€๋ถ€๋ถ„์€ Read๊ฐ€ ๋งŽ์ง€๋งŒ APM์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํ™ฉ
    • Write >>>>>>>>>>>> READ
    • insert-mostly workload
      • cassandra > couchbase > hbase > mongodb
  • Scalability

    • Linear Scalability
      • 2๋ฐฐ ๋Š˜๋ฆฌ๋ฉด > 2๋ฐฐ ์†๋„ ์ฆ๊ฐ€
  • Time Series Data Store

    • Partition Key - ์–ด๋Š ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ฐˆ์ง€
      • Application ID
    • Cluster Key - ์–ด๋–ค ์ˆœ์„œ๋กœ ์ €์žฅํ• ์ง€
      • Time ๊ธฐ์ค€์œผ๋กœ
    • ํŠน์ • ํŒŒํ‹ฐ์…˜์ด ๋งŽ์ด ์ฐจ์˜ค๋ฅด๋ฉด?
      • ๊ทธ ํŒŒํ‹ฐ์…˜์€ HotSpot!
      • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Partition Key์— Time Bucket ์ถ”๊ฐ€
      • Example
        • Time Bucket๊ฐ’์„ ์ •ํ•ด Hash๊ฐ’ ์ง€์ •
      • Time Bucket ํฌ๊ธฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์˜์กด์ ์ด๋‹ค.
        • Time Bucket ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด?
          • ์ฟผ๋ฆฌ์˜ ์šฉ์ด์„ฑ
        • Time Bucket ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง€๋ฉด?
          • ๋…ธ๋“œ์˜ ๊ท ํ˜•์„ฑ
      • ๋ฉ€ํ‹ฐ IDC
        • cassandra.yaml
        • cassandra-rackdc.properties
  • ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ..

    • Community๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š๋Š” ๋‹จ์  ใ… ใ… 
    • ๊ทธ๋ž˜์„œ ์ง์ ‘ Maliing List์— ๊ฐ€์ž…ํ•˜์—ฌ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ง„ํ–‰

Day 1 ํ›„๊ธฐ