728x90
반응형

Keepalived & VRRP

 

웹 서비스 운영시 부하분산을 위해 Nginx로 Reverse Proxy를 사용하거나 Haproxy 같은 Loadbalancer를 사용한다.

그런데 이런 Loadbalancer에 장애가 발생하면 뒤에 존재하는 서버들은 정상적으로 서비스가 가능하더라도 앞에서 Gateway 역할을 하는 부분이 동작하지 않기 때문에 전체 장애로 이어진다.

 

 

해당 그림과 같이 한 지점에 장애가 발생해 전체 시스템의 장애로 이어지는 것을 SPOF (Single Point Of Failure : 단일장애점) 이라고 한다.

이런 SPOF을 막기위해 HA를 구성하는 것이다.

 

 

 

 

VRRP (Virtual Router Redundancy Protocol) 란?

 

Route나 LoadBalancer의 장애를 극복하고 HA 구성을 하기 위해서는 Route나 LoadBalancer를 이중화시킬 필요가 있다.

이렇게 Network 상에 존재하고 있는 Route나 LoadBalancer 중 어떤 인터페이스가 트래픽을 전달하는 책임을 가질지 결정하는 프로토콜이 VRRP라고 한다.

(HSRP도 같은 역할을 하는 프로토콜이긴 하나 Cisco 벤더에 종속적이므로 IETF 표준인 VRRP을 많이 사용한다.)

 

VRRP를 사용해 Linux에서 HA를 쉽게 해주는 Tool로는 대표적으로 Keepalived가 있고 비슷한 메커니즘을 사용하는 Corosync나 PaceMaker 등이 있다.

 

아래는 VRRP를 사용하는 이중화된 Route의 구성도이다.

 

 

VRRP는 가상의 Route에 IP를 할당하고 가상 Route에 연결된 물리 Route 중 할당 우선순위가 높은 Route가 Active Route가 되어 통신에 사용된다. (개념은 Linux Bonding과 같은 개념이다.)

Stanby Route는 Active Route를 장애 발생시 Active로 승격한다.

 

Active Route 선출 우선순위는 아래와 같다.

  1. 설정한 VIP가 실제 인터페이스 IP인 Route

  2. Priority가 높은 Route

  3. IP 주소가 높은 Route

 

아래 그림을 확인해보면 VRRP로 구성된 Route가 FailOver하는 디테일한 과정이다.

 

 

Master Route (Active Route)에서 Slave Route (Stanby Route)로 Advertisement (Health Check) 를 전달하여 자신이 정상 상태인 것을 알려준다.

Slave Route에는 Master DownTimer라는 것을 설정하는데 이 지정된 시간동안 Master로 부터 Advertisement가 오지 않으면 Master가 죽은것으로 판단하고 자신이 Master가 되었다는 Advertisement를 Master에 전달한다.

 

VRRP의 상세 동작 원리는 아래의 링크을 참고한다.

URL : https://www.netmanias.com/ko/post/techdocs/5049/data-center-network-protocol/vrrp-virtual-router-redundancy-protocol-detailed-principles-of-operation

 

 

 

 

Keepalived 란?

 

C로 작성된 LoadBalancing 및 HA를 제공하는 프레임워크이다.

간단하게 설명하면 VIP (가상 IP)를 기반으로 작동하며 Master 노드를 모니터링하다가 해당 노드에 장애가 발생했을시 Stanby 서버로 Failover되도록 지원한다.

즉, Heartbeat 체크를 하다가 Master에 장애발생시 Slave로 FailOver하는 역할을 하는 것이다.

 

아래 그림은 keepalived의 구조이다.

 

LoadBalancing을 하기위해서 LVS (Linux Virtual Server)의 구성 요소인 IPVS를 사용한다. 

Keepalived와 IPVS를 조합해 HAProxy와 같은 LoadBalancer를 사용하여 L7 LoadBalancing을 할 수도 있지만 Keepalived에서 제공하는 LoadBalancing 기능을 사용하여 L4 LoadBalancing을 할 수도 있다.

Keepalived는 HA를 하기위해 VRRP Protocol을 사용하며 LoadBalancer 설정을 위한 LVS와는 독립적으로 동작한다.

 

Keepalived는 LoadBalancing 쪽에서 사용되는 LVS(IPVS)와 NAT, Masquerading에 쓰이는 Netfilter와 VIP 할당 및 해제에 쓰이는 Netlink, VRRP Advertisement 패킷 전송을 위해 사용되는 Multicast와 같은 Kernel 컴포넌트로 구성되어 있다.

Keepalived의 HA는 자신의 IP 주소와는 별개로 VIP를 설정해두고 문제가 생겼을때 이 VIP를 다른곳으로 인계하여 같은 IP주소를 통해서 서비스가 지속되도록 해주는것이 핵심인데 이 부분은 Keepalived가 VIP 할당 및 해제를 자동으로 해주기 때문에 별도의 설정을 하지 않아도 문제가 없다.

 

HA구성에서 Master의 장애인지 검출할 수 있는 방법은 아래와 같다.

  • ICMP (L3)

    • ping을 사용하는 것이다.

    • 네트워크 구간이 정상이고 서버가 살아있다면 ICMP echo 요청에 대한 응답이 돌아올 것이지만 ICMP 패킷이 바이러스 침투나 공격으로 사용되는 사례가 많기때문에 ICMP를 차단하는 경우가 많아 잘 사용하지 않는다.

  • TCP 요청 (L4)

    • 서비스를 올린 후 방화벽 허용 확인을 위해 telnet 명령을 실행해 정상 체크를 하기도 한다. 이는 TCP 요청이 정상적으로 응답하는지 확인하는 방법이다.

    • 서비스가 살아 있어 Port Listen은 하고 있지만 서버나 프로그램의 오류가 있어 HTTP 500 Code를 반환하는 경우 정확한 확인이 불가능한 단점이 있다.

  • HTTP 요청 (L7)

    • 실제 실행중인 서비스에 Heathcheck를 위한 Endpoint를 두고 서비스에 요청을 날려 200 OK가 반환되는지 확인하는 것이다.

    • HTTP 요청 자체가 ICMP나 TCP 요청에 비해 무겁기 때문에 고려가 필요하다.

 

Keepalived는 Heathcheck를 위해 TCP, HTTP, SSL, MISC와 같은 방법을 사용한다.

  • TCP_CHECK

    • 비동기방식으로 Time-Out TCP 요청을 통해 장애를 검출하는 방식이다.

    • 응답하지 않는 서버는 Server Pool에서 제외한다.

  • HTTP_GET

    • HTTP Get 요청을 날려 서비스의 정상 동작을 확인한다.

  • SSL_GET

    • HTTP Get과 같은 방식이지만 HTTPS 기반이다.

  • MISC_CHECK

    • 시스템상에서 특정 기능을 확인하는 Script를 돌려 그 결과가 0인지 1인지를 가지고 장애를 검출하는 방법이다.

    • 네트워크가 아니라 시스템상에서 돌고 있는 서비스의 정상 동작을 확인하는데 유용하다.

 

 

Keepalived 구성

 

환경

  • VitualBox

  • OS : Ubuntu 18.04

  • VIP : 192.168.219.119

  • Active : 192.168.219.120

  • Stanby : 192.168.219.121

 

 

1. keepalived 설치 (Active & Stanby)

 

# apt update

 

apt install -y keepalived

 

 

 

2. keepalived 설정 (Active & Stanby)

 

2.1) Active Node 설정

 

vim /etc/keepalived/keepalived.conf

 

 

vrrp_instance VI_1 {

  state MASTER

  interface eth0

  virtual_router_id 51

  priority 200

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 7388

  }

  virtual_ipaddress {

    192.168.219.119

  }

}

 

 

2.2) Stanby Node 설정

 

 

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  virtual_router_id 51

  priority 100

  advert_int 1

  authentication {

    auth_type PASS

    auth_pass 7388

  }

  virtual_ipaddress {

    192.168.219.119

  }

}

 

 

3. 테스트

 

3.1) Fail Over Test

# ping 192.168.219.119

 

3.2) Active Node Poweroff

# poweroff

 

3.3) Fail Over Log Check

Active Node가 Poweroff 되자 Keepalived 데몬이 VIP (192.168.219.119) 를 Stanby Node에 인계하여 FailOver를 하였다.

 

3.4) tcpdump를 사용하여 vrrp 동작 확인

tcpdump -n vrrp

Active 정상 동작

Active poweroff 후 Stanby FailOver 정상동작 확인

 

 

참고 URL

 

 

 

 

반응형

'Web' 카테고리의 다른 글

HAProxy & Keepalived  (1) 2020.01.29
HAProxy  (2) 2020.01.17
부하분산 테스트 설명 및 용어  (0) 2019.04.09
PinPoint  (0) 2019.04.09
Crawling (크롤링)  (0) 2019.04.09

+ Recent posts