๐ŸŒ ํ•™์Šต๋…ธํŠธ/๋‚™์„œ์žฅ

[๋ชจ๋‹ˆํ„ฐ๋ง์˜ ์ƒˆ๋กœ์šด ๋ฏธ๋ž˜ ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ #2] 2์žฅ.๊ด€์ธก๊ฐ€๋Šฅ์„ฑ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 

mini_world 2024. 2. 6. 23:27

๐Ÿ“Œ ์ด ๋‚ด์šฉ์€ ์ฑ… ๋‚ด์šฉ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ๊ณผ ๊ฒฝํ—˜ ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์žก๋‹ด์ด ์žˆ์œผ๋‹ˆ, ์ฑ…์„ ์ฝ์œผ๋ฉฐ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ณ ์‹ถ์€๋ถ„์ด ๋ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2.1 ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ

2.1.1 SPOF (single point of failure)

ํด๋ผ์šฐ๋“œ๋Š” ๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ ํ™˜๊ฒฝ์ด๊ธฐ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์‚ฌ์ด์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์›์ธ๋ถ„์„๋„ ์‰ฝ์ง€ ์•Š๋‹ค. (์ €๋ฒˆ์— ๊ฒช์€ cloudfront์žฅ์• ์ฒ˜๋Ÿผ..)
ํŠนํžˆ ๋„คํŠธ์›Œํฌ๋Š” SPOF ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ทธ ์˜ํ–ฅ๋„๊ฐ€ ๋งค์šฐ ํฌ๋ฆฌํ‹ฐ์ปฌํ•˜๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์—ฌ ์‚ฌ์ „์— ํƒ์ง€ํ•˜๊ณ  ์˜ˆ์ธกํ•˜๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

2.1.2 ๋กœ๋“œ๋ฒจ๋Ÿฐ์„œ

ํด๋ผ์šฐ๋“œ + ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์กฐํ•ฉ์œผ๋กœ ๋„คํŠธ์›Œํฌ์˜ ๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ–ˆ๋‹ค.๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ
๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” 3๊ฐ€์ง€ ๋กœ๋“œ๋ฒจ๋Ÿฐ์„œ ์œ ํ˜•์„ ์†Œ๊ฐœํ•˜๊ณ ์žˆ๋‹ค.

ํ”Œ๋žซํผ ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ

  • AWS๋กœ ์น˜๋ฉด ALB, NLB, nginx์™€ ๊ฐ™์€ 4๊ณ„์ธต 7๊ณ„์ธต ๋กœ๋“œ๋ฒจ๋Ÿฐ์„œ๋ฅผ ๋งํ•œ๋‹ค.

๊ฒŒ์ดํŠธ์›จ์ด ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ

  • api gateway๋ฅผ ๋งํ•œ๋‹ค.
  • ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ,๋ผ์šฐํŒ…, ์ธ์ฆ,๋ณด์•ˆ๊ฒ€์‚ฌ,SSLํ„ฐ๋ฏธ๋„ค์ด์…˜๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ์˜ ๊ธฐ๋Šฅ๋„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํ”Œ๋žซํผ ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ์€ ๊ฐ€์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ๋งŒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ฒŒ์ดํŠธ์›จ์ด ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. (๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ณ์ผ๋•Œ ํ•„์š”ํ•œ๊ฒƒ๊ฐ™๋‹ค..)
  • ๊ฒŒ์ดํŠธ์›จ์ด ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ ์ „๋žต์„ ๊ตฌ์ถ•ํ• ๋•Œ ๋ ˆ์ดํ„ด์‹œ ์ง€ํ‘œ์™€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ  ์ง€ํ‘œ๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ๊ฐ„๋‹ค.
    • ๋ ˆ์ดํ„ด์‹œ(Latency): ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋ฐ›๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„. ๋„คํŠธ์›Œํฌ์ง€์—ฐ, ์„œ๋ฒ„ ์ฒ˜๋ฆฌ์‹œ๊ฐ„๋“ฑ์— ๊ธฐ๋ฐ˜ํ•œ๋‹ค.
      ๋กœ๋“œ๋ฒจ๋Ÿฐ์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ผ์šด๋“œ๋กœ๋“œ ํŠธ๋ฆฝ(RTT)๋ฅผ ์ธก์ •ํ•˜์—ฌ ์„œ๋ฒ„ ์‘๋‹ต์‹œ๊ฐ„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ (Resource Utilization): CPU/MEM/๋””์ŠคํฌIO/๋„คํŠธ์›ŒํฌํŠธ๋ž˜ํ”ฝ ๋“ฑ ๋ถ€ํ•˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ํ‘œ๋‹ค.
  • ์˜ˆ์‹œ: ์Šคํ”„๋งํด๋ผ์šฐ๋“œ ๊ฒŒ์ดํŠธ์›จ์ด, ๋„ทํ”Œ๋ฆญ์Šค ์ค„(Zuul}

ํด๋ผ์ด์–ธํŠธ์ธก ๋ถ€ํ•˜ ๋ถ„์‚ฐ (Client-side Load Balancing)

  • ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” 'ํด๋ผ์ด์–ธํŠธ'๋Š” ์„œ๋น„์Šค๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.
  • ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์ค‘ ํ•˜๋‚˜๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋„๋ก ํ•˜๋Š”๊ฒƒ์ด ํด๋ผ์ด์–ธํŠธ์ธก ๋ถ€ํ•˜ ๋ถ„์‚ฐ์ด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์ธก ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ ์ž‘๋™๋ฐฉ์‹
    • ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ: ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„ ๋ชฉ๋ก์„ ์•Œ์•„๋‚ธ๋‹ค.
    • ๊ฒฐ์ •๋กœ์ง: ํด๋ผ์ด์–ธํŠธ ๋‚ด์žฅ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ ๋กœ์ง(์˜ˆ, ๋ผ์šด๋“œ๋กœ๋นˆ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์š”์ฒญ์„ ์–ด๋””์— ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ์š”์ฒญ์ „์†ก: ํด๋ผ์ด์–ธํŠธ๋Š” ์„ ํƒ๋œ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  • ์˜ˆ์‹œ: istio, ๋„ทํ”Œ๋ฆญ์Šค Ribbon
  • ๊ถ๊ธˆํ•ด์„œ ์ฐพ์•„๋ณธ๊ฒƒ - ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋‚ธ ์„œ๋ฒ„๊ฐ€ ๋งˆ์นจ ์žฅ์• ์ƒํ™ฉ์ด๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜?
    1. HealthChecks: ๋‹น์—ฐํžˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•˜๊ณ , ์ •์ƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์„œ๋ฒ„๋ชฉ๋ก์—์„œ ์ œ์™ธํ•œ๋‹ค.
    2. ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ ํŒจํ„ด ๊ตฌํ˜„ (curcuit breaker): ํŠน์ • ์„œ๋ฒ„๋กœ์˜ ์š”์ฒญ์ด ์ง€์†๋˜๋Š”๊ฒฝ์šฐ, ํ•ด๋‹น ์„œ๋ฒ„๋กœ์˜ ์š”์ฒญ์„ ์ฐจ๋‹จ(ํšŒ๋กœ์ฐจ๋‹จ)ํ•˜๊ณ  ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค. ์‹คํŒจํ•œ ์„œ๋ฒ„๊ฐ€ ๋ณต๊ตฌํ•  ์‹œ๊ฐ„์„ ๋ฒŒ๊ณ  ๋˜ ์ „์ฒด์ ์ธ ๋ถ€ํ•˜๋ฅผ ๋‚ฎ์ถ”๋Š”๋ฐ ์ข‹๋‹ค.
    3. ์žฌ์‹œ๋„ ๋งค์ปค๋‹ˆ์ฆ˜: ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์ž๋™์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์— ์š”์ฒญ์„ ์žฌ์‹œ๋„ ํ•œ๋‹ค. ์žฌ์‹œ๋„๋Š” ์ œํ•œ๋œ ํšŸ์ˆ˜์™€ ์ „๋žต(์˜ˆ,์ง€์ˆ˜๋ฐฑ์˜คํ”„)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ ์กฐ์‹ฌ)
    4. ํƒ€์ž„์•„์›ƒ ์„ค์ •: ์š”์ฒญ์— ํƒ€์ž„์•„์›ƒ์„ ์„ค์ •ํ•ด์„œ ์„œ๋ฒ„์‘๋‹ต์ด ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— ์˜ค์ง€ ์•Š์œผ๋ฉด ์‹คํŒจํ•˜๋„๋ก ํ•˜๊ณ , ์žฌ์‹œ๋„ ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋‹ค์‹œ ์š”์ฒญํ•˜๋„๋ก ํ•œ๋‹ค.
    5. ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ๋™๊ธฐํ™”: ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ์‹œ์Šคํ…œ์€ ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™๊ธฐํ™” ํ•ด์•ผํ•œ๋‹ค.

2.1.3 ๋ณต์›์„ฑ ํŒจํ„ด

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€์ ์—์„œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์€ ์†Œ์Šค ๋‚ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ, ์žฌ์‹œ๋„, ํƒ€์ž„์•„์›ƒ ๋“ฑ์„ ์ •์˜ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์—๋Ÿฌ์™€ ์‹œ์Šคํ…œ์—๋Ÿฌ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ , ์œ ํ˜•์— ๋”ฐ๋ผ ํ›„์†์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.
  • ์ธํ”„๋ผ ๊ด€์ ์—์„œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š”๊ฒƒ์€ ์„œ๋น„์Šค๋ฉ”์‹œ์™€ ๋ฉ”์„ธ์ง•์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด๋‹ค.

๋ณต์›์„ฑ ํŒจํ„ด1. ์žฌ์‹œ๋„

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

๋ณต์›์„ฑ ํŒจํ„ด2. ๋น„์œจ์ œํ•œ

  • ํŠน์ •์‹œ๊ฐ„๋™์•ˆ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์š”์ฒญ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ์‹œ์Šคํ…œ์ด ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ์— ๋†“์˜€์„๋•Œ ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ์ •์ง€์‹œ์ผœ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„์œจ์„ ์ œํ•œํ•จ์œผ๋กœ์จ, ์ œํ•œ๋œ ๋งŒํผ ๋งŒ์ด๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ LoadBalancer์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. (ํŠน์ •์‹œ๊ฐ„๋™์•ˆ ํ—ˆ์šฉ๋œ ์š”์ฒญ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋Š”๊ฒฝ์šฐ HTTP 429 ๋ฐ˜ํ™˜ ๋“ฑ)

๋ณต์›์„ฑ ํŒจํ„ด3. ๋ฒŒํฌํ—ค๋“œ

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

๋ณต์›์„ฑ ํŒจํ„ด4. ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค

  • ์ „๊ธฐํšŒ๋กœ์˜ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ํŒจํ„ด์œผ๋กœ, ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐ์„ ์ž๋™์œผ๋กœ ๋Š์–ด ์˜ค๋ฅ˜์˜ ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๋ชฉ์ : ์‹คํŒจ๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„๋•Œ ์ถ”๊ฐ€์ ์ธ ์†์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ์€ ๋Š๋Š”๋ฐ ์ค‘์ ์„ ๋‘”๋‹ค.
  • ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค์™€ ํ•จ๊ป˜ Kafka๊ฐ™์€ ๋ถ„์‚ฐ ๋ฉ”์„ธ์ง€ ์‹œ์Šคํ…œ์„ ์ ์šฉํ•˜๋Š”๊ฒƒ๋„ ์ข‹๋‹ค.
  • Netflex์˜ Hystrix

2.1.4 ๊ฐ€์‹œ์„ฑ

  • ์ด ์ฑ…์—์„œ ๋งํ•˜๋Š” ๊ฐ€์‹œ์„ฑ์€ ๋„คํŠธ์›Œํฌ/์ธํ”„๋ผ ๋ถ€๋ถ„์ด๋‹ค.
  • ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ€์‹œ์„ฑ์€ ์ƒํ˜ธ ๋ณด์™„์ ์ด๋ฉฐ ๋‹จ์ผ ์‹œ์Šคํ…œ ๋‚ด์— ๊ตฌ์ถ•ํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

2.1.5 ์„œ๋น„์Šค ๋งค์‹œ

  • ์„œ๋น„์Šค ๋ฉ”์‹œ๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ณ์—์„œ ์„œ๋น„์Šค๊ฐ„์˜ ํ†ต์‹ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์†”๋ฃจ์…˜์ด๋‹ค.
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์‚ฌ์ดํŠธ์นด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ํ”„๋ก์‹œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์„œ๋น„์Šค๊ฐ„์˜ ๋ชจ๋“  ํ†ต์‹ ์„ ์ค‘์žฌํ•œ๋‹ค. (istio envoy proxy)
  • ์„œ๋น„์Šค ๋งค์‹œ๋Š” ์„œ๋น„์Šค๊ฐ„์˜ ํ†ต์‹ (๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ,์žฅ์• ๋ณต๊ตฌ,์„œ๋น„์Šค๋””์Šค์ปค๋ฒ„๋ฆฌ), ๋ณด์•ˆ(SSL,์ ‘๊ทผ์ œ์–ด), ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ(๋กœ๊น…,๋ชจ๋‹ˆํ„ฐ๋ง,์ถ”์  ๋“ฑ) ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋‹ค๋งŒ, ์ด ์ฑ…์—์„œ๋Š” ์‚ฌ์ด๋“œ์นด ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ์„œ๋น„์Šค ๋งค์‹œ์— ๋Œ€ํ•œ ๋‹จ์ ์„ ์ •๋ฆฌํ–ˆ๊ณ , eBPF๋ฅผ ์ง€์›ํ•˜๋Š” Cilium์„ ์ถ”์ฒœํ–ˆ๋‹ค
    • ๋‹จ์ 1. ์ด์Šคํ‹ฐ์˜ค๋Š” ๋ฒŒํฌํ˜•ํƒœ์— ๊ฐ€๊นŒ์šด ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๋งŒ ์ง€์›ํ•œ๋‹ค.
    • ๋‹จ์ 2. ๊ด€๋ฆฌ์ •์ฑ…์€ yaml๋กœ ๊ตฌ์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€ ์ด์ƒ์œผ๋กœ ์ •๊ตํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
    • ์‚ฌ์ดํŠธ์นด๋Š” ๋น„์‹ผ ๋ฆฌ์†Œ์Šค์ด๋ฉฐ, ์ด์Šคํ‹ฐ์˜ค์˜ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ๊ณผ์ •์€ ๋‹ค์†Œ ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ์˜ˆ์‹œ: Istio, Linkerd, Consul Connect(์ฝ˜์ˆ ์ด๊ฑฐ Loki์—์„œ ๋ณธ์ ์ด ์žˆ๋‹ค!!)

2.2 ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜คํ† ์Šค์ผ€์ผ๋ง

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” HPA(Horizontal Auto Scaler)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜ ๋ฆฌ์†Œ๋ฅผ ํŒŒ๋“œ ์Šค์ผ€์ผ๋ง์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
HPA๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ ค๋ฉด CPU (.spec.resources.requests) ์ œํ•œ์„ ์„ ์–ธํ•ด์•ผํ•˜๊ณ , ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๋ฅผ ํ™œ์„ฑํ™” ํ•ด์•ผํ•œ๋‹ค. (๋‹น์—ฐํžˆ ๋ฐ๋ชฌ์…‹์€ ๋ถˆ๊ฐ€ํ•˜๋‹ค)

  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ
  • ๋ ˆํ”Œ๋ฆฌ์นด์…‹
  • ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ
  • ์Šคํ…Œ์ดํŠธํ’€์…‹

ํŒŒ๋“œ ์Šค์ผ€์ผ๋ง์€ ๋ฆฌ์†Œ์Šค ๋ฉ”ํŠธ๋ฆญ (Cpu/Mem) ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰๊ธฐ์ค€, ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜คํ† ์Šค์ผ€์ผ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ์€ custom.metrics.k8s.io API๊ฒฝ๋กœ์˜ Aggregated API์„œ๋ฒ„๋กœ ์ˆ˜ํ–‰๋˜๊ณ , ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ๋“ฑ ๋ฉ”ํŠธ๋ฆญ ์†”๋ฃจ์…˜ ๊ณต๊ธ‰์—…์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋Žํ„ฐ API์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•œ๋‹ค.

ํŒŒ๋“œ ๋ ˆ๋ฒจ์˜ ์˜คํ† ์Šค์ผ€์ผ๋ง์€ ๋…ธ๋“œ์˜ ์˜คํ† ์Šค์ผ€์ผ๋ง๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.

2.2.1 ์˜คํ† ์Šค์ผ€์ผ๋ง ์˜คํ”ˆ์†Œ์Šค

์˜คํ† ์Šค์ผ€์ผ๋ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค๋ฅผ ํ™•์ธํ•œ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„

  • kubelet์€ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋…ธ๋“œ ์—์ด์ „ํŠธ์ด๋ฉฐ, /stats/summary ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ๋ณ„ ์š”์•ฝ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๋Š” ๊ฐ kubelet์œผ๋กœ๋ถ€ํ„ฐ ์ˆ˜์ง‘ํ•˜๊ณ  ์ง‘๊ณ„ํ•˜์—ฌ API ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค.
  • API์„œ๋ฒ„๋Š” HPA, VPA(Vertical Pod Autoscaler), kubectl top ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”ํŠธ๋ฆญ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์†”๋ฃจ์…˜ ๊ณต๊ธ‰์—…์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š”(์˜ˆ,ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค) ์–ด๋Žํ„ฐ

  • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์–ด๋Žํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž์ •์˜ ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ์˜ HPA๋Š” 3์žฅ์—์„œ ๋‹ค์‹œ ์„ค๋ช…ํ•˜๋ฏ€๋กœ ํŒจ์Šค

KEDA (Event Driven AutoScaling)

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค. (Event Driven Autoscaler)
  • Apache kafka์™€ ๊ฐ™์€ queue์„œ๋น„์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.
  • ์˜ˆ๋ฅผ๋“ค์–ด, Kafka์— ๋ฉ”์„ธ์ง€ ํ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด, KEDA๊ฐ€ ๊ฐ์ง€ํ•˜๊ณ  Pod๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ ค์ฃผ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Apache Kafka ์™ธ์—๋„ RabbitMQ, Azure Event Hubs, AWS SQS ๋“ฑ์˜ ๋ฉ”์„ธ์ง• ์„œ๋น„์Šค์™€๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2.2.2 ๋ฉ”ํŠธ๋ฆญ ์ธก์ •

์œ„์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ์ด์šฉํ•ด์„œ ์˜คํ† ์Šค์ผ€์ผ๋ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ํฌ๊ฒŒ 3๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ดค๋‹ค.
CPU, Memory ์‚ฌ์šฉ๋Ÿ‰ ์™ธ์—๋„ ์ดˆ๋‹น์ฒ˜๋ฆฌ๊ฐœ์ˆ˜(TPS), ์ฒ˜๋ฆฌ์ง€์—ฐ์‹œ๊ฐ„(Latency) ๋“ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ๋ฉ”ํŠธ๋ฆญ์„ ์กฐํ•ฉํ•œ ๊ฐ’์œผ๋กœ๋„ ์˜คํ† ์Šค์ผ€์ผ๋ง์„ ํŠธ๋ฆฌ๊ฑฐ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ค ๋ฉ”ํŠธ๋ฆญ์„ ์˜คํ† ์Šค์ผ€์ผ๋ง์— ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค.

ํŠนํžˆ, ๊ตฌ๊ธ€ SRE์ด ์ œ์‹œํ•˜๋Š” 4๊ฐ€์ง€ ๊ณจ๋“  ์‹œ๊ทธ๋„ (Latency, Traffic, Errors, Saturation)์—์„œ ์ข‹์€ ์˜ˆ์‹œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”๋ณด๊ธฐ

The Four Golden Signals 
์ถœ์ฒ˜: https://sre.google/sre-book/monitoring-distributed-systems/
The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four.


Latency
The time it takes to service a request. It’s important to distinguish between the latency of successful requests and the latency of failed requests. For example, an HTTP 500 error triggered due to loss of connection to a database or other critical backend might be served very quickly; however, as an HTTP 500 error indicates a failed request, factoring 500s into your overall latency might result in misleading calculations. On the other hand, a slow error is even worse than a fast error! Therefore, it’s important to track error latency, as opposed to just filtering out errors.
Traffic
A measure of how much demand is being placed on your system, measured in a high-level system-specific metric. For a web service, this measurement is usually HTTP requests per second, perhaps broken out by the nature of the requests (e.g., static versus dynamic content). For an audio streaming system, this measurement might focus on network I/O rate or concurrent sessions. For a key-value storage system, this measurement might be transactions and retrievals per second.
Errors
The rate of requests that fail, either explicitly (e.g., HTTP 500s), implicitly (for example, an HTTP 200 success response, but coupled with the wrong content), or by policy (for example, "If you committed to one-second response times, any request over one second is an error"). Where protocol response codes are insufficient to express all failure conditions, secondary (internal) protocols may be necessary to track partial failure modes. Monitoring these cases can be drastically different: catching HTTP 500s at your load balancer can do a decent job of catching all completely failed requests, while only end-to-end system tests can detect that you’re serving the wrong content.
Saturation
How "full" your service is. A measure of your system fraction, emphasizing the resources that are most constrained (e.g., in a memory-constrained system, show memory; in an I/O-constrained system, show I/O). Note that many systems degrade in performance before they achieve 100% utilization, so having a utilization target is essential.In complex systems, saturation can be supplemented with higher-level load measurement: can your service properly handle double the traffic, handle only 10% more traffic, or handle even less traffic than it currently receives? For very simple services that have no parameters that alter the complexity of the request (e.g., "Give me a nonce" or "I need a globally unique monotonic integer") that rarely change configuration, a static value from a load test might be adequate. As discussed in the previous paragraph, however, most services need to use indirect signals like CPU utilization or network bandwidth that have a known upper bound. Latency increases are often a leading indicator of saturation. Measuring your 99th percentile response time over some small window (e.g., one minute) can give a very early signal of saturation.Finally, saturation is also concerned with predictions of impending saturation, such as "It looks like your database will fill its hard drive in 4 hours."
If you measure all four golden signals and page a human when one signal is problematic (or, in the case of saturation, nearly problematic), your service will be at least decently covered by monitoring.

  • ์š”์ฒญ์ˆ˜ (number of request)
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜์‹ ํ•˜๋Š” ์š”์ฒญ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.
    • ์š”์ฒญ์ˆ˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด, ์‹œ์Šคํ…œ์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์ˆ˜, ์š”์ฒญ์ฒ˜๋ฆฌ ์„ฑ๊ณต๋ฅ  ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์š”์ฒญ๊ธฐ๊ฐ„ (duration of the request)
    • ์š”์ฒญ ๊ธฐ๊ฐ„์ด๋ž€, ํŠน์ • ์š”์ฒญ์ด ์‹œ์ž‘๋˜์–ด ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์š”์ฒญ์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ ธ๋Š”์ง€๋Š” ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ์ž˜ ๋‚˜ํƒ€๋‚œ๋‹ค.
    • ์‹œ์Šคํ…œ(์˜ˆ๋ฅผ๋“ค์–ด ALB) ์—์„œ URI๋ณ„ (duration of the request)์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—„์ฒญ๋‚˜๊ฒŒ ์œ ์šฉํ•œ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ ๊ฒƒ๊ฐ™๋‹ค.
  • ๋™์‹œ์š”์ฒญ
    • ๋™์‹œ์š”์ฒญ ์ง€ํ‘œ๋Š”, ํŠน์ • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ‘๋ชฉํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ณ ์žˆ๋Š”์ง€ ๋“ฑ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2.2.3 ๋ฉ”ํŠธ๋ฆญ ์„ ์ •

์ธก์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ์‹๋ณ„ํ–ˆ๋‹ค๋ฉด ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค.
๋˜ํ•œ ๋” ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๊ฒƒ์€ ๋ฉ”ํŠธ๋ฆญ์„œ๋ฒ„, ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์–ด๋Žํ„ฐ, KEDA๋“ฑ AutoScaler๋“ค์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ด Pod๋“ค์˜ cpu/mem ์‚ฌ์šฉ๋Ÿ‰์„ ํŒŒ์•…ํ•ด์•ผํ•œ๋‹ค.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด AutoScaling ๋˜๊ธฐ ์ „ AutoScaler๊ฐ€ โ˜ ๏ธ์ฃฝ์–ด๋ฒ„๋ฆฌ๋ฉด ๋ง์งฑ ๋„๋ฃจ๋ฌต์ด๋‹ค. 

  • โญ๏ธ์ค‘์š”โญ๏ธ AutoScaling ์„ค์ •ํ• ๋•Œ ๊ณ ๋ ค์•ผํ•ด์•ผํ• ๊ฒƒ
    ์ฑ…์—์„  HPA ์„ค์ • ์ฃผ์˜์‚ฌํ•ญ์ด์ง€๋งŒ, ์ด๊ฑด K8s HPA ๋ฟ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ AutoScaling ์„ค์ •์‹œ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
    ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ดํ•ด์™€, AutoScaling ์ฃผ์˜์‚ฌํ•ญ์„ ์ฝ์ง€ ์•Š๊ณ  ๋งˆ๊ตฌ ์„ค์ •ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋งค์šฐ ํฐ ์žฅ์• ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. 

    • ๋ฉ”ํŠธ๋ฆญ ์„ ํƒ
      • ์–ด๋–ค ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ์ค€์œผ๋กœ AutoScalingํ• ๊ฒƒ์ธ์ง€๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ, ๋ถ€ํ•˜๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ์ •ํ™•ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ์„ ์ •ํ•ด์•ผํ•œ๋‹ค.
      • ์˜ˆ๋ฅผ๋“ค์–ด ์œ„์— ๊ตฌ๊ธ€ SRE ๋ฌธ์„œ(๋”๋ณด๊ธฐ)์— ๋”ฐ๋ฅด๋ฉด ์›น์„œ๋ฒ„์˜ ๊ฒฝ์šฐ ์ดˆ๋‹น HTTP์ˆ˜(๋‹จ, ์ •์ ์ปจํ…์ธ ๋ƒ ๋™์ ์ปจํ…์ธ ๋ƒ ๋ถ„๋ฆฌ ์„ธ๋ถ„ํ™” ํ•„์š”), ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ I/O ์†๋„ ๋˜๋Š” ๋™์‹œ์„ธ์…˜, key-value์ €์žฅ์†Œ์˜ ๊ฒฝ์šฐ ์ดˆ๋‹น ํŠธ๋žœ์ ์…˜ ๋ฐ ๊ฒ€์ƒ‰ ์ˆ˜ ๋“ฑ์„ ๊ธฐ์ค€์œผ๋กœ Traffic ์„ ์ธก์ •ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค.
    • ์Šค๋ ˆ์‹ฑ(thrashing) ๋ฐฉ์ง€
      • ์Šค๋ ˆ์‹ฑ์ด๋ž€, ์ž์›์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ํ˜„์ƒ์„ ๋งํ•˜๋ฉฐ, ์ด๋Ÿฐ ์ฆ์ƒ์€ ์˜คํžˆ๋ ค ๋น„ํšจ์œจ์ ์ธ ์ž์› ์‚ฌ์šฉ ๋ฐ ์„ฑ๋Šฅ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. 
      • ์˜ˆ์ „์— ๊ฒช์—ˆ๋˜ ์ด์Šˆ๋กœ CPU๊ธฐ์ค€์œผ๋กœ AutoScaling๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค๊ฐ€, ์ธ์Šคํ„ด์Šค ๋ช‡๋ฐฑ๊ฐœ ๋– ์žˆ์—ˆ๋˜ ์ ์ด ์žˆ๋‹ค. ๋„ˆ๋ฌด ์˜ˆ๋ฏผํ•˜๊ฒŒ ์„ค์ •ํ•ด๋†“์•˜๋˜ ํƒ“์— CPU ์‚ฌ์šฉ๋ฅ  ๋†’์•„์ง -> ์ปจํ…Œ์ด๋„ˆ ๋Š˜๋ฆผ -> ๋ถ€ํŒ…๋ ๋•Œ CPU๋†’๊ฒŒ ์นจ -> CPU์‚ฌ์šฉ๋ฅ  ์•ˆ๋‚ฎ์•„์ ธ์„œ ๋” ๋Š˜๋ฆผ -> ๋ถ€ํŒ…๋ ๋•Œ CPU๋†’๊ฒŒ์นจ ๐Ÿ˜ฎ‍๐Ÿ’จ์˜ ๋ฌดํ•œ ๋ฐ˜๋ณต์ด์—ˆ๋‹ค.
        ์ •๋ง ์ดˆ๋ณด์ ์ธ ์‹ค์ˆ˜์ง€๋งŒ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ง•์„ ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์„ค์ •ํ•ด๋ฒ„๋ฆฌ๋ฉด ์ด๋Ÿฐ ์‹ค์ˆ˜๋ฅผ ๊ฒช์„ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
      • ์Šค๋ ˆ์‹ฑ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ƒ๊ฐํ•ด์•ผํ• ๊ฑด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
        • ์ ์ ˆํ•œ ์ง€ํ‘œ ์„ ํƒ: ์˜ฌ๋ฐ”๋ฅธ ์ง€ํ‘œ๋ฅผ ์„ ํƒํ•˜๋Š”๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค. 
        • ์ฟจ๋‹ค์šด ๊ธฐ๊ฐ„ ์ง€์ •: ๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ์Šค์ผ€์ผ์ธ/์•„์›ƒ ๋˜์ง€ ์•Š๋„๋ก ์ฟจ๋‹ค์šด ๊ธฐ๊ฐ„(์Šค์ผ€์ผ ์ง€ํ‘œ์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๊ธฐ๊ฐ„)์„ ์„ค์ •ํ•œ๋‹ค.
        • ์ ์ ˆํ•œ ์Šค์ผ€์ผ๋ง ๊ธฐ์ค€ ์ง€์ •: ๋„ˆ๋ฌด ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค. ์ผ์‹œ์ ์ธ ๋ถ€ํ•˜๋กœ ์Šค์ผ€์ผ ์ธ/์•„์›ƒ๋˜๋ฉด์„œ ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
        • ์˜ˆ์ธก ์Šค์ผ€์ผ๋ง ์‚ฌ์šฉ: ๋ถ€ํ•˜๊ฐ€ ๋งŽ์€ ์‹œ๊ฐ„์ด ์˜ˆ์ธก ๋œ๋‹ค๋ฉด, ์Šค์ผ€์ผ๋ง ํ•ด๋‘๋„๋ก ํ•œ๋‹ค. (์˜ˆ, ์ €๋… 7-10์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜ ๋ชฐ๋ฆฐ๋‹ค๋ฉด ๊ทธ ์‹œ๊ฐ„๋™์•ˆ์—” ํ‰์†Œ๋ณด๋‹ค ๋งŽ์€ ์„œ๋ฒ„๋ฅผ ์ค€๋น„ํ•˜๋„๋ก ํ•œ๋‹ค)
        • ์Šค์ผ€์ผ ์ธ/์•„์›ƒ ์ •์ฑ… ๋ถ„๋ฆฌ: ์Šค์ผ€์ผ ์ธ/์•„์›ƒ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ง€ํ‘œ, ์ž„๊ณ„๊ฐ’, ์ฟจ๋‹ค์šด ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜์—ฌ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠน์„ฑ๊ณผ ์ง€ํ‘œ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
        • ์ˆ˜๋™๊ฐœ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•Œ๋žŒ์„ค์ •: ์ด๋ฆ„์— Auto๊ฐ€ ๋“ค์–ด๊ฐ”๋‹ค๊ณ  ํ•ด์„œ ์™„๋ฒฝํ•œ ์ž๋™ํ™”๋Š” ์•„๋‹ˆ๋‹ค. ์™„๋ฒฝํ•œ๊ฑด ๊ทธ ์–ด๋””์—๋„ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.. ๊ทธ๋Ÿฌ๋ฏ€๋กœ.. AutoScaling์ด ๋„ˆ๋ฌด ์ž์ฃผ ์ผ์–ด๋‚˜๋ฉด ์šด์˜์ž๊ฐ€ ๊ฐœ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•Œ๋žŒ์„ ์„ค์ •ํ•˜์ž!
    • Graceful Shutdown
      • Scale-in/out ๋™์ž‘์œผ๋กœ ์„œ๋ฒ„(pod)๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ข…๋ฃŒ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋„๋ก, ๋ชจ๋“  ์ž‘์—…์ด ์•ˆ์ „ํ•˜๊ฒŒ ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์•ผํ•œ๋‹ค.
      • ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด K8s์˜ Lifecycle Hooks ์ค‘ PreStop Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
        ์˜ˆ๋ฅผ๋“ค์–ด, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „ PreStopํ›…์ด ํ˜ธ์ถœ๋˜์–ด, ์ •์˜๋œ ๋ช…๋ น์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
        • [์ฐธ๊ณ ] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค(Kubernetes)์—์„œ ํ›…(Hook) ํ•ธ๋“ค๋Ÿฌ ์ข…๋ฅ˜
          • Lifecycle Hooks:
            • PostStart: ์ด ํ›…์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰๋œ ์งํ›„์— ํ˜ธ์ถœํ•œ๋‹ค. ์ด ํ›…์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ, ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค๋Š” ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ณ , PostStart ํ›…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ๋Š” ์ •์ƒ์ ์œผ๋กœ ๊ณ„์† ์‹คํ–‰๋œ๋‹ค.
            • PreStop: ์ด ํ›…์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ์ด ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. PreStop ํ›…์ด ํ˜ธ์ถœ๋œ ํ›„, ์‹œ์Šคํ…œ์€ SIGTERM ์‹ ํ˜ธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์— ๋ณด๋‚ด์–ด ์ข…๋ฃŒ ์ ˆ์ฐจ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
          • Admission Hooks: (https://kyverno.io/docs/introduction/ ๐Ÿ”ฅ Kyverno๊ฐ€ ์ด ํ›…์„ ์‚ฌ์šฉํ•œ๋‹ค.)
            Admission Hooks๋Š” API ์„œ๋ฒ„์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์–ด ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด ํ›…์€ ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์˜ ์š”์ฒญ์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์ด๋‚˜ ํ›„์— ํŠน์ • ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •๋œ๋‹ค. 
            • Validating Admission Webhooks: ์ด ํ›…์€ ์š”์ฒญ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํŠน์ • ๊ทœ์น™์ด๋‚˜ ์ •์ฑ…์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ณ , ๊ฒ€์ฆ์— ์‹คํŒจํ•˜๋ฉด ์š”์ฒญ์€ ๊ฑฐ๋ถ€๋œ๋‹ค.
            • Mutating Admission Webhooks: ์ด ํ›…์€ ์š”์ฒญ๋œ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •, ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ ์šฉ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ง€์—ฐ๋ฐ˜์‘
      • ์œ„์— ์ฟจ๋‹ค์šด๊ณผ ๊ฐ™์€ ๋งฅ๋ฝ์ธ๊ฒƒ ๊ฐ™๋‹ค.
      • ์ฃผ์˜ํ•ด์•ผํ• ๊ฑด, ์ง€์—ฐ์‹œ๊ฐ„์„ ๋Š˜๋ฆฌ๋ฉด AutoScaling๋™์ž‘์ด ๋‘”ํ•ด์ง€๊ณ , ์ง€์—ฐ์‹œ๊ฐ„์ด ์งง๊ฑฐ๋‚˜ ์—†์œผ๋ฉด ์Šค๋ ˆ์‹ฑ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.
# ์ง€์—ฐ๋ฐ˜์‘(Cooldown) ์„ค์ • ์˜ˆ์‹œ

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  namespace: my-namespace
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300 # ์Šค์ผ€์ผ ๋‹ค์šด ๊ฒฐ์ •์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ • (5๋ถ„)
      policies:
      - type: Pods
        value: 1
        periodSeconds: 60
      - type: Percent
        value: 10
        periodSeconds: 60

 

2.3 ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ ํ”„๋กœ์„ธ์Šค

2.3.1 ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ ์šด์˜ ํ”„๋กœ์„ธ์Šค

[ ๋ฉ”ํŠธ๋ฆญ ๋ถ„์„ ] → [ ์ถ”์  ๋ถ„์„ ] → [ ๋กœ๊ทธ ๋ถ„์„ ]
                                     โ†–โ”€โ”€โ”€โ”€โ”˜

๋”๋ณด๊ธฐ

์ด ๋ถ€๋ถ„์—์„œ ๋ฌด์—‡์„ ์„ค๋ช…ํ•˜๊ณ ์‹ถ์€๊ฑด์ง€ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ฅด๊ฒ ๋‹ค.. ๊ทธ๋ž˜๋„ ํ˜น์‹œ๋ชจ๋ฅด๋‹ˆ ์ ์–ด๋†“์ž. 

  • ๋ฉ”ํŠธ๋ฆญ ๋ถ„์„: SLI (Service Lever Indicater(์„œ๋น„์Šค ์ˆ˜์ค€ ์ง€ํ‘œ)), SLO (Service Lever Object(์„œ๋น„์Šค ์ˆ˜์ค€ ๋ชฉํ‘œ))๋“ฑ ๋‹ค์–‘ํ•œ ์‹ ๋ขฐ์„ฑ ์ง€ํ‘œ๋ฅผ ์‘์šฉํ•ด์„œ ์•Œ๋žŒ์—…๋ฌด ๊ทœ์น™์„ ๊ฐœ๋ฐœํ•œ๋‹ค.
  • ์ถ”์  ๋ฐ ๋กœ๊ทธ๋Š” ๋น„์šฉ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ƒ˜ํ”Œ๋ง ๋œ๋‹ค.
  • ๋ฉ”ํŠธ๋ฆญ๊ณผ ์ถ”์ ์€ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก ํƒœ๊ทธ๋ฅผ ์ค‘์ฒฉ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ๋ถ„์‚ฐ์ถ”์ ์€ ํŠน์ • ์‚ฌ์šฉ์ž๋‚˜ ์ƒํ˜ธ์ž‘์šฉ์˜ ์š”์ฒญ์„ ๊ด€์ฐฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹๋‹ค (*์นด๋””๋„๋ฆฌํ‹ฐ: ์ „์ฒด ํ–‰์— ๋Œ€ํ•œ ํŠน์ • ์ปฌ๋Ÿผ์˜ ์ค‘๋ณต ์ˆ˜์น˜)
  • ๋ฉ”ํŠธ๋ฆญ๊ณผ ์ถ”์ •๋ช…์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋Š”๊ฒƒ์ด ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ์˜ ์ƒํ˜ธ ์—ฐ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ฆ๊ฐ€ํ•œ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ์ธํ•ด์„œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๊ณ  ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ธํžˆ ๋ถ„์„ํ•ด์•ผํ•œ๋‹ค. TraceID๋กœ ๊ฑฐ๋ž˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ง€์—ฐ์ด ๋ฐœ์ƒํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์ธํ•œ๋‹ค. ์ถ”์ ์˜ ๋กœ๊ทธ (์ŠคํŒฌ์ฝ˜ํ…์ŠคํŠธ)์™€ ํƒœ๊ทธ๋ฅผ ์ƒ์„ธํžˆ ๋ถ„์„ํ•œ๋‹ค.
  • ์ถ”์ ์€ ๋กœ๊น…๋ณด๋‹ค ์šฐ์„ ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ˆ˜์ง‘ํ•˜๋Š”์ •๋ณด๋Š” ๊ฐ™์ง€๋งŒ ์ฝ˜ํ…์ŠคํŠธ๊ฐ€ ๋” ํ’๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‹œ์Šคํ…œ์˜ ์ •์ƒ ์ž‘๋™ ์—ฌ๋ถ€๋ถ€ํ„ฐ ํŒ๋‹จํ•ด์•ผํ•˜๋ฏ€๋กœ, ์ถ”์ ๊ณผ ๋ฉ”ํŠธ๋ฆญ์˜ ์—ญํ• ์ด ๊ฒน์น  ๋•Œ๋Š” ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  •  TraceID๋ฅผ ํฌํ•จํ•˜๋Š” ๋กœ๊ทธํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋กœ๊ทธ ํŒŒ์ผ์— ์žˆ๋Š” ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•œ ํ›„ ๋””๋ฒ„๊น…์„ ์‹œ์ž‘ํ•œ๋‹ค. ์ƒ๊ด€๊ด€๊ณ„์— ๋”ฐ๋ผ ์ถ”์  ๋กœ๊ทธ ๋ฉ”ํŠธ๋ฆญ์„ ์ „ํ™˜ํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์ธก๋ฉด์—์„œ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•œ๋‹ค.

2.3.2 ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ ์žฅ์•  ํ”„๋กœ์„ธ์Šค

[ ์žฅ์•  ๋ฐœ์ƒ ] → [ ์•Œ๋žŒ ์ „์†ก ] → [ ์ถ”์ ๋ถ„์„ ] → [ ๋กœ๊ทธ๋ถ„์„ ]

  • ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋žŒ์ด ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค. ์•Œ๋žŒ์„ ๋ฐ›์œผ๋ฉด ๋ฉ”ํŠธ๋ฆญ/์ถ”์ /๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ์˜ ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ์ƒ์„ธํ•œ๋ถ„์„์—๋Š” ๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์—๋Ÿฌ๋ฒ ์„ธ์ง€, ์ž…์ถœ๋ ฅ๋ฉ”์„ธ์ง€๋“ฑ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ๋””๋ฒ„๊น…์— ํ™œ์šฉํ•œ๋‹ค.
  • ์ถ”์ ์œผ๋กœ๋Š” ์ง€์—ฐ์‹œ๊ฐ„, ์‹œ์Šคํ…œ๋ณ„ ์ฒ˜๋ฆฌ์‹œ๊ฐ„๋“ฑ์„ ๋ถ„์„ํ•ด์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์Šคํ…œ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ถ”์ ๊ณผ ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”, ๋ณด๋‹ค ์ƒ์„ธํ•œ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ๋””๋ฒ„๊น…์€ ํ”„๋กœํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค.

2.4 ์ˆ˜ํ‰์ƒค๋”ฉ

์ˆ˜ํ‰ ์ƒค๋”ฉ(Horizontal Sharding)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ์‹œ์ผœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.
๊ทธ๋ผํŒŒ๋‚˜ํŒจ๋ฐ€๋ฆฌ ๋ฟ ๋งŒ ์•„๋‹ˆ๋ผ Kafka, Redis, Cassandra ๋“ฑ ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ์ƒค๋”ฉ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

  • ์ƒค๋”ฉ์˜ ํŠน์ง•
    • ๋ถ€ํ•˜๋ถ„์‚ฐ: ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ์‹œ์ผœ ๊ฐ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
    • ํ™•์žฅ์„ฑ: ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์š”๊ตฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„, ์ถ”๊ฐ€ ์„œ๋ฒ„๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ƒค๋”ฉ์„ ํ™•์žฅํ•จ์œผ๋กœ์จ ์šฉ์ดํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ณ ๊ฐ€์šฉ์„ฑ: ๋‹จ์ผ ์žฅ์•  ์ง€์ (Single Point of Failure, SPOF)์„ ์ค„์ด๋ฉฐ, ํŠน์ • ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ๊ฐ€์šฉ์„ฑ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ˆ˜ํ‰์ƒค๋”ฉ ๊ตฌํ˜„ ๊ณ ๋ ค์‚ฌํ•ญ
    • ์ƒค๋”ฉ ํ‚ค ์„ ํƒ: ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ƒค๋”ฉ ํ‚ค(Sharding Key)๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. (๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ๊ท ํ˜•/ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ)
    • ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ: ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค. (๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„ ๊ฐ„์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋˜์–ด์•ผ ์„ฑ๋Šฅ ์ด์ ์„ ์ตœ๋Œ€ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.)
    • ์กฐ์ธ๊ณผ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ: ์ˆ˜ํ‰ ์ƒค๋”ฉ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ถ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์กฐ์ธ์ด๋‚˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ: ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
  • ์ˆ˜ํ‰์ƒค๋”ฉ์˜ ๋ฌธ์ œ์ 
      • ๋ฐ์ดํ„ฐ์˜ ์žฌ๋ถ„๋ฐฐ
        • ์ƒค๋“œ๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ์žฌ๋ถ„๋ฐฐ๊ฐ€ ์ด๋ฃจ์–ด์งˆ๋•Œ(๋ฆฌ๋ฒจ๋Ÿฐ์‹ฑ) ์„ฑ๋Šฅ์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.
        • ๋ฐ์ดํ„ฐ์˜ ์žฌ๋ถ„๋ฐฐ๊ฐ€ ํ•„์š”ํ• ๋•Œ๋ž€? 
          • ํ•˜๋‚˜์˜ ์ƒค๋“œ๋กœ๋Š” ๋”์ด์ƒ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์šธ๋•Œ, ์ƒค๋“œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๊ฐ€ ๋ถˆ๊ท ๋“ฑํ•˜์—ฌ ์ƒค๋“œ์†Œ์ง„(Shard Exhaustion)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์ƒค๋“œ ํ‚ค๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•ด์•ผํ•œ๋‹ค. 
          •  ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค (๋…ธ๋“œ์˜ ์ถ”๊ฐ€/์‚ญ์ œ) ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•ด์•ผํ•œ๋‹ค.
      • ์œ ๋ช…์ธ์‚ฌ ๋ฌธ์ œ
        • "์œ ๋ช…์ธ์‚ฌ ๋ฌธ์ œ" ๋˜๋Š” "ํ•ซ ์ŠคํŒŸ" ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์ง‘์ค‘๋˜์–ด ๊ณผ๋„ํ•œ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.
        • ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜จ๋ผ์ธ ์„œ๋น„์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ์„œ๋น„์Šค๋Š” ์žฌ๋ฃŒ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒค๋“œ์— ๋ถ„๋ฅ˜ํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ƒค๋”ฉ ํ‚ค๋กœ๋Š” ์žฌ๋ฃŒ์˜ ์•ŒํŒŒ๋ฒณ ์ฒซ ๊ธ€์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ "Apple pie"์™€ "Avocado salad"๊ฐ€ ์œ ๋ช…ํ•œ ๋ฐฉ์†ก์— ์†Œ๊ฐœ๋˜๋ฉด์„œ ๋‘ ๋ ˆ์‹œํ”ผ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์š”์ฒญ์ด ๊ธ‰์ฆํ•œ๋‹ค. 'A' ์ƒค๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์‹œํ”ผ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์š”์ฒญ์ด ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉฐ, ํ•ด๋‹น ์ƒค๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํŠธ๋ž˜ํ”ฝ ์–‘์ด ๊ธ‰๊ฒฉํžˆ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ, 'A' ์ƒค๋“œ์˜ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์ „์ฒด ์„œ๋น„์Šค์˜ ์‘๋‹ต ์‹œ๊ฐ„ ์ฆ๊ฐ€, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜ ๋“ฑ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
        • ์œ ๋ช…์ธ์‚ฌ ๋ฌธ์ œ๋Š” ์œ„์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์ƒค๋”ฉ ์ „๋žต์—์„œ ํŠน์ • ํ‚ค(์—ฌ๊ธฐ์„œ๋Š” ์•ŒํŒŒ๋ฒณ)์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•  ๋•Œ, ์ผ๋ถ€ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋นˆ๋„๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ๋†’์„ ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      • ์กฐ์ธ๊ณผ ๋น„์ •๊ทœํ™”
        • ์—ฌ๋Ÿฌ ์ƒค๋“œ ์„œ๋ฒ„๋ฅผ ์ชผ๊ฐœ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ์–ด ์ €์žฅํ•˜๋ฉด, ์—ฌ๋Ÿฌ ์ƒค๋“œ์— ๊ฑธ์นœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ธํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค์–ด์ง„๋‹ค. ํŠนํžˆ RDB์—๋Š” ํŠนํžˆ ๋„์ „๊ณผ์ œ๊ฐ€ ๋œ๋‹ค.
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋น„์ •๊ทœํ™” ํ•˜์—ฌ ์กฐ์ธ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์—์„œ ์งˆ์˜๊ฐ€ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก)
        • ์ •๊ทœํ™”(Normalization)๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ณผ์ •์ด๋ผ๋ฉด, ๋น„์ •๊ทœํ™”๋Š” ์ด๋Ÿฌํ•œ ๋ถ„ํ• ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ†ตํ•ฉํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

2.5 ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค

๊ฒฌ๊ณ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฟผ๋Ÿผ(Quorum), ๊ฐ€์‹ญ(Gossip), ํ•ด์‹ฑ, ์ƒค๋”ฉ๋“ฑ์ด ํ•„์š”ํ•˜๋‹ค.
์ด์™€๊ฐ™์€ ๊ธฐ๋ฒ•๋“ค์ด ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„  ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ์ด ์ฑ…์—์„œ๋Š” ์•„์ฃผ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.
์ด ์ฑ…์—์„œ ๋งํ•˜๋Š” ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ์˜ ๊ตฌํ˜„์ฒด๋กœ Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ฅผ ์ด์•ผ๊ธฐํ•˜๋ฉฐ, ์•„๋ž˜ ์„ค๋ช…์—” Grafana ํŒจ๋ฐ€๋ฆฌ๊ฐ€ ๊ทธ ๋Œ€์ƒ์ด๋‹ค.

  • ๋ฉ”ํŠธ๋ฆญ ๊ธฐ์ค€์œผ๋กœ AutoScaling์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋ฆฌ์†Œ์Šค์— ์•ˆ์ •์ ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„๋ฐฐํ•˜๊ณ , ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š”๊ฒƒ๋„ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.
  • ๊ทธ๋ผํŒŒ๋‚˜ ํŒจ๋ฐ€๋ฆฌ(Loki,Grafana,Tempo,Mimir)๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค, ์ƒค๋”ฉ, ํ•ด์‹ฑ์„ ์•„์ฃผ ์ž˜ ๊ตฌํ˜„ํ–ˆ๋‹ค. 

2.5.1. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐœ๋ฐœ ํ๋ฆ„

[ ๋ฐ”์ด๋„ˆ๋ฆฌ ] → [ ๋„์ปค์ด๋ฏธ์ง€ ] → [ K8s Pod ]

  • ์Šคํ”„๋ง๋ถ€ํŠธ, Go๋กœ ๊ฐœ๋ฐœ๋œ ์†Œ์Šค๋ฅผ Makefile๋กœ ๋นŒ๋“œํ•ด์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์‹คํ–‰๋ ์ˆ˜๋„ ์žˆ๊ณ  ๋„์ปค ์ปจํ…Œ์ด๋„ˆ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒŒ๋“œ ๋“ฑ ๋‹ค์–‘ํ•œ *๋Ÿฐํƒ€์ž„ํ™˜๊ฒฝ์— ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ๋˜๊ณ  ์šด์˜๋  ์ˆ˜์žˆ๋‹ค.
    * ๋Ÿฐํƒ€์ž„: ์‹คํ–‰ํ™˜๊ฒฝ, ๋‹จ์ˆœํžˆ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„์„ ๋„˜์–ด ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ํŠน์„ฑ๊ณผ ๊ทธ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”์ง€๊นŒ์ง€ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์ ์ธ ๊ฐœ๋…
  • ๋„์ปคํŒŒ์ผ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.
  • ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ฐธ์กฐํ•ด์„œ Helm์ฐจํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋ฐฐํฌํ•œ๋‹ค.
  • Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Docker, K8s๋“ฑ ์—ฌ๋Ÿฌ ๋Ÿฐํƒ€์ž„์— ์šด์˜๋  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋œ๋‹ค.
  • ์ด ์ฑ…์—์„œ๋Š” Grafana ํŒจ๋ฐ€๋ฆฌ๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋ฐฐํฌํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋ฐฐํฌํ•จ์œผ๋กœ์จ Istio Sidecar, Telemetry API ๊ณ„์ธก, AutoScaling ๋“ฑ์ด ์œ ์—ฐํ•˜๊ณ  ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋œ๋‹ค.

2.5.2 ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค

Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์šด์˜๋œ๋‹ค.
๋ชจ๋“ˆํ™”๋œ ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๊ณ , ์™ธ๋ถ€ํ†ต์‹ ์—” REST, ๋‚ด๋ถ€ํ†ต์‹ ์—” gRPC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ฑ…์—์„œ๋Š” Mimir๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์ง€๋งŒ, Mimir๋ณด๋‹ค๋Š” Loki๊ฐ€ ์กฐ๊ธˆ ๋” ๋‚˜์—๊ฒ ํŽธํ•จ์œผ๋กœ Loki๋กœ ์„ค๋ช…์„ ๋Œ€์ฒดํ•œ๋‹ค.

๋”๋ณด๊ธฐ
  • Loki๋ž€?
    Loki๋Š” ์—ฌ๋Ÿฌ clients์—์„œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ์ง‘๊ณ„์‹œ์Šคํ…œ์ด๋‹ค.
    • ์ˆ˜์ง‘: ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ (e.g. promtail, fluentbit…)์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.
    • ์ €์žฅ: ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค๊ฐ€ ์ผ์ • ์ฃผ๊ธฐ๋กœ ์˜๊ตฌ์Šคํ† ๋ฆฌ์ง€(e.g. s3, minio…)๋กœ ๋ณด๋‚ธ๋‹ค.
    • ์ฟผ๋ฆฌ: ์ €์žฅ๋œ ๋กœ๊ทธ๋Š” LogQL ๋กœ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Grafana์™€ ๋ฐ”๋กœ ํ†ตํ•ฉ๋œ๋‹ค.
     
  • ๋ชจ๋“ˆํ™”๋œ ์ปดํฌ๋„ŒํŠธ
    • ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ์ž์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋ฉฐ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘/์ €์žฅ/์กฐํšŒํ•˜๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    • Distributer
      • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„,  Ingester๋ฅผ ์„ ํƒํ•˜๊ณ , Ingesterd์—๊ฒŒ ๋กœ๊ทธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
      • ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค Ingester๋กœ ์ „์†ก๋ ์ง€ ๊ฒฐ์ •ํ•˜๊ณ , ์ด ๊ณผ์ •์€ ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ ์—ญํ• ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋˜๋„๋ก ํ•œ๋‹ค.
      •  ๋ ˆ์ด๋ธ”์ด ์˜ฌ๋ฐ”๋ฅธ์ง€, ์ „์†ก๋ฅ  ์ œํ•œ์— ๊ฑธ๋ฆฌ์ง€๋Š” ์•Š๋Š”์ง€ ๋“ฑ ๋“ค์–ด์˜ค๋Š” ๋กœ๊ทธ๊ฐ€ ์‚ฌ์–‘์— ๋งž๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
      • ๋ ˆ์ด๋ธ”์„ ์ •๊ทœํ™” ํ•œ๋‹ค. e.g. {foo="bar", bazz="buzz"}๋ฅผ {bazz="buzz", foo="bar"}์™€ ๋™๋“ฑํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
    • Ingester
      • Ingester๋Š” Distributor๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ž„์‹œ๋กœ ์ €์žฅํ•˜๊ณ , ์ผ์ • ์‹œ๊ฐ„์ด๋‚˜ ํฌ๊ธฐ์— ๋„๋‹ฌํ•˜๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ Chunk๋กœ ๋งŒ๋“ค์–ด ์žฅ๊ธฐ ์ €์žฅ์†Œ๋กœ ํ”Œ๋Ÿฌ์‹œ(flush)ํ•œ๋‹ค.
      • ๋ฐ์ดํ„ฐ๊ฐ€ ์žฅ๊ธฐ ์ €์žฅ์†Œ๋กœ ์˜ฎ๊ฒจ์ง€๊ธฐ ์ „๊นŒ์ง€ Ingester์—์„œ ์ž„์‹œ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ, ๊ณ ์†์˜ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ์™€ ์งˆ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
      • ์ˆ˜์ง‘๋œ ๋กœ๊ทธ๊ฐ€ ์ˆœ์„œ์— ๋งž๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. (Write ahead log ์„ค์ •์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง„๋‹ค)
    • Ruler
      • Ruler ์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๊ทœ์น™(alerting rules)์„ ํ‰๊ฐ€ํ•˜๊ณ , ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
      • ๋กœ๊ทธ ํŒจํ„ด์ด๋‚˜ ํŠน์ • ์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฝ๊ณ ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Querier
      • ์‹ค์ œ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์ €์žฅ๋œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • Ingester ์ธ๋ฉ”๋ชจ๋ฆฌ ์ฟผ๋ฆฌ์™€ ์˜๊ตฌ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • Query frontend
      • ์˜ต์…˜์ด๋‹ค. ์žˆ์–ด๋„ ๋˜๊ณ  ์—†์–ด๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š”๊ฒƒ ๊ฐ™๋‹ค.
      • ์ฟผ๋ฆฌ Queue์™€ Caching์„ ๋‹ด๋‹นํ•œ๋‹ค. Querier์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋น ๋ฅธ ์งˆ์˜ ์‘๋‹ต ์‹œ๊ฐ„์„ ์ œ๊ณตํ•œ๋‹ค.
      • ํฐ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์„๋•Œ OOM์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ์ž‘์€ ์ฟผ๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด Querier์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค.
    • Chunk Store / Index Store
      • ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ "Chunk" ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋ฉฐ, ์ด ๋ฐ์ดํ„ฐ๋Š” Chunk Store์— ์ €์žฅํ•œ๋‹ค. ๋˜ํ•œ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ Index Store์— ์ €์žฅํ•œ๋‹ค.
      • Amazon S3, Google Cloud Storage, Microsoft Azure Storage์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ๋˜๋Š” ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์™ธ๋ถ€ํ†ต์‹ ์—” REST, ๋‚ด๋ถ€ํ†ต์‹ ์—” gRPC
    • Loki ์•„ํ‚คํ…์ฒ˜์—์„œ ์ด๋Ÿฌํ•œ ํ†ต์‹  ๋ฐฉ์‹์„ ์กฐํ•ฉํ•˜์—ฌ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ํŽธ๋ฆฌํ•จ๊ณผ ๋‚ด๋ถ€ ์„œ๋น„์Šค ๊ฐ„์˜ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ํ†ต์‹ ์˜ ํ•„์š”์„ฑ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ๋‹ค.
    • ์™ธ๋ถ€ ํ†ต์‹ : ํด๋ผ์ด์–ธํŠธ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์—์„œ REST API๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, HTTP/HTTPS ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์›น ์„œ๋น„์Šค์™€์˜ ํ†ตํ•ฉ์ด ์šฉ์ดํ•˜๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ REST API๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‚ด๋ถ€ ํ†ต์‹ : Loki์˜ ๋‚ด๋ถ€ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์—๋Š” gRPC๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. (gRPC๋Š” ๊ณ ์„ฑ๋Šฅ, ํ™•์žฅ ๊ฐ€๋Šฅํ•œ API ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๊ตฌ๊ธ€์— ์˜ํ•ด ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ ์†Œ์Šค RPC ํ”„๋ ˆ์ž„์›Œํฌ) gRPC๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ(Protocol Buffers)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜๋ฏ€๋กœ, ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Loki์˜ ๋ถ„์‚ฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์— ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค

Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋Š” ๊ทธ ์ž์ฒด๋กœ ์šฐ์ˆ˜ํ•œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด๋‹ค.

2.5.3 ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์„ CQRS(Command and Query Responsibility Segregation)๋ผ ํ•œ๋‹ค.

์œ„์— ์„ค๋ช…ํ•œ Loki๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Œ€์ค‘์ ์œผ๋กœ ์“ฐ์ด๋Š” ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์ด๋Ÿฐ CQRS ํŒจํ„ด์€ ์—ฌ๋Ÿฌ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • CQRS ํŒจํ„ด์˜ ์ด์ 
    • ๋…๋ฆฝ์ ์ธ ํฌ๊ธฐ ์กฐ์ •: ์‹œ์Šคํ…œ์˜ ๋ถ€ํ•˜๊ฐ€ ๋ช…๋ น ์ฒ˜๋ฆฌ ๋˜๋Š” ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์ค‘ ์–ด๋Š ํ•œ ์ชฝ์— ์น˜์šฐ์ณ ์žˆ์„ ๋•Œ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ: ์ฟผ๋ฆฌ ๋ชจ๋ธ์€ ์ฝ๊ธฐ ์—ฐ์‚ฐ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜๋ฉฐ, ๋ช…๋ น ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ ํ™”ํ•œ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ๊ณผ ์กฐํ™” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ: ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ, ์ตœ์ ํ™”, ์œ ์ง€๋ณด์ˆ˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถฐ ๊ฐœ๋ฐœํŒ€์˜ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ณด์•ˆ๊ฐ•ํ™”: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ์—„๊ฒฉํžˆ ํ†ต์ œํ•˜๊ณ , ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ์ˆœํ•œ ์ฟผ๋ฆฌ: ์ฟผ๋ฆฌ ๋ชจ๋ธ์€ ์ฝ๊ธฐ ์—ฐ์‚ฐ์— ํŠนํ™”๋˜์–ด ์„ค๊ณ„๋˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋‹จ์ˆœํ•ด์ง„๋‹ค.
  • CQRS ํŒจํ„ด์˜ ๋‹จ์  (์žฅ์ ๋งŒ ๋งํ•˜๊ธธ๋ž˜ ๋‹จ์ ๋„ ์ถ”๊ฐ€ ๐Ÿ˜‰)
    • ๋ณต์žก์„ฑ ์ฆ๊ฐ€: CQRS๋Š” ์‹œ์Šคํ…œ์„ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ๋ถ€๋ถ„(๋ช…๋ น ์ฒ˜๋ฆฌ์™€ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ)์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฏ€๋กœ,์ „์ฒด ์•„ํ‚คํ…์ณ๊ฐ€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€ ์–ด๋ ค์›€: ๋ช…๋ น๋ชจ๋ธ๊ณผ ์ฟผ๋ฆฌ๋ชจ๋ธ์ด ๋ถ„๋ฆฌ๋˜์–ด์žˆ์„๋•Œ ๋‘ ๋ชจ๋ธ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ ์„ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ํŠนํžˆ ์ด๋ฒคํŠธ์†Œ์‹ฑ(Event Sourcing)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์ผ๊ด€์„ฑ ์œ ์ง€์— ๋” ๋งŽ์€ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ๊ฐœ๋ฐœ ๋ฐ ์šด์˜๋น„์šฉ ์ฆ๊ฐ€/ํ•™์Šต๊ณก์„ /์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์˜ ์œ„ํ—˜: ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ, ๊ฐœ๋ฐœ ์ดˆ๊ธฐ๋‹จ๊ณ„์—์„œ ๋ณด๋‹ค ๋งŽ์€ ์„ค๊ณ„์™€ ๊ณ„ํš์ด ์š”๊ตฌ๋œ๋‹ค. ๋ถ„๋ฆฌ๋œ ์•„ํ‚คํ…์ณ๋ฅผ ์šด์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์†Œ์Šค ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Q. ์ด๋ฒคํŠธ์†Œ์‹ฑ์ด ๋ญ”๊ฐ€? ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์ผ๊ด€์„ฑ ์œ ์ง€์˜ ์–ด๋ ค์›€์ด ๋ฐœ์ƒํ• ๊นŒ? (์•„๋ž˜๋”๋ณด๊ธฐ)

๋”๋ณด๊ธฐ

[๊ธฐ๋ณธ๊ฐœ๋… ์ •๋ฆฌ]

  • ์ด๋ฒคํŠธ ์†Œ์‹ฑ(Event Sourcing): ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ(์ด๋ฒคํŠธ)์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰ ๊ณ„์ขŒ์—์„œ ๋ˆ์„ ์ž…๊ธˆํ•˜๊ฑฐ๋‚˜ ์ถœ๊ธˆํ•˜๋Š” ๊ฐ๊ฐ์˜ ํ–‰๋™์ด ์ด๋ฒคํŠธ๊ฐ€ ๋˜์–ด ๊ธฐ๋ก๋˜๊ฒŒ ๋œ๋‹ค.
  • CQRS(Command Query Responsibility Segregation): ์‹œ์Šคํ…œ์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํŒจํ„ด์ด๋‹ค.
    ํ•˜๋‚˜๋Š” ๋ช…๋ น(๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ)์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ฟผ๋ฆฌ(๋ฐ์ดํ„ฐ ์กฐํšŒ)๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

[์ด๋ฒคํŠธ ์†Œ์‹ฑ(Event Sourcing)์˜ ์˜ˆ์‹œ]

์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰ ๊ณ„์ขŒ ์‹œ์Šคํ…œ์„ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

- ๊ณ„์ขŒ ์ƒ์„ฑ ์ด๋ฒคํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ณ„์ขŒ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด "๊ณ„์ขŒ ์ƒ์„ฑ" ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด๋ฒคํŠธ ์Šคํ† ์–ด์— ์ €์žฅ
- ๊ธˆ์•ก ์ž…๊ธˆ ์ด๋ฒคํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์ขŒ์— ๊ธˆ์•ก์„ ์ž…๊ธˆํ•˜๋ฉด "๊ธˆ์•ก ์ž…๊ธˆ" ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ด๋ฒคํŠธ ์Šคํ† ์–ด์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ถ”๊ฐ€
- ๊ธˆ์•ก ์ถœ๊ธˆ ์ด๋ฒคํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์ขŒ์—์„œ ๊ธˆ์•ก์„ ์ถœ๊ธˆํ•˜๋ฉด "๊ธˆ์•ก ์ถœ๊ธˆ" ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ €์žฅ

์ด๋ฒคํŠธ ์Šคํ† ์–ด์—๋Š” ๊ณ„์ขŒ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด๋ฒคํŠธ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๊ณ„์ขŒ์˜ ์ƒํƒœ(์ž”์•ก ๋“ฑ)๋ฅผ ์–ธ์ œ๋“ ์ง€ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.  ๋˜ํ•œ, ์ด ์‹œ์Šคํ…œ์€ ๊ณผ๊ฑฐ์˜ ํŠน์ • ์‹œ์ ์œผ๋กœ ๊ณ„์ขŒ์˜ ์ƒํƒœ๋ฅผ ๋˜๋Œ์•„๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹œ์Šคํ…œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ(audit log)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ด๋•Œ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS(Command Query Responsibility Segregation) ํŒจํ„ด์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ, ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์ผ๊ด€์„ฑ ์œ ์ง€์˜ ์–ด๋ ค์›€์€ ๋ช…๋ น ๋ชจ๋ธ๊ณผ ์ฟผ๋ฆฌ ๋ชจ๋ธ ๊ฐ„์˜ ๋™๊ธฐํ™” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

 

2.6 ์ผ๊ด€๋œ ํ•ด์‹œ

์œ„์—์„œ ์•Œ์•„๋ดค๋˜ ์ƒค๋”ฉ(Sharding)๊ณผ ํ•จ๊ป˜ ํ•ด์‹ฑ(Hashing)์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ด€๊ณ„์— ์žˆ๋‹ค.

  • ํ•ด์‹ฑ์˜ ์—ญํ• 
    • ํ•ด์‹ฑ์€ ํ‚ค๊ฐ’์„ ํ•ด์‹œ ํ•จ์ˆ˜๋ผ๋Š” ์ˆ˜์‹์— ๋Œ€์ž…ํ•˜์—ฌ ๊ณ„์‚ฐํ•œ ํ›„ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”๋กœ ๊ฐ’์— ์ ‘๊ทผ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ: ํ•ด์‹ฑ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’(์˜ˆ: ํ‚ค ๊ฐ’)์„ ๋ฐ›์•„ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ํ•ด์‹œ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ํ•ด์‹œ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์ƒค๋“œ์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ•ด์‹ฑ์„ ํ†ตํ•ด ๊ฐ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์ด ์–ด๋–ค ์ƒค๋“œ์— ์ €์žฅ๋ ์ง€ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋œ๋‹ค..
    • ์ผ๊ด€๋œ ํ•ด์‹ฑ(Consistent Hashing): ์ผ๊ด€๋œ ํ•ด์‹ฑ์€ ์ƒค๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ๋•Œ ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์ตœ์†Œํ•œ์˜ ์žฌ๋ถ„๋ฐฐ๋งŒ์„ ์œ ๋ฐœํ•˜์—ฌ, ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•œ๋‹ค.
    • ํ•ด์‹ฑ์€ ๋ฐ์ดํ„ฐ์ €์žฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฒ€์ƒ‰(ํ•ด์‹œํ…Œ์ด๋ธ”), ์•”ํ˜ธํ™”, ๋ฐ์ดํ„ฐ๋ฌด๊ฒฐ์„ฑ๊ฒ€์‚ฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒค๋”ฉ์˜ ์—ญํ• 
    • ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ๋ฐ ํ™•์žฅ์„ฑ: ์ƒค๋”ฉ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด๋ฅผ ๋” ์ž‘์€ ํŒŒํ‹ฐ์…˜(์ƒค๋“œ)์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ , ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • ์„ฑ๋Šฅ ๊ฐœ์„ : ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์ƒค๋“œ์— ๋ถ„์‚ฐ์‹œํ‚ด์œผ๋กœ์จ, ๋‹จ์ผ ์ƒค๋“œ์— ๋Œ€ํ•œ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ , ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ƒค๋“œ์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ๋‹ค.
    • ๋ฐ์ดํ„ฐ์˜ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ ์ƒค๋”ฉ์ด๋‹ค.
    • ์ƒค๋”ฉ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ํ•ด์‹ฑ๋ฐฉ์‹์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ฒ”์œ„๊ธฐ๋ฐ˜์ƒค๋”ฉ(Range-based Sharding), ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ(Directory-based Sharding), ์‚ฌ์šฉ์ž์ •์˜ ์‚ฌ๋”ฉ(Custom Sharding)์ด ์žˆ๋‹ค. ์ฆ‰, ํ•ด์‹ฑ์€ ์ƒค๋”ฉ์„ ๊ตฌํ˜„ํ•˜๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ค‘์— ํ•˜๋‚˜์ด๋ฉฐ, ํ•ด์‹ฑ์—†์ด ์ƒค๋”ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ํ•ด์‹ฑ์— ๋Œ€ํ•ด ์กฐ๊ธˆ๋” ํ™•์ธํ•ด๋ณด์ž

  • ๋‹จ์ˆœ(์ผ๋ฐ˜)ํ•ด์‹ฑ (General/Standard/Simple Hashing)
    • ์ž‘๋™ ๋ฐฉ์‹: ๋ฐ์ดํ„ฐ์˜ ํ‚ค๋ฅผ ํ•ด์‹œ ํ•จ์ˆ˜์— ์ž…๋ ฅํ•˜์—ฌ, ๊ฒฐ๊ณผ๊ฐ’์„ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์Šฌ๋กฏ ๋ฒˆํ˜ธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • ๋ฌธ์ œ์ : ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ(์˜ˆ: ์„œ๋ฒ„์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ, ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•ด์‹œ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ค๋ฅธ ์Šฌ๋กฏ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      ๋”ฐ๋ผ์„œ, ์„œ๋ฒ„ ์ถ”๊ฐ€๋‚˜ ์ œ๊ฑฐ ๊ฐ™์€ ์‹œ์Šคํ…œ์˜ ํ™•์žฅ ๋ฐ ์ถ•์†Œ ์ž‘์—…์ด ๋ฐœ์ƒํ•  ๋•Œ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ด๋™์„ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ์ด๋Š” ์‹œ์Šคํ…œ์— ํฐ ๋ถ€ํ•˜๋ฅผ ์ฃผ๊ณ  ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๊ด€๋œ ํ•ด์‹ฑ(Consistent Hashing)
    • ์ž‘๋™ ๋ฐฉ์‹: ์ผ๊ด€๋œ ํ•ด์‹ฑ์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ ์˜ค์ง ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์žฌ๋ฐฐ์น˜๋˜๋„๋ก ํ•˜๋Š” ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํ•ด์‹œ ๊ณต๊ฐ„์„ ์›ํ˜•์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์™€ ์„œ๋ฒ„๋ฅผ ํ•ด์‹œ ๊ณต๊ฐ„ ์ƒ์˜ ํฌ์ธํŠธ๋กœ ๋งคํ•‘ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํ•ด์‹œ ๊ฐ’์— ๋”ฐ๋ผ ์ด ์› ์œ„์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„ ํฌ์ธํŠธ์— ํ• ๋‹น๋œ๋‹ค.
    • ์žฅ์ : ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ๋•Œ, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ํ›จ์”ฌ ์ ๋‹ค. ์˜ค์ง ์ƒˆ ์„œ๋ฒ„์™€ ์ธ์ ‘ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค์‹œ ํ• ๋‹น๋˜๋ฉฐ, ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์ด๋กœ ์ธํ•ด ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค. ๋˜ํ•œ, ํ•ซ์Šคํฟ ํ‚ค ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ˆœ(์ผ๋ฐ˜)ํ•ด์‹ฑ VS ์ผ๊ด€๋œ ํ•ด์‹ฑ
    • ๊ธฐ๋ณธํ•ด์‹ฑ์€ ์Šฌ๋กฏ(์„œ๋ฒ„)์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ฐ”๋€”๋•Œ ๋Œ€๋ถ€๋ถ„ ์•„์ดํ…œ์„ ์žฌ๋ฐฐ์น˜ ํ•ด์•ผํ•œ๋‹ค.
    • ์ผ๊ด€๋œ ํ•ด์‹ฑ์€ ์†Œ์ˆ˜์˜ ์•„์ดํ…œ๋งŒ ์žฌ๋ฐฐ์น˜ํ•˜๊ฒŒ๋˜์–ด ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ตœ์†Œํ™” ๋œ๋‹ค.
  • ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table)๊ณผ ํ•ด์‹œ ๋ง(Hash Ring)์€ ๊ฐœ๋…์ ์ธ ๋ชจ๋ธ์ด๋ฉฐ, ๋ฌผ๋ฆฌ์ ์ธ ํ…Œ์ด๋ธ”์ด๋‚˜ ์ €์žฅ์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
    ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒ์ ์ธ ๊ตฌ์กฐ(๋…ผ๋ฆฌ์ ์ธ ๋ชจ๋ธ)์ด๋ฉฐ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์œ„์— ์ถ”์ƒํ™”๋œ ๊ณ„์ธต์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฐœ๋…๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ผ๋ถ€์ด๋‹ค.

Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋Š” ํŠน์ • ์Šคํ† ๋ฆฌ์ง€์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค.
์ด๋Š” ๊ณง ์Šคํ† ๋ฆฌ์ง€์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ƒค๋”ฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ , ์Šคํ† ๋ฆฌ์ง€ ์œ ํ˜•์— ์ƒ๊ด€์—†์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ƒค๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋˜ํ•œ ๋””์Šคํฌ๋ ˆ๋ฒจ์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๊ตฌํ˜„๋œ๋‹ค.

 

2.7 ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ ์‹œ๊ฐํ™” 

Grafana๋Š” ์‹œ๊ฐํ™” ๊ฐ€๋Šฅํ•œ ์ˆ˜๋งŽ์€ ์ข…๋ฅ˜์˜ ์ฐจํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
* ์ตœ์‹  ์‹œ๊ฐํ™” ํŒจ๋„: https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/

 

Visualizations | Grafana documentation

Path: docs/grafana/latest/panels-visualizations/visualizations/_index.md Copied!

grafana.com

๋ฌธ์„œ์— ๊ฐ€์žฅ ์ข‹์€ ์ตœ์‹  ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์•ž์œผ๋กœ๋„ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š”๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ข€ ์‹ ๊ธฐํ•œ๊ฑด Canvas์ด๋‹ค.
Canvas ํŒจ๋„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์ปค์Šคํ…€ ์‹œ๊ฐํ™”๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์— ๋‹ค์–‘ํ•œ ์‹œ๊ฐ์  ์š”์†Œ์™€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๊ทธ๋ž˜ํ”ฝ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2.8 ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ

ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ž€, ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค(Key)์™€ ๊ฐ’(Value)์˜ ์Œ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹์„ ๊ฐ€์ง„ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฉฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ Redis, Memcached, AWS Dynamodb, Apache Cassandra, Google LevelDB ๋“ฑ์ด ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ’์ €์žฅ์†Œ๋Š” Redis์ด๋‚˜, Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋Š” Redis๋ณด๋‹ค๋Š” Memcached๋ฅผ ๊ถŒ์žฅํ•˜๊ณ , ์ฃผ๋กœ ์ฝ๊ธฐ์— ์‚ฌ์šฉํ•œ๋‹ค. ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์ง€์—ฐ์—†์ด ๋งŽ์€ ํŠธ๋žœ์ ์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„์•ฝ์ ์œผ๋กœ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. (+๋น„์šฉ์ ˆ๊ฐ) --> ์šฐ๋ฆฌ Loki๋Š” Redis/Memcached ์•ˆ์จ์„œ ์ฝ๊ธฐ๊ฐ€ ์ข€๋งŒ ์ปค์ง€๋ฉด ํž˜๋“ ๊ฑธ๊นŒ ๐Ÿ˜ญ

ํ‚ค-๊ฐ’ ์Œ์—์„œ์˜ ํ‚ค๋Š” ์œ ์ผํ•ด์•ผ ํ•˜๋ฉฐ, ํ•ด๋‹น ํ‚ค์— ๋งค๋‹ฌ๋ฆฐ ๊ฐ’์€ ํ‚ค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ‚ค๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ์ผ์ˆ˜๋„ ์žˆ๊ณ , ํ•ด์‹œ๊ฐ’์ผ์ˆ˜๋„ ์žˆ๋‹ค.ํ‚ค๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ด์Šˆ๋กœ ์งง์„์ˆ˜๋ก ์ข‹๋‹ค.
  • ๊ฐ’์€ ๋ฌธ์ž์—ด, ๋ฆฌ์ŠคํŠธ, ๊ฐ์ฒด์ผ ์ˆ˜ ์žˆ๋‹ค. (์ œํ•œ์—†๋‹ค)

์ด ์ฑ…์—์„œ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋Š” ์•„๋ž˜์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ธ๋‹ค.

  • ์ฝ˜์ˆ (Consul), Etcd, ๋ฉค๋ฒ„๋ฆฌ์ŠคํŠธ(Memberlist) ๋“ฑ์„ ์‚ฌ์šฉํ•ด ๊ตฌ์„ฑ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๋กœ๊ทธ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋Š” ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ ์„ค๊ณ„์‹œ ๊ณ ๋ คํ•ด์•ผํ•  ํŠน์„ฑ

  • ํ‚ค-๊ฐ’ ์Œ์˜ ํฌ๊ธฐ๋Š” 10KB ์ดํ•˜๋‹ค.
  • ์‚ฌ์ด์ฆˆ๊ฐ€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์‹œ์Šคํ…œ์€ ์žฅ์• ์—๋„ ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•˜๋Š” ๋†’์€ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
  • ํŠธ๋ž˜ํ”ฝ ์–‘์— ๋”ฐ๋ผ ์ž๋™์ ์œผ๋กœ ์„œ๋ฒ„์ฆ์„ค,์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๋†’์€ ๊ทœ๋ชจ์˜ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ์ผ๊ด€์„ฑ ์ˆ˜์ค€์€ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. -> ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ ์‚ฌ์ด์˜ ๊ณ ๋ฏผ์€ ํ•ญ์ƒ ํ•ด์•ผํ•œ๋‹ค.
  • ์‘๋‹ต ์ง€์—ฐ ์‹œ๊ฐ„์ด ์งง์•„์•ผ ํ•œ๋‹ค.

Q. ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ(Consistency)๊ณผ ๊ฐ€์šฉ์„ฑ(Availability) ์‚ฌ์ด์˜ ๊ณ ๋ฏผ

๋”๋ณด๊ธฐ

[์ƒํ™ฉ ์„ค์ •]
์˜จ๋ผ์ธ ์„œ์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ „ ์„ธ๊ณ„ ์—ฌ๋Ÿฌ ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์–ด๋Š ์ง€์—ญ์—์„œ๋“ ์ง€ ์ฑ…์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ตฌ๋งคํ•˜๋ฉฐ, ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

[์ผ๊ด€์„ฑ(Consistency)์˜ ์ค‘์š”์„ฑ]
์ผ๊ด€์„ฑ์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ์„ฑ์งˆ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ฑ…์˜ ์žฌ๊ณ ๋ฅผ ์—…๋ฐ์ดํŠธ(์˜ˆ: ์žฌ๊ณ  +1)ํ•˜๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋„ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋œ ์žฌ๊ณ  ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ํ•œ ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด, ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ๊ตฌ์‹ ์žฌ๊ณ  ์ •๋ณด๋ฅผ ๋ณด๊ฒŒ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์žฌ๊ณ ๊ฐ€ ์‹ค์ œ๋ณด๋‹ค ์ ๋‹ค๊ณ  ์ž˜๋ชป ๋ณด์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งค๋ฅผ ๋ง์„ค์ด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

[๊ฐ€์šฉ์„ฑ(Availability)์˜ ์ค‘์š”์„ฑ]
๊ฐ€์šฉ์„ฑ์€ ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ํ•ญ์ƒ ์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ์„ฑ์งˆ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์ œ๋“ ์ง€ ์ฑ…์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

[๊ท ํ˜• ์ฐพ๊ธฐ]
์ผ๊ด€์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ์ฐพ๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š๋‹ค.

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


--๋ฒˆ์™ธ
์˜ˆ์ „์— S3๊ณต๋ถ€ํ• ๋•Œ ๊ฐ€์šฉ์„ฑ, ์ผ๊ด€์„ฑ, ๋‚ด๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ๋•Œ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•ด ๊ธฐ์–ต์ด ๊ฐ€๋ฌผ๊ฐ€๋ฌผํ•ด์„œ ํ•œ๋ฒˆ ๋‹ค์‹œ ์ฐพ์•„๋ดค๋‹ค.

 

Amazon S3 ์—…๋ฐ์ดํŠธ — ๊ฐ•๋ ฅํ•œ ์“ฐ๊ธฐ ํ›„ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ | Amazon Web Services

2006๋…„์— S3๋ฅผ ์ถœ์‹œํ–ˆ์„ ๋•Œ ์‚ฌ์‹ค์ƒ ๋ฌด์ œํ•œ์˜ ์šฉ๋Ÿ‰ (“…๊ฐœ์ˆ˜์— ์ƒ๊ด€์—†์ด ๋ธ”๋ก์„ ์‰ฝ๊ฒŒ ์ €์žฅ…”)๊ณผ, 99.99%์˜ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์œ„์น˜์— ํˆฌ๋ช…ํ•˜๊ฒŒ ์ €์žฅ๋˜๋Š” ๋‚ด๊ตฌ์„ฑ ์žˆ

aws.amazon.com

 

2.9 ๊ฐ์ฒด์Šคํ† ๋ฆฌ์ง€

๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ (Object Storage)๋ž€, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด(Object) ๋‹จ์œ„๋กœ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€์ด๋‹ค.
๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ž์ฒด ๋ฟ ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ณ ์œ  ์‹๋ณ„์ž๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ฐธ์กฐํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋Š” ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ , ๋Œ€๊ทœ๋ชจ์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ํŠน์ง•
    • ํ™•์žฅ์„ฑ: ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋Š” ๊ฑฐ์˜ ๋ฌดํ•œ์— ๊ฐ€๊นŒ์šด ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํ‰๋ฉด๊ตฌ์กฐ์— ์ €์žฅํ•˜๊ธฐ๋•Œ๋ฌธ์— ํŒŒ์ผ์‹œ์Šคํ…œ์ด๋‚˜ ๋ธ”๋ก์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„์ธต์  ๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ๊ณผ ํ•œ๊ณ„์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ: ๊ฐ ๊ฐ์ฒด์—๋Š” ํŒŒ์ผ ์ž์ฒด ์™ธ์—๋„ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ: ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋Š” HTTP/HTTPS ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•œ๋‹ค. RESTful API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‚ด๊ตฌ์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ: ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์œ„์น˜์— ์ž๋™์œผ๋กœ ๋ณต์ œํ•˜๊ณ , ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•จ์œผ๋กœ์จ ๋†’์€ ๋‚ด๊ตฌ์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ์†์‹ค์˜ ์œ„ํ—˜์„ ์ตœ์†Œํ™” ํ•˜๊ณ  ์–ธ์ œ๋“  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋Š” SSD์— ๋น„ํ•ด IOPS๊ฐ€ ๋‚ฎ์ง€๋งŒ(์ด ์ฑ…์—์„œ๋Š” IOPS๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ–ˆ์ง€๋งŒ, ์ •ํ™•ํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์—๋Š” IOPS ๊ฐœ๋…์ด ์—†๋‹ค. ์ธก์ •์˜ ๊ด€์ ์ด ๋‹ค๋ฅด๋‹ค.), ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput)์„ ์ œ๊ณตํ•œ๋‹ค. (๋˜ ์™„์ „ํžˆ ๋ฌด์ œํ•œ์€ ์•„๋‹ˆ๋‹ค. S3๋งŒ ํ•˜๋”๋ผ๋„ api์— ๋”ฐ๋ผ prefix๋ณ„ limit์ด ์กด์žฌํ•œ๋‹ค)

Q. ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋Š” ํ‰๋ฉด๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ๋ง ๊ทธ๋Œ€๋กœ์˜ Object ์ €์žฅ์†Œ์ธ๋ฐ, ์™œ Prefix๋ณ„ ์ œํ•œ์ด ์žˆ์ง€?

๋”๋ณด๊ธฐ

์ฐธ๊ณ : https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html

 

Best practices design patterns: optimizing Amazon S3 performance - Amazon Simple Storage Service

Best practices design patterns: optimizing Amazon S3 performance Your applications can easily achieve thousands of transactions per second in request performance when uploading and retrieving storage from Amazon S3. Amazon S3 automatically scales to high r

docs.aws.amazon.com


S3๋Š” Prefix๋‹น Amazon S3 ์ ‘๋‘์‚ฌ๋‹น ์ดˆ๋‹น ์ตœ์†Œ 3,500๊ฐœ์˜ PUT/COPY/POST/DELETE ๋˜๋Š” 5,500๊ฐœ์˜ GET/HEAD ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (Prefix๋ฅผ ๋‚˜๋ˆ„๋ฉด ๋ฌผ๋ก  x3500, x5500์ด ๋˜์ง€๋งŒ..)

๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ฐ์ฒด์Šคํ† ๋ฆฌ์ง€๋Š” ํ‰๋ฉด๊ตฌ์กฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๋˜ Object๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด ๊ทธ๋Œ€๋กœ๋ฅผ ์ €์žฅํ•˜๋Š”๊ฑฐ๋ผ Prefix๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ๋ฐ (์˜ˆ, test/object1, test/object2 ์—์„œ test/๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฐœ๋…์ด ์•„๋‹ˆ๊ณ  ๊ฐ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ด test/object1, test/object2 ์ด๋‹ค. test/๋Š” prefix(์ ‘๋‘์‚ฌ)๋‹ค.) ์–ด์งธ์„œ Prefix๋‹น Limit์ด ์กด์žฌํ•˜๋Š”๊ฑธ๊นŒ?

  • Prefix์˜ ์—ญํ• 
    • ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์—์„œ Prefix๋Š” ๊ฐ์ฒด๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŒจํ„ด์„ ๊ฐ€์ง„ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์„ ์‰ฝ๊ฒŒ ์กฐํšŒํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, 'test/' ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์€ 'test'๋ผ๋Š” "๊ฐ€์ƒ์˜ ํด๋”" ๋‚ด์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Limit์˜ ์กด์žฌ ์ด์œ 
    • Prefix ๋ณ„ limit์ด ์กด์žฌํ•˜๋Š” ์ด์œ ๋Š”, ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ์„ ์œ„ํ•จ์ด๋‹ค.
    • ๋Œ€๊ทœ๋ชจ์˜ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ˆ˜๋ฐฑ๋งŒ์—์„œ ์ˆ˜์‹ญ์–ต ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŠน์ • Prefix๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์˜ ์ˆ˜์— ์ œํ•œ์„ ๋‘์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ•œ "๊ฐ€์ƒ์˜ ํด๋”" ์•ˆ์— ๊ทน๋„๋กœ ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์กฐํšŒ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, Prefix ๋ณ„๋กœ ์ผ์ • ์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ์ œํ•œํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ฆ‰, Prefix์™€ ๊ด€๋ จ๋œ ์ œํ•œ์€ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ๋ฐ ์‚ฌ์šฉ์„ฑ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ์„ ํƒ์ด๋‹ค!

 

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

CSV, JSON๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ปฌ๋Ÿผ๋Ÿฌ๋ฐฉ์‹์˜ ํŒŒ์ผ€์ด(Parquet), ORC ๋“ฑ์˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜์—ฌ ์ฝ๊ณ  ์“ฐ๋Š” ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 

Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)์—์„œ๋Š” ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์˜๊ตฌ์ €์žฅ์Šคํ† ์–ด๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

  • Loki: ๋กœ๊ทธ๋ฅผ ๋น„์šฉ ํšจ์œจ์ ์ธ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
  • Tempo: ์ถ”์  ๋ฐ์ดํ„ฐ(Trace Data)๋ฅผ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
  • Mimir: ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์˜ ์žฅ๊ธฐ ์ €์žฅ ๋ฐ ํ™•์žฅ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ

 

2.10 ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ 

Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)์—์„œ๋Š” ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
์‹œ์Šคํ…œ์„ ํŠœ๋‹ํ•˜๊ณ , ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์œ„ํ•ด์„œ๋Š” ๊ผญ ์•Œ์•„์•ผ ํ•  ๋ช‡๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜
  • ๋ฐ์ดํ„ฐ ๋‹ค์ค‘ํ™”
  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ (์ฟผ๋Ÿผ)
  • ์žฅ์• ๊ฐ์ง€
  • ์ผ์‹œ์  ์žฅ์•  ์ฒ˜๋ฆฌ

๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜

๋Œ€๊ทœ๋ชจ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํ•œ๋Œ€์˜ ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. 
์ผ๊ด€๋œ ํ•ด์‹œ (Consistent hash)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒํ‹ฐ์…˜ ํ•˜๋ฉด ์‹œ์Šคํ…œ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์„œ๋ฒ„์˜ ์ž๋™ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

  • ์ƒค๋”ฉ๊ณผ ํŒŒํ‹ฐ์…˜
    • ์ƒค๋”ฉ: ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์šฉ๋˜๋ฉฐ ๊ณ ์œ ํ•œ ํŒŒํ‹ฐ์…˜ํ‚ค๋ฅผ ํ†ตํ•ด ์žฌ๋ถ„๋ฐฐ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.
    • ํŒŒํ‹ฐ์…”๋‹์€ ์‹œ๊ฐ„ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ ์žฌ๋˜๋ฉฐ ์ฃผ๋กœ ๋””์Šคํฌ์— ์ ์šฉ๋œ๋‹ค.

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

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์™€ ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ํŒŒํ‹ฐ์…˜์„ ๋‚˜๋ˆ„๊ณ  ๋™์‹œ์— ๋‹ค์ˆ˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 ๐Ÿ˜ฎ‍๐Ÿ’จ ์ด๊ฒŒ ๋ฌด์Šจ์†Œ๋ฆฐ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Loki๋ฅผ ํ™•์ธํ•ด๋ดค๋‹ค.

โš ๏ธํ‹€๋ฆด์ˆ˜์žˆ์Œ์ฃผ์˜โš ๏ธ  2024.2.18 ์ดํ•ดํ•œ๋ฐ”๋กœ๋Š” ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฒƒ์œผ๋กœ ์ดํ•ดํ•จ

  • Client(Promtail)์—์„œ ๋กœํ‚ค๋กœ ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ธ๋‹ค. (Gateway๋“ฑ ์„ค๋ช…์— ํ•„์š”์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒ๋žต)
  • Distributor๋Š” ๋ฐ›์€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€๋œ ํ•ด์‹ฑ์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋Š Ingester์— ์ €์žฅ๋ ์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • Ingester๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•œ ํ›„(๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜๊ธฐ ์œ„ํ•จ), ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ๋””์Šคํฌ์— ์ €์žฅํ•œ๋‹ค.
  • Ingester๋Š” ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด์Šคํ† ๋ฆฌ์ง€์— ๋ฐ์ดํ„ฐ๋ฅผ Flush ํ•œ๋‹ค.

์ฆ‰, ์—ฌ๊ธฐ์—์„œ ๋งํ•˜๋Š” ์ƒค๋”ฉ๊ณผ ๋””์Šคํฌ ๋ ˆ๋ฒจ์˜ ํŒŒํ‹ฐ์…˜์ด ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋œ ๊ฒƒ์ด๋‹ค. Loki ๋ˆ„๊ฐ€ ๋งŒ๋“ ๊ฑด์ง€ ์ง„์งœ๋„ˆ๋ฌด๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•˜๋‹ค.๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘

 

๋ฐ์ดํ„ฐ ๋‹ค์ค‘ํ™”

๋†’์€ ๊ฐ€์šฉ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ N๊ฐœ ์„œ๋ฒ„์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋‹ค์ค‘ํ™” ํ•ด์•ผํ•œ๋‹ค.
N๊ฐœ๋Š” ์ง€์ • ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์œผ๋กœ, N๊ฐœ๋ฅผ ์„ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋˜ํ•œ ์ผ๊ด€๋œ ํ•ด์‹œ ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๊ฒฐ์ •๋œ๋‹ค.

๐Ÿ˜‹ ์ด๊ฒƒ๋„ ์ด์ „์— Loki์— ์„ค์ •ํ•œ์ ์ด ์žˆ์–ด์„œ ์„ค๋ช…์— ์ถ”๊ฐ€ํ•œ๋‹ค.

Loki์—์„œ๋Š” replication_factor ์„ค์ •์„ ํ†ตํ•ด ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์˜ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.
Distributor๊ฐ€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ช‡ ๊ฐœ์˜ Ingester์—๊ฒŒ ๋ณต์‚ฌํ•˜์—ฌ ์ €์žฅํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ์˜ค๋ฅธ์ชฝ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด (http://<loki>:3100/config) replication_factor๋ฅผ 3์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ด ์„ค์ •์— ๋”ฐ๋ผ Distributor๋Š” ๋ฐ›์€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ 3๊ฐœ์˜ ๋‹ค๋ฅธ Ingester์—๊ฒŒ ์ „์†กํ•˜์—ฌ, ๊ฐ Ingester๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ๋ณต์‚ฌ๋ณธ์„ ๋ณด๊ด€ํ•˜๋„๋กํ•œ๋‹ค. (Ingester ๊ฐ„์— ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ณต์ œ๋ณธ์œผ๋กœ ์œ ์ง€ํ• ์ง€ ์„ค์ •)

์ฆ‰ 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋ณธ์ด Ingester์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.

Q. Ingester์— 3๊ฐœ์˜ ๋ณต์ œ๋ณธ์ด ์žˆ๋”๋ผ๋„, ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์—๋Š” ํ•˜๋‚˜๋งŒ ์ €์žฅ๋˜์–ด์•ผ ํ• ํ…๋ฐ? ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜์ง€?

๋”๋ณด๊ธฐ

replication_factor๊ฐ€ 3์ผ ๋•Œ, Loki ์‹œ์Šคํ…œ์€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ 3๊ฐœ์˜ Ingester ์ธ์Šคํ„ด์Šค์— ๋ณต์ œํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.

์ด ๋ณต์ œ ๊ณผ์ •์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๋‚ด๊ตฌ์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ ์ž„์‹œ ๋””์Šคํฌ ์ €์žฅ ๋‹จ๊ณ„์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋  ๋•Œ๋Š”, ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต ์ €์žฅ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค.

  • ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋ฐฉ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์˜ˆ์‹œ
    • Quorum ๊ธฐ๋ฐ˜ ์“ฐ๊ธฐ: Loki๋Š” ๋ณต์ œ๋œ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์ฟผ๋Ÿผ(quorum)์„ ํ˜•์„ฑํ•˜๋Š” ์ผ๋ถ€๋งŒ์„ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์“ฐ๊ธฐ ์œ„ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ๋‹ค. ์ฟผ๋Ÿผ์€ ๋ณต์ œ๋ณธ ์ค‘ ๋‹ค์ˆ˜์˜ ํ•ฉ์˜(agreement)๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ๋ชจ๋“  ๋ณต์ œ๋ณธ์ด ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
    • Deduplication: Loki์˜ Ingester๋“ค์€ ์ฒญํฌ(chunk)๋ฅผ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์“ฐ๊ธฐ ์ „์— ์ฒญํฌ์˜ ๊ณ ์œ ์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ด๋ฏธ ๋™์ผํ•œ ์ฒญํฌ๊ฐ€ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์กด์žฌํ•œ๋‹ค๋ฉด, ์ค‘๋ณต ์ฒญํฌ์˜ ์ €์žฅ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ์ด ๊ณผ์ •์€ ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต ์ €์žฅ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.
    • Flush ์กฐ๊ฑด: Ingester๋Š” ํŠน์ • ์กฐ๊ฑด(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์ฒญํฌ์˜ ์‹œ๊ฐ„ ๋ฒ”์œ„, ์‹œ์Šคํ…œ์˜ ๋ถ€ํ•˜ ๋“ฑ)์— ๋”ฐ๋ผ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— Flushํ•œ๋‹ค. ์ด ๋•Œ, ์—ฌ๋Ÿฌ Ingester๊ฐ€ ๋™์ผํ•œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋”๋ผ๋„, ์ฒญํฌ์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋‚˜ ์‹œ๊ฐ„ ๋ฒ”์œ„ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋กœ์ง์ด ์ ์šฉ๋œ๋‹ค.
    • ์ •์กฑ์ˆ˜ ํ•ฉ์˜ (Quorum Consensus): ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•ฉ์˜(consensus) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด, ์–ด๋Š ๋ณต์ œ๋ณธ์ด ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋ ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. Loki ๊ตฌํ˜„์—์„œ๋Š” Ingester ๊ฐ„์— ํ•ฉ์˜๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋ ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

๊ณต์‹๋ฌธ์„œ์—๋Š” ์ด๋ ‡๊ฒŒ ๋‚˜์™€์žˆ๋‹ค. 

When a flush occurs to a persistent storage provider, the chunk is hashed based on its tenant, labels, and contents. This means that multiple ingesters with the same copy of data will not write the same data to the backing store twice, but if any write failed to one of the replicas, multiple differing chunk objects will be created in the backing store.

์ฆ‰, ์˜๊ตฌ์ €์žฅ์†Œ๋กœ flush๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ฒญํฌ๋Š” ํ…Œ๋„ŒํŠธ,๋ ˆ์ด๋ธ”,์ฝ˜ํ…์ธ ์— ๋”ฐ๋ผ ํ•ด์‹œ๋˜๊ณ  ์“ฐ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Š” ingester์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์ง€๋งŒ ํ•œ๋ฒˆ๋งŒ ์“ฐ๊ธฐ๋œ๋‹ค๋Š”๊ฒƒ๊ฐ™๋‹ค.. ๐Ÿ˜“(๋งž๋‚˜..)

replication_factor ์„ค์ •์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ตฌ์„ฑ์„ ์œ„ํ•œ ๋‚ด๋ถ€ ๋ณต์ œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ค‘๋ณต ์—†์ด ๊ด€๋ฆฌ๋œ๋‹ค.

 

๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ

์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋‹ค์ค‘ํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ์ ์ ˆํžˆ ๋™๊ธฐํ™” ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ์ •์กฑ์ˆ˜ ํ•ฉ์˜(Quorum Consensus)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ์— ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

  •  ์ •์กฑ์ˆ˜ ํ•ฉ์˜(Quorum Consensus)๋ž€, ์‹œ์Šคํ…œ ๋‚ด์˜ ์—ฌ๋Ÿฌ ๋…ธ๋“œ ์‚ฌ์ด์—์„œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋™์˜(๋˜๋Š” ํˆฌํ‘œ)์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ๋™์‹œ์— ๋™์ผํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์„ ๋•Œ, ํŠน์ • ์ž‘์—…(์˜ˆ: ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ, ์‹œ์Šคํ…œ ์„ค์ • ๋ณ€๊ฒฝ ๋“ฑ)์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ•œ๋‹ค. ์ •์กฑ์ˆ˜ ํ•ฉ์˜๋Š” ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์ด ์œ ํšจํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ผ์ • ์ˆ˜ ์ด์ƒ์˜ ๋…ธ๋“œ๊ฐ€ ๋™์˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด๋Š” ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€ ๋…ธ๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ถ„ํ• ๋กœ ์ธํ•ด ์ผ์‹œ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ๋„ ์‹œ์Šคํ…œ์ด ๊ณ„์†ํ•ด์„œ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•œ๋‹ค.
  • ์ •์กฑ์ˆ˜ ๊ฐœ๋…์€ ๋‹ค์–‘ํ•œ ํ•ฉ์˜ ํ”„๋กœํ† ์ฝœ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Paxos๋‚˜ Raft์™€ ๊ฐ™์€ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ •์กฑ์ˆ˜๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋กœํ† ์ฝœ์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ๊ณผ ๋‚ด๊ฒฐํ•จ์„ฑ(Fault Tolerance)์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

  • ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜
  • N = ๋ณต์ œ๋ณธ ๊ฐœ์ˆ˜
  • W = ์“ฐ๊ธฐ (์“ฐ๊ธฐ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ์ •์กฑ์ˆ˜, ์“ฐ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ•œ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ ค๋ฉด ์ ์–ด๋„ W๊ฐœ์˜ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์“ฐ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ–ˆ์Œ์„ ์‘๋‹ต๋ฐ›์•„์•ผ ํ•จ)
  • R = ์ฝ๊ธฐ (์ฝ๊ธฐ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ์ •์กฑ์ˆ˜, ์ฝ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ•œ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ ค๋ฉด ์ ์–ด๋„ R๊ฐœ์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ›์•„์•ผ ํ•จ)

W, R, N์˜ ๊ฐ’์„ ์ •ํ•˜๋Š” ๊ฒƒ์€ ์‘๋‹ต ์ง€์—ฐ๊ณผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์‚ฌ์ด์˜ ํƒ€ํ˜‘์ ์„ ์ฐพ๋Š” ์ „ํ˜•์ ์ธ ๊ณผ์ •์ด๋‹ค.
์‹œ์Šคํ…œ๋งˆ๋‹ค ์š”๊ตฌ๋˜๋Š” ์ผ๊ด€์„ฑ์˜ ์ˆ˜์ค€์ด ๋‹ค๋ฅด๋ฏ€๋กœ, ๊ทธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ R,W,N์ด ์กฐ์ •๋˜์–ด์•ผ ํ•œ๋‹ค.

R=1 ๋˜๋Š”, W=1 ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ, ์ค‘์žฌ์ž๋Š” ์„œ๋ฒ„ ํ•œ๋Œ€์˜ ์‘๋‹ต๋งŒ ๋ฐ›์œผ๋ฉด ๋˜๋‹ˆ ์‘๋‹ต์†๋„๋Š” ๋น ๋ฅด๋‹ค.
R,W๊ฐ€ 1๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋Š” ์‹œ์Šคํ…œ์ด ๋ณด์—ฌ์ฃผ๋Š” ์ผ๊ด€์„ฑ์˜ ์ˆ˜์ค€์€ ํ–ฅ์ƒ๋ ํ…Œ์ง€๋งŒ ์ค‘์žฌ์ž์˜ ์‘๋‹ต์†๋„๋Š” ๋Š๋ ค์ง„๋‹ค.
R+W > N ์ธ ๊ฒฝ์šฐ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
R=1, W=N์ธ ๊ฒฝ์šฐ ๋น ๋ฅธ ์ฝ๊ธฐ ์—ฐ์‚ฐ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ๋‹ค.
W=1, R=N์ธ ๊ฒฝ์šฐ ๋น ๋ฅธ ์“ฐ๊ธฐ ์—ฐ์‚ฐ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ๋‹ค.

๐Ÿคญ Loki์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ ๋ฌธ์„œ์— ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๋‚˜์™€์žˆ๋‹ค.

Replication factor

In order to mitigate the chance of losing data on any single ingester, the distributor will forward writes to a replication_factor of them. Generally, this is 3. Replication allows for ingester restarts and rollouts without failing writes and adds additional protection from data loss for some scenarios. Loosely, for each label set (called a stream) that is pushed to a distributor, it will hash the labels and use the resulting value to look up replication_factor ingesters in the ring (which is a subcomponent that exposes a distributed hash table). It will then try to write the same data to all of them. This will error if less than a quorum of writes succeed. A quorum is defined as floor(replication_factor / 2) + 1. So, for our replication_factor of 3, we require that two writes succeed. If less than two writes succeed, the distributor returns an error and the write can be retried.

Caveat: If a write is acknowledged by 2 out of 3 ingesters, we can tolerate the loss of one ingester but not two, as this would result in data loss.

Replication factor isn’t the only thing that prevents data loss, though, and arguably these days its main purpose is to allow writes to continue uninterrupted during rollouts & restarts. The ingester component now includes a write ahead log which persists incoming writes to disk to ensure they’re not lost as long as the disk isn’t corrupted. The complementary nature of replication factor and WAL ensures data isn’t lost unless there are significant failures in both mechanisms (i.e. multiple ingesters die and lose/corrupt their disks).

floor(replication_factor / 2) + 1 ์‹์œผ๋กœ ์“ฐ๊ธฐ ์ •์กฑ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ, ๊ณผ๋ฐ˜์ˆ˜์ด์ƒ์ด์–ด์•ผ ํ•˜๋Š”๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

 

์žฅ์• ๊ฐ์ง€

์žฅ์•  ๊ฐ์ง€(Failure Detection)๋ž€, ๋‚ดํŠธ์›Œํฌ ๋‚ด์˜ ๋…ธ๋“œ(์„œ๋ฒ„, ์ปดํ“จํ„ฐ ๋“ฑ)๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ์˜ ์žฅ์• ๊ฐ์ง€๋Š” ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ตฌ์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋งค์šฐ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

์˜ˆ์ „์—๋Š” multicast ๋ฅผ ์ด์šฉํ–ˆ์ง€๋งŒ ์š”์ฆ˜์€ ๊ฐ€์‹ญ(Gossip)ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

  • ๊ฐ€์‹ญ(Gossip) ํ”„๋กœํ† ์ฝœ์ด๋ž€? 
    • ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ด ํ”„๋กœํ† ์ฝœ์€ ์‚ฌํšŒ์  ๊ฐ€์‹ญ(์†Œ๋ฌธ)์ด ํผ์ง€๋Š” ๋ฐฉ์‹์„ ๋ชจ๋ฐฉํ•œ๋‹ค.
    • ๊ฐ ๋…ธ๋“œ๋Š” ์ •๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ๋น„์ •๊ธฐ์ ์œผ๋กœ ๋ช‡๋ช‡ ๋‹ค๋ฅธ ๋…ธ๋“œ์™€ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. ์ด๋•Œ ๋…ธ๋“œ์˜ ์ƒํƒœ ์ •๋ณด(์˜ˆ: ์‚ด์•„์žˆ์Œ, ์‹คํŒจํ•จ)๊ฐ€ ํฌํ•จ๋œ๋‹ค.
    • ๋…ธ๋“œ๋Š” ๋ฐ›์€ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋‹ค์Œ ๊ฐ€์‹ญ ๊ตํ™˜ ๋•Œ ์ด ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ์™€ ๊ณต์œ ํ•œ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋…ธ๋“œ๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์˜ ์žฅ์• ์ƒํƒœ์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ์‹œ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
  • ๊ฐ€์‹ญ(Gossip) ํ”„๋กœํ† ์ฝœ ์žฅ์ 
    • ํ™•์žฅ์„ฑ: ๊ฐ€์‹ญ ํ”„๋กœํ† ์ฝœ์€ ๋„คํŠธ์›Œํฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ์ž˜ ๋™์ž‘ํ•œ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ „์ฒด ๋„คํŠธ์›Œํฌ๊ฐ€ ์•„๋‹Œ ๋ช‡๋ช‡ ๋…ธ๋“œ์™€๋งŒ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ๋น„๊ต์  ์ ๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค.
    • ๋‚ด๊ฒฐํ•จ์„ฑ: ํ•˜๋‚˜ ๋˜๋Š” ์†Œ์ˆ˜์˜ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์ •๋ณด ์ „ํŒŒ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ€์‹ญ ํ”„๋กœํ† ์ฝœ์€ ๋„คํŠธ์›Œํฌ ๋ถ„ํ• (partition) ์ƒํ™ฉ์—์„œ๋„ ์ผ์ • ์ˆ˜์ค€์˜ ์ •๋ณด ์ „ํŒŒ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
    • ์ž๊ฐ€ ์น˜์œ (Self-healing): ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ์žฅ์•  ๋…ธ๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€์‹ญ(Gossip) ํ”„๋กœํ† ์ฝœ ๋‹จ์ 
    • ์ตœ์ข… ์ผ๊ด€์„ฑ(Eventual Consistency): ๊ฐ€์‹ญ ํ”„๋กœํ† ์ฝœ์€ ์ •๋ณด๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์— ๊ฑธ์ณ ์ฆ‰๊ฐ์ ์œผ๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ์‹œ์ ์— ๋™์ผํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

Loki๋„  Memberlist๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Gossip ํ”„๋กœํ† ์ฝœ) ์„ ์‚ฌ์šฉํ•œ๋‹ค. (์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ = ์žฅ์• ๊ฐ์ง€?)
์•„๋ž˜ ์บก์ณ๋Š” minikube์ผœ์„œ ์–ผ๋ฅธ ์˜ฌ๋ ค๋ณธ๊ฑฐ๋ผ Members๊ฐ€ ๋„ˆ๋ฌด ์—†๋‹ค. ๊ทธ๋ž˜๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ผ์‹œ์  ์žฅ์• ์ฒ˜๋ฆฌ

๊ฐ€์‹ญํ”„๋กœํ† ์ฝœ์€ ๋…ธ๋“œ์˜ ์ƒํƒœ์ •๋ณด๋ฅผ ์ „ํŒŒํ•˜์—ฌ ๋…ธ๋“œ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋•Œ ์–ด๋– ํ•œ ๋…ธ๋“œ์˜ ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ–ˆ๋‹ค๋ฉด, ์‹œ์Šคํ…œ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

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

Grafana ํŒจ๋ฐ€๋ฆฌ (Loki,Grafana,Tempo,Mimir)์—์„œ๋Š” ์•„๋งˆ๋„, ์ •์กฑ์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ•์ œํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด์‹œ๋ง์—์„œ ๊ฑด๊ฐ•ํ•œ ์“ฐ๊ธฐ๋…ธ๋“œ(W)์™€ ์ฝ๊ธฐ๋…ธ๋“œ(R)๋ฅผ ๊ณจ๋ผ ์ž‘์—…์„ ๊ณ„์† ์ง„ํ–‰ํ•˜๋Š”๊ฒƒ ๊ฐ™๋‹ค. (์•„๋งˆ ์ฑ…์—์„œ ๋งํ•˜๋ ค๊ณ  ํ•˜๋Š”๊ฒƒ์ด ์ด ๋ถ€๋ถ„์ธ๊ฒƒ ๊ฐ™๋‹ค)

 

2.11 ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ง‘๊ณ„

์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋Š” ์˜ค๋ž˜๋œ ๊ณผ๊ฑฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜, ์ •ํ™•ํ•œ ์‹œ/๋ถ„/์ดˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ–ˆ์„๋•Œ, ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค๋‚˜ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธํ•ด ์ข…์ข… ํ’€์Šค์บ”(full-scan)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ’€์Šค์บ”(full-scan)์ด๋ž€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€, ๋˜๋Š” ๊ธฐํƒ€ ์ €์žฅ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ, ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์ด๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜์—ฌ ์ €์žฅ๋œ ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
์ด๋Š”, ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ €ํ•˜, ๋น„์šฉ ์ฆ๊ฐ€, ์ž์› ๊ณผ์†Œ๋น„๋ฅผ ์•ผ๊ธฐ์‹œํ‚จ๋‹ค. 

  • ํ’€ ์Šค์บ”(full-scan) ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•
    • ์ ์ ˆํ•œ ์ธ๋ฑ์‹ฑ: ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ์ธ๋ฑ์‹ฑํ•˜๋Š”๊ฒŒ ์ข‹์„๊ฒƒ๊ฐ™๋‹ค.
    • ์ฟผ๋ฆฌ์ตœ์ ํ™”
    • ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…”๋‹
    • ์บ์‹ฑ

์ด ์ฑ…์—์„œ๋Š” ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜์˜ ์—ด ์ง€ํ–ฅ ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.
ํ’€์Šค์บ”์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ์•Œ๋งž์€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๋Š” ์ด์•ผ๊ธฐ ์ธ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
ํŠนํžˆ ์žฅ๊ธฐ์ ์ธ ๋ถ„์„(๋ฐ์ดํ„ฐ ๋ถ„์„ ํ•„๋“œ์—์„œ๋„ ์—ด ์ง€ํ–ฅ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๋ณด๋ฉด)์—์„œ๋Š” ์ง‘๊ณ„ ํšจ์œจ์ด ๋” ์ข‹์€ ์—ด์ง€ํ–ฅ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋„๋ฆฌ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์—ด ์ง€ํ–ฅ ์Šคํ† ๋ฆฌ์ง€(Column-oriented storage)
    • ๋ฐ์ดํ„ฐ๋ฅผ ์—ด ๋‹จ์œ„๋กœ ์ €์žฅํ•˜์—ฌ, ํŠน์ • ์—ด์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์ด๋‚˜ ์งˆ์˜(query)๋ฅผ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
      ํŠนํžˆ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ž‘์—…๊ณผ ๊ฐ™์ด ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์—์„œ ํŠน์ • ์—ด์— ๋Œ€ํ•œ ์—ฐ์‚ฐ ํŠน์ด ์ฝ๊ธฐ ์ฟผ๋ฆฌ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ๋‹ค.
    • ์ปฌ๋Ÿผ ๋‹จ์œ„์˜ ํ†ต๊ณ„์ •๋ณด์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ฝ๊ธฐ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์˜ ํ•ต์‹ฌ์ด๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: Apache Cassandra, Apache HBase, Google Bigtable, Redshift
    • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: Apache Parquet, Apache ORC (Optimized Row Columnar).  
    • ์ปฌ๋Ÿผ๋‹จ์œ„์˜ ํ†ต๊ณ„์ •๋ณด (์ด๊ฒŒ ํ•ต์‹ฌ์ธ๊ฑฐ๊ฐ™์Œ)
      • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ํ†ต๊ณ„ ์ •๋ณด(์˜ˆ: ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’, ํ•ฉ, ํ‰๊ท , ๋ฐ์ดํ„ฐ ๋ถ„ํฌ ๋“ฑ)๋ฅผ ์ €์žฅํ•œ๋‹ค.
      • ์ด๋ฅผํ†ตํ•ด ์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์กฐ๊ฑด์ ˆ ํ‘ธ์‹œ๋‹ค์šด(push-down)
      • ์ฟผ๋ฆฌ ์กฐ๊ฑด์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฐ์ดํ„ฐ์— ๊ฐ€๊นŒ์šด ๊ณณ์œผ๋กœ "๋‚ด๋ ค๋ณด๋‚ด๋Š”" ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ์ˆ ์ด๋‹ค.
      • ์กฐ๊ฑด์ ˆ ํ‘ธ์‹œ๋‹ค์šด์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ CPU๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ „์— ์ ์šฉ๋œ๋‹ค.

Q. ์กฐ๊ฑด์ ˆ ํ‘ธ์‹œ๋‹ค์šด(push-down)์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์ดํ•ดํ•ด๋ณด์ž.

๋”๋ณด๊ธฐ

[์กฐ๊ฑด์ ˆ ํ‘ธ์‹œ๋‹ค์šด ์ดํ•ดํ•˜๊ธฐ]
๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ customers ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ , ํŠน์ • ๋„์‹œ(city)์— ์‚ฌ๋Š” ๊ณ ๊ฐ๋“ค์˜ ์ด๋ฆ„(name)์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
-----------------------------------------------------------
SELECT name 
FROM customers 
WHERE city = 'Seoul';

-----------------------------------------------------------

์กฐ๊ฑด์ ˆ ํ‘ธ์‹œ๋‹ค์šด์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ์ฟผ๋ฆฌ ๊ณผ์ •

  1. customers ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•œ๋‹ค.
  2. ๊ฐ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด city = 'Seoul' ์กฐ๊ฑด์„ ํ‰๊ฐ€ํ•œ๋‹ค.
  3. ์กฐ๊ฑด์— ๋งž๋Š” ๋ ˆ์ฝ”๋“œ์—์„œ name ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.

์กฐ๊ฑด์ ˆ ํ‘ธ์‹œ๋‹ค์šด์ด ์ ์šฉ ๋œ ๊ฒฝ์šฐ์˜ ์ฟผ๋ฆฌ ๊ณผ์ •

  1. city ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ city = 'Seoul' ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ๋น ๋ฅด๊ฒŒ ์‹๋ณ„ํ•œ๋‹ค.
  2. ์ด ๋‹จ๊ณ„์—์„œ, city ์ปฌ๋Ÿผ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋งŒ ์„ ํƒ์ ์œผ๋กœ ์•ก์„ธ์Šค ํ•œ๋‹ค.
  3. ์กฐ๊ฑด์— ๋งž๋Š” ๋ ˆ์ฝ”๋“œ์—์„œ name ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.

์ปฌ๋Ÿผ๋‹จ์œ„์˜ ํ†ต๊ณ„์ •๋ณด์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด ์ฝ๊ธฐ ์ฟผ๋ฆฌ์— ํ™œ์šฉ๋œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ ๊ฑด๋„ˆ๋›ฐ๊ธฐ: ์ฟผ๋ฆฌ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฐ’์˜ ๋ฒ”์œ„์™€ ๋งค์น˜๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ(์˜ˆ: ํŠน์ • ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)๋Š” ์Šค์บ” ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "๋‚ ์งœ" ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ํŠน์ • ๊ธฐ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ธฐ๊ฐ„ ์™ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์Šค์บ”ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋น ๋ฅธ ํ•„ํ„ฐ๋ง: ์ปฌ๋Ÿผ์˜ ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฑธ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋˜ํ•œ ์‹œ๊ณ„์—ด ํ…Œ์ด๋ธ”(Time-Series Table)์— ๋Œ€ํ•ด์„œ๋„ ์–ธ๊ธ‰ํ•œ๋‹ค.
์•„๋งˆ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์žˆ์–ด์„œ ์‹œ๊ณ„์—ด ํ…Œ์ด๋ธ”์„ ์–ธ๊ธ‰ํ–ˆ๋‚˜๋ณด๋‹ค.

  • ์‹œ๊ณ„์—ด ํ…Œ์ด๋ธ”(Time-Series Table)
    • ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋‹ค.
    • ๊ฐ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋Š” ํŠน์ • ์‹œ๊ฐ„์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋‚˜ ์ธก์ •๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์‹œ๊ฐ„์„ ์ฃผ์š” ์ฐจ์›์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋Š” ์—ฐ์†์ ์ด๋ฉฐ, ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.
    • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•
      • ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ: ๋ฐ์ดํ„ฐ๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ธ๋ฑ์‹ฑ๋˜๊ณ  ์ •๋ ฌ๋œ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„ ๋ฒ”์œ„ ์ฟผ๋ฆฌ์™€ ์ˆœ์ฐจ์  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค.
      • ๋†’์€ ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰: ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐœ์ƒํ•œ๋‹ค. ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋Ÿฐ ํŠน์„ฑ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋†’์€ ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ง€์›ํ•œ๋‹ค.
      • ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์งˆ์˜ ์ตœ์ ํ™”: ์‹œ๊ฐ„ ๋ฒ”์œ„ ์„ ํƒ, ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„, ์‹œ๊ณ„์—ด ํŒจํ„ด ํƒ์ƒ‰ ๋“ฑ์˜ ์ž‘์—…์ด ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ ์••์ถ•๊ณผ ๋ณด์กด ์ •์ฑ…: ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์••์ถ•๊ณผ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณด์กด ์ •์ฑ…(์ž๋™ ์‚ญ์ œ, ๋‹ค์šด์ƒ˜ํ”Œ๋ง ๋“ฑ)์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ์‹œ๊ณ„์—ด ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/์‹œ์Šคํ…œ
      • Prometheus
      • TimescaleDB
      • InfluxDB
      • OpenTSDB