2017년 2월 16일 목요일

HAproxy HA 구성


HA 구성을 봐야해서 남겨둔다.

물론인터넷에서 가져옴. 문제될까봐 출처도 남겨놓는다.

https://blog.logentries.com/2014/12/keepalived-and-haproxy-in-aws-an-exploratory-guide/

HAproxy는 고가용성 프록시를 의미합니다. 
이름에서도 알 수 있다시피 High Availability proxy 입니다
C 언어로 작성되었으며 무료 오픈소스 프로그램입니다. 
HAproxy는 TCP / HTTP 로드 밸런서로 프록시 솔루션에 사용됩니다. 
HAproxy의 일반적인 용도는 웹서버, DB 서버 등 부하를 분산시키는 용도로 많이 사용되고 있습니다.
BSD, 리눅스, 솔라리스 등에서 사용할 수 있으며, 물론 윈도우는 안됩니다. (-0-;)
(여담이지만, 윈도우는 뭐 다 돈이네요 ;;;)

**********************************************************************************************************
* 환경
OS : Ubuntu 16.04.1 LTS
HAproxy : 1.6.7
WebServer : Apache/2.4.18 (Ubuntu)
VM : VirtualBox 5.1.2

* 참고
sudo 로 진행하지 않고 root 로 진행합니다.
**********************************************************************************************************
* 준비사항
VM 환경에서 진행되며, 로드밸런서이기 때문에
HAproxy 를 설치할 VM 하나, 웹서버 VM 2개를 먼저 준비합니다.
VM 을 만드는 부분은 여기서 설명하지 않습니다.
VM 의 상세 내역은 아래와 같습니다.

VM
OS
IP
Hostname
HAproxy
Ubuntu 16.04.1 LTS 64bit
172.16.1.5
HAproxy
 Webserver01
Ubuntu 16.04.1 LTS 64bit
172.16.1.15
webserver-01
Webserver02
Ubuntu 16.04.1 LTS 64bit
172.16.1.16
webserver-02

**********************************************************************************************************

1. Apache 설치
# apt-get install apache2 
  - 모든 VM 에 apache 를 모두 설치합니다.

2. HAproxy 저장소 등록 및 업데이트
# apt-add-repository ppa:vbernat/haproxy-1.6
# apt-get update

3. HAproxy 설치
# apt-get install haproxy

4. haproxy.cfg 수정
# vi /etc/haproxy/haproxy.cfg

global
        #log /dev/log   local0
        #log /dev/log   local1 notice
        log 127.0.0.1 local2
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon
 . . .

위처럼 log 를 주석처리 해주고 log 127.0.0.1 local2 를 입력해 줍니다.

5. rsyslog.conf 파일 수정
# vi /etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514 

파일에 위 부분이 주석처리 되어 있다면 주석을 풀어주시고 없다면 입력해 줍니다.

6. haproxy.conf 파일 생성하고 내용 추가
# vi /etc/rsyslog.d/haproxy.conf

local2.*        /var/log/haproxy.log

7. rsyslog 서비스 재시작
# service rsyslog restart

8. haproxy.cfg 수정
# vi /etc/haproxy/haproxy.cfg

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option  http-server-close
        option  forwardfor except 127.0.0.0/8
        option  redispatch
        retries 3
        timeout http-request    20
        timeout queue            86400
        timeout connect          86400
        timeout client             86400
        timeout server             86400
        timeout http-keep-alive 30
        timeout check             20
        maxconn                    50000 

frontend LB
        bind 172.16.1.5:80
        reqadd X-Forwarded-Proto:\ http
        default_backend bkLB

backend bkLB
        mode http
        stats enable
        stats hide-version
        stats uri /stats
        stats realm Haproxy\ Statistics
        stats auth haproxy:admin
        balance roundrobin
        option httpchk
        option httpclose
        option forwardfor
        cookie LB insert
        server webserver-01 172.16.1.15:80 cookie webserver-01 check
        server webserver-02 172.16.1.16:80 cookie webserver-02 check


10. HAproxy 재시작
# service haproxy restart

11. 시스템 시작시 자동으로 시작하기 위해 파일 수정
# vi /etc/default/haproxy

ENABLED=1 


12. 정상적으로 동작하는지 확인하기 위해 웹서버 index.html 를 수정
- webserver-01 에서
# mv /var/www/html/index.html /var/www/html/index.html.backup
# vi /var/www/html/index.html
webserver-01 

- webserver-02 에서
# mv /var/www/html/index.html /var/www/html/index.html.backup
# vi /var/www/html/index.html
webserver-02

13. 로드밸런싱이 되는지 확인
# curl 172.16.1.5
webserver-01
# curl 172.16.1.5
webserver-02
# curl 172.16.1.5
webserver-01
# curl 172.16.1.5
webserver-02

위 처럼 roundrobin 형식으로 정상적으로 나오는지 확인

14. HAproxy 통계 페이지 확인
- 웹브라우저에서 172.16.1.5/stats 를 입력
  로그인 화면에서 haproxy / admin 으로 로그인





* 참고
hosts 파일 수정

127.0.0.1       localhost
127.0.1.1       HAproxy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouter

172.16.1.15  webserver-01
172.16.1.16  webserver-02 


출처: http://livegs.tistory.com/43 [if (feel)]

실제 현업에선 HAproxy 한대로 구성하는 경우는 거의 없습니다.
만약 HAproxy 가 장애를 일으켜 죽는 경우가 발생하면
그 밑에 있는 웹서버들은 다 죽는 거나 마찬가지기 때문에 리스크가 너무 큽니다.
그래서, 이번엔 HAproxy 를 Active - Standby 형식으로 LB Cluster 를 구성해 보겠습니다.
HAproxy 를 HA 구성으로 만들기 위해 keepalived 를 이용하여 구성합니다.
**********************************************************************************************************
* Keepalived 란?
Keepalived 는 C 언어로 작성되었으며 부하 분산 및 고가용성을 위한 라우팅 소프트웨어입니다.
VRRP (Virtual Router Redundancy Protocol) 프로토콜을 사용합니다.
VRRP 관련하여 알고 싶으시면 여기 를 확인해 보시기 바랍니다.

**********************************************************************************************************
* 환경
OS : Ubuntu 16.04.1 LTS
HAproxy : 1.6.7
Keepalived : 1.2.19

* 참고
sudo 로 진행하지 않고 root 로 진행합니다.
**********************************************************************************************************
* 준비사항

VM
OS
IP
Hostname
HAproxy
Ubuntu 16.04.1 LTS 64bit
172.16.1.5
HAproxy
HAproxy2
Ubuntu 16.04.1 LTS 64bit
172.16.1.6
HAproxyB
 Webserver01
Ubuntu 16.04.1 LTS 64bit
172.16.1.15
webserver-01
Webserver02
Ubuntu 16.04.1 LTS 64bit
172.16.1.16
webserver-02

HAproxy 에서 설치했던 것과 같이 똑같이 HAproxyB 에도 설치합니다.
설치하는 방법은 이전 포스팅 http://livegs.tistory.com/43 을 참고해주세요.

**********************************************************************************************************

1. HAproxy 가 설치된 서버의 커널 값을 수정합니다. (두 대 모두 수행)
# vi /etc/sysctl.conf
 net.ipv4.ip_nonlocal_bind=1

위 부분이 중요한 부분인데, 위 옵션이 뭔지 찾아보면
로컬 IP 가 아닌 주소에 bind() 할 수 있게 해줍니다. 라고 되어 있는데요. 말이 어려운데요.
다시 말해서 현재 가지고 있는 IP 가 아닌 다른 외부 IP 를 NIC 에 바인딩 할 수 있게 해준다는 뜻입니다.
이게 왜 중요하냐면 서비스인 VIP 를 첫번째 서버가 가지고 있다가 장애가 나는 경우
Standby 서버로 그 VIP 를 옮겨야 서비스가 끊기지 않고 돌아갈 수 있기 때문이죠.
저 옵션이 되어 있지 않은 경우 VIP 를 바인딩 할 수 없기 때문에 꼭 수정해줘야 합니다.

2. 커널 값 적용 및 확인 (두 대 모두 수행)
# sysctl -p
# cat /proc/sys/net/ipv4/ip_nonlocal_bind 

위 처럼 1이 나오면 정상적으로 적용됨.
안되는 경우 reboot


3. Keepalived 설치 (두 대 모두 수행)
# apt-get install keepalived

4. keepalived.conf 파일 수정
# vi /etc/keepalived/keepalived.conf

- 첫번째 서버
global_defs {
        router_id HAproxy
}

# Define the script used to check if haproxy is still working
vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 2
        weight 2
}

# Configuration for the virtual interface
vrrp_instance VIS_1 {

        interface              enp0s3
        state                   MASTER
        priority                101
        virtual_router_id     51
        advert_int             1

        # The virtual ip address shared between the two loadbalancers
        virtual_ipaddress {
                172.16.1.5
        }

        # Use the script above to check if we should fail over
        track_script {
                chk_haproxy
        }
}

- 두번째 서버
global_defs {
        router_id HAproxyB
}

# Define the script used to check if haproxy is still working
vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 2
        weight 2
}

# Configuration for the virtual interface
vrrp_instance VIS_1 {

        interface              enp0s3
        state                   MASTER
        priority                100
        virtual_router_id     51
        advert_int             1

        # The virtual ip address shared between the two loadbalancers
        virtual_ipaddress {
                172.16.1.5
        }

        # Use the script above to check if we should fail over
        track_script {
                chk_haproxy
        }
}


위 처럼 인스턴스 (vrrp_instance VIS_1) 이름은 동일하게 하며 priority 값은 다르게 하여
Master 가 내려 갔다 다시 올라오는 경우에 원래대로 Master 에서 VIP 를 가져갈 수 있게 합니다.
위 설정 값은 기본 적은 설정으로 자세한 옵션은 상황에 맞게 진행하면 됩니다.
더 자세한 내용을 알고 싶으면 여기 를 참고해 주세요.

5. keepalived 와 HAproxy 서비스 재시작 (두 대 모두 수행)
# service keepalived restart
# service haproxy restart

6. IP 할당 확인
# ip addr show
위 명령어로 확인해보면 첫번째 서버의 NIC 에 VIP가 추가로 할당되어 있는 것을 확인할 수 있다.

7. FailOver 확인
두 대의 서버가 아닌 서버에서 (같은 네트워크에 있는...) ping 으로 확인해 봅니다.

# ping 172.16.1.5

수행 후 첫번 째 서버를 halt 내지는 poweroff 를 해봅니다.

...

64 bytes from 192.168.25.203: icmp_seq=221 ttl=64 time=0.291 ms
64 bytes from 192.168.25.203: icmp_seq=222 ttl=64 time=0.297 ms
64 bytes from 192.168.25.203: icmp_seq=223 ttl=64 time=0.242 ms
64 bytes from 192.168.25.203: icmp_seq=224 ttl=64 time=0.286 ms
64 bytes from 192.168.25.203: icmp_seq=225 ttl=64 time=0.151 ms
64 bytes from 192.168.25.203: icmp_seq=226 ttl=64 time=0.270 ms 

...


위 처럼 ping 이 가다가 잠시 순단 현상이 발생할 수 있으나 계속 ping 이 나간다면
정상적으로 failover 됨을 알 수 있습니다.
실제 두번째 서버에 가서 
# ip addr show 를 해보면 VIP 인 172.16.1.5 가 NIC 에 바인딩 되어 있음을 확인할 수 있습니다.


출처: http://livegs.tistory.com/44 [if (feel)]

댓글 없음:

댓글 쓰기