HAProxy Configuration

2022. 7. 11. 21:56ใ†๐ŸŽฏ OpenSource/HAproxy

Intro

HAproxy ์„ค์ • ๋ฐ ๋™์ž‘ ๋ฐฉ์‹์„ ์•Œ์•„๋ณธ๋‹ค.
HAProxy๋Š” TCP/HTTP ํŠธ๋ž˜ํ”ฝ์„ ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค.

๋‚˜๋Š” ์˜คํ”ˆ์Šคํƒ HA ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ vip ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋“ค๋กœ ๋ถ„์‚ฐํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด HAProxy๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
ํ•œ๋ฒˆ์€ ์˜คํ”ˆ์Šคํƒ์˜ ๊ฐ ์œ ์ €๊ฐ€ mariadb์˜ DB์— ์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” connection aborted ์—๋Ÿฌ๊ฐ€ mysql.err์— ๋ฐœ์ƒํ–ˆ๋‹ค.

root@wglee-controller-001:/var/log/mysql# tail -f error.log
2022-07-05 22:09:34 30861 [Warning] Aborted connection 30861 to db: 'placement' user: 'placement' host: 'wglee-controller-001' (Got an error reading communication packets)
2022-07-05 22:10:07 30862 [Warning] Aborted connection 30862 to db: 'neutron' user: 'neutron' host: 'wglee-controller-001' (Got an error reading communication packets)
2022-07-05 22:11:09 30863 [Warning] Aborted connection 30863 to db: 'neutron' user: 'neutron' host: 'wglee-controller-001' (Got an error reading communication packets)
2022-07-05 22:12:10 30864 [Warning] Aborted connection 30864 to db: 'keystone' user: 'keystone' host: 'wglee-controller-001' (Got an error reading communication packets)

๋„๋Œ€์ฒด ๋ญ”๊ฐ€ ํ•˜๋ฉด์„œ mariadb์˜ timout ์ˆ˜์น˜๋งŒ ์—ด์‹ฌํžˆ ํŠœ๋‹ํ–ˆ๋Š”๋ฐ
๊ฒฐ๊ตญ haproxy์—์„œ vip๋กœ ๋ฐ›์€ ์š”์ฒญ์„ backend server๋กœ ๋„˜๊ธธ ๋•Œ์˜ ํƒ€์ž„์•„์›ƒ์— ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด ์ด์Šˆ๋กœ ๋ณด์˜€๋‹ค.^^...

๊ทธ ํ›„๋กœ HAProxy์˜ ์„ค์ • ํŒŒ์ผ ๊ตฌ์„ฑ์™€ ์˜ต์…˜์„ ์ž˜ ์•Œ์•„์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

 

HAProxy Configuration

Haproxy ์„ค์ • ํŒŒ์ผ์€ ํฌ๊ฒŒ ๋‹ค์Œ ์„น์…˜๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

global
    # global settings here

defaults
    # defaults here

frontend
    # a frontend that accepts requests from clients

backend

    # servers that fulfill the requests

 

1. global

ํ”„๋กœ์„ธ์Šค ์ „๋ฐ˜์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๋ณด์•ˆ/์„ฑ๋Šฅ ํŠœ๋‹ ์„ค์ •

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

maxconn : HAProxy๊ฐ€ ๋ฐ›์•„๋“ค์ผ ์ปค๋„ฅ์…˜์˜ ์ตœ๋Œ€์น˜. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
log : ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค. local0์œผ๋กœ ์„ค์ •ํ•ด์„œ syslog ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
user / group : ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด haproxy๋Š” root ๊ถŒํ•œ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ์ง€์ •ํ•˜๋„๋ก ํ•œ๋‹ค.

 

2. defaults

์„ค์ • ํŒŒ์ผ์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
default ์„ธํŒ…์€ frontend์™€ backend ์„น์…˜์— ์ ์šฉ๋œ๋‹ค. (frontend, backend ์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋„ ๊ฐ€๋Šฅ)

defaults
    timeout connect 10s
    timeout client 30s
    timeout server 30s
    log global
    mode http
    option httplog
    maxconn 3000

timeout [ํ•ญ๋ชฉ] : ๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ timout ์„ ์„ค์ •ํ•œ๋‹ค. "s" ๋ฅผ ๋ช…์‹œํ•˜๋ฉด ์ดˆ๋‹จ์œ„ ์„ค์ •์„ ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์•„๋ฌด๊ฒƒ๋„ ๋ถ™์ด์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ milliseconds ๋กœ ์„ค์ •๋œ๋‹ค.
timeout connect : HAProxy๊ฐ€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— TCP ์—ฐ๊ฒฐ์ด established ๋ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„
timeout client : client ↔ haproxy frontend ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์ด๋‹ค. ์ด ์˜ต์…˜์€ TCP ์ฒดํฌ์— ํ•œํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
timeout server : haproxy backend์—์„œ server ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋Œ€๊ธฐํ•˜๋Š” ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„์ด๋‹ค.
mode : HAProxy๊ฐ€ ์–ด๋–ค protocol์— ๋Œ€ํ•ด Proxyํ• ์ง€๋ฅผ ์ •์˜. TCP / HTTP
log global : frontend ์—์„œ global ์„น์…˜์—
maxconn : ๊ฐ frontend์—์„œ ์ˆ˜์šฉํ•  ์ปค๋„ฅ์…˜

 

3. frontend

client๊ฐ€ connectํ•  ip์™€ port ๋“ฑ์˜ ์„ค์ •ํ•œ๋‹ค.

frontend wglee-openstack-vip
bind 20.20.0.5:80 ssl crt /etc/wglee.pem
mode            http
option          httpclose
option          forwardfor
option          accept-invalid-http-request
reqadd          X-Forwarded-Proto:\ https
default_backend object_storage

bind : ๋ฐ”์ธ๋”ฉํ•˜์—ฌ listenํ•  ์•„์ดํ”ผ์™€ ํฌํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
ssl, crt ์˜ต์…˜ : HAProxy๊ฐ€ SSL/TLS ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋„๋ก ํ•œ๋‹ค.
use_backend, default_backend : ํ•ด๋‹น frontend ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด๋‹ฌ๋ผ๊ณ  ๋ณด๋‚ผ backend.
   (์šฐ์„ ์ˆœ์œ„ : use_backend -> (use_backend๊ฐ€ ์‹คํŒจํ•˜๋ฉด) default_backend)

 

4. backend

์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  backend ์„œ๋ฒ„์˜ ๊ทธ๋ฃน
ํ•˜์œ„ real server ์ •๋ณด์™€ ๊ฐ ์˜ต์…˜์„ ๋„ฃ๋Š”๋‹ค.

backend web_servers
    balance roundrobin
    cookie SERVERUSED insert indirect nocache
    option httpchk HEAD /
    default-server check maxconn 20
    server server1 10.0.1.3:80 cookie server1
    server server2 10.0.1.4:80 cookie server2

balance : ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•œ๋‹ค. (roundrobin, leastconn)
option httpchk : HAProxy๊ฐ€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ๋Œ€ํ•ด Layer 7 ํ—ฌ์Šค ์ฒดํฌ๋ฅผ ํ•˜๋„๋ก ํ•œ๋‹ค. ์‘๋‹ต์ด ์—†๋Š” ์„œ๋ฒ„์—๋Š” ์š”์ฒญ ํฌ์›Œ๋”ฉํ•˜์ง€ ์•Š์Œ.
default-server : ์ดํ›„์— ๋”ฐ๋ผ์˜ค๋Š” server ๋“ค์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ๋””ํดํŠธ ์„ธํŒ…
-> inter : health check ์˜ interval์„ ์˜๋ฏธํ•œ๋‹ค.
-> rise : backend server๊ฐ€ ๋™์ž‘ ์ค‘์ด๋ผ๊ณ  ์—ฌ๊ธฐ๊ธฐ ์œ„ํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” health check์˜ ํšŸ์ˆ˜ ( ๊ธฐ๋ณธ์€ 2 )
-> fall : backend server๊ฐ€ ์ฃฝ์—ˆ๋‹ค๊ณ  ์—ฌ๊ธฐ๊ธฐ ์œ„ํ•ด ์‹คํŒจํ•ด์•ผ ํ•˜๋Š” health check์˜ ํšŸ์ˆ˜. ( ๊ธฐ๋ณธ์€ 3 )
-> check : backend server์— ๋Œ€ํ•ด health check๋ฅผ ํ™œ์„ฑํ™” ํ•œ๋‹ค.
server : ๋ฒก์—”๋“œ๋กœ ์‚ฌ์šฉํ•  ์„œ๋ฒ„ ๋“ฑ๋ก

 

5. listen

listen์„ ์‚ฌ์šฉํ•˜๋ฉด frontend์™€ backend ์˜ ๊ธฐ๋Šฅ์„ ํ•œ๋ฒˆ์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋จ

listen mariadb
  bind wglee-openstack-vip:3306
  mode tcp
  balance leastconn
  timeout client  10800s
  timeout server  10800s
  default-server port 9200 inter 2s downinter 5s rise 3 fall 2 slowstart 60s
  server wglee-controller-001 20.20.0.20:3306 check
  server wglee-controller-002 20.20.0.21:3306 check backup
  server wglee-controller-003 20.20.0.22:3306 check backup

์œ„์—์„œ mariadb ์— connection aborted๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์œ„์™€ ๊ฐ™์ด timout client, timeout server๋ฅผ ๋Š˜๋ ค์ฃผ๊ณ  ๋‚˜์„œ ํ•ด๊ฒฐ ๋˜์—ˆ๋‹ค.
port : port ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด health check ์šฉ์œผ๋กœ ๋‹ค๋ฅธ port๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋•Œ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋Š” ํฌํŠธ๋ณด๋‹ค ๋‹ค๋ฅธ port ๋ฅผ ์‚ฌ์šฉํ•ด์„œ health check๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ mariadb๋Š” 3306์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ health check๋ฅผ 3306 ํฌํŠธ๋กœ ํ•˜๋Š” ๊ฒƒ์€ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ( curl ํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” HTTP_CODE๊ฐ€ ์—†์Œ ) ๊ทธ๋ž˜์„œ ๋Œ€์•ˆ์œผ๋กœ clustercheck๊ฐ€ xinetd๋กœ ๋™์ž‘ํ•˜๋Š” 9200 ๋ฅผ ์ฒดํฌํ•œ๋‹ค. 

root@wglee-controller-001:~# curl -o /dev/null -s -w %{http_code} 20.20.0.20:9200 ; echo
200
root@wglee-controller-001:~# curl -o /dev/null -s -w %{http_code} 20.20.0.20:3306 ; echo
000

๋‚ด haproxy ์„ค์ • ๊ธฐ์ค€์œผ๋กœ frontend / backend / listen ์— ์ ์šฉ๋œ ์˜ต์…˜์„ ๊ฐ๊ฐ ์„ค๋ช…ํ•˜๋‹ค ๋ณด๋‹ˆ๊นŒ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜๋„ ์—ฌ๊ธฐ์ €๊ธฐ ์ ์–ด๋ฒ„๋ ธ๋‹ค.
์ƒํ™ฉ์— ๋งž๊ฒŒ ํ™•์ธํ•ด์„œ ์ž˜ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค.

 

์ฐธ๊ณ ๋งํฌ

http://docs.haproxy.org/2.6/configuration.html#5.2-port