3 min read

๋งž์œผ๋ฉด์„œ ๋ฐฐ์šฐ๋Š” HAProxy

Table of Contents

HAProxy

Image: HAProxy Logo from Wikimedia Commons, CC BY-SA 4.0

์ธํ”„๋ผ ํŒ€์˜ ๊ฐ€์žฅ ํฐ ๋ชฉํ‘œ๋Š” ์„œ๋น„์Šค์˜ ์žฅ์• ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฌผ๋ก  ๊ธฐ์ˆ ์„ ๊ณ ๋„ํ™”ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๋‹น์žฅ ๋†“์ธ ํ™˜๊ฒฝ์—์„œ ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ œ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋น„์ค‘ ์žˆ๊ฒŒ ์ฐธ์—ฌํ•˜๊ฒŒ ๋œ ์—…๋ฌด๊ฐ€ HAProxy ๋„์ž…์ด์—ˆ์Šต๋‹ˆ๋‹ค.

HAProxy๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์€ ์—†์—ˆ๊ณ  ์ด์ œ ๋ง‰ ํšŒ์‚ฌ์— ์ ์‘ ์ค‘์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์„ ๋Œ์•„๋ณด๊ณ  ์ •๋ฆฌํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์™œ HAProxy๋ฅผ ์‚ฌ์šฉํ–ˆ๋‚˜์š”?

ํ˜„์žฌ ํšŒ์‚ฌ์—์„œ๋Š” Docker Compose๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฉด ์•ž์— NGINX๊ฐ€ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

Old flow

ํ•˜์ง€๋งŒ ํฐ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ์—ˆ๋Š”๋ฐ, NGINX๋Š” ์ตœ์ดˆ ์‹œ์ž‘ ๋˜๋Š” ์žฌ์‹œ์ž‘ ๋•Œ๋งŒ ๋„๋ฉ”์ธ์˜ IP๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ด๋„ IP ๋™๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ , ๋”ฐ๋ผ์„œ ๋ฐฐํฌ ๋•Œ๋งˆ๋‹ค ์ˆœ๋‹จ์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

New flow

๋„์ž…ํ•˜๋ฉฐ ๊ฒช์€ ๋ฌธ์ œ๋“ค

HAProxy๋ฅผ ์ค‘๊ฐ„์— ๋†“๋Š” ๊ฒƒ ์ž์ฒด๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
NGINX์—์„œ ์š”์ฒญ์„ ๋ฐ›์•„ ์›น ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌํ•˜๋„๋ก ์„ค์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ํŒŒ์ผ๋งŒ ๋ฎ์–ด์”Œ์›Œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์„ค์ • ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋ฉด ์ˆ˜์ •ํ•  ๋ถ€๋ถ„์ด ๋งŽ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์„ค์ • ๊ณผ์ •์—์„œ ์‹ ๊ฒฝ ์“ธ ๋ถ€๋ถ„์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์„ค์ •ํ–ˆ๋˜ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Resolvers
    Docker Compose ํ™˜๊ฒฝ์—์„œ DNS ๋งคํ•‘์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด /etc/resolv.conf ํŒŒ์ผ์— ์ •์˜๋œ ๋„ค์ž„์„œ๋ฒ„๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    # ...
    
    resolvers custom-dns
        parse-resolv-conf
    
    # ...
  2. Timeout
    ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ ์•Œ๋งž์€ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    HAProxy์—์„œ๋งŒ ์„ค์ •์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  3. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐฉ๋ฒ•
    ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ €ํฌ๋Š” ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— roundrobin์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  4. ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ
    HAProxy๋ฅผ ๋„์ž…ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅํ•œ URL์„ ์„ค์ •ํ•˜๊ณ , ์ฃผ๊ธฐ์™€ ์žฌ์—ฐ๊ฒฐ โ—ฆ ์—ฐ๊ฒฐ ํ•ด์ œ ์กฐ๊ฑด๋„ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ ์™ธ

  • HAProxy์—๋Š” ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์žˆ๊ณ , ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ด€๋ จ ๊ธฐ๋Šฅ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    Datadog์ด๋‚˜ Grafana ๋“ฑ๊ณผ ์—ฐ๋™๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๊ฒƒ์ด HAProxy๋ฅผ ๋„์ž…ํ•œ ์ด์œ ๋Š” ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋งŒ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์„ค์ • ํŒŒ์ผ์„ ๋งˆ์šดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, Graceful reload ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋งํฌ)
  • ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋”ฐ๋กœ ์ œํ•œ์„ ๋‘์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ ์ฃผ์— ์ž‘์—…์ด ๋งˆ๋ฌด๋ฆฌ๋˜์—ˆ๊ณ , ์‹ค์ œ๋กœ ๋™์  DNS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ์ด ๊ณผ์ •์—์„œ ์ฑ™๊ธฐ์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด ์žˆ์–ด ์žฅ์•  ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ–ˆ๊ณ , ์ €๋„ ํ…Œ์ŠคํŠธ ๊ณผ์ •์—์„œ ๋ฏธ์ˆ™ํ•œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ํฐ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ ๊ฒƒ์ž„์„ ๊ณ ๋ คํ•ด๋„ ์•„์‰ฌ์šด ์ ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

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