L4 환경에서 HA 구성해보기

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM
10 min readJul 2, 2019

안녕하세요, 네이버 클라우드 플랫폼입니다.

오늘은 지난번에 이어서 HA라는 주제로 계속 이어나가겠습니다.

​지난번 포스팅에서는 Private Subnet 환경하에서 간단하게 Keepalived를 활용하여 HA를 구성하는 내용에 대해 소개해드렸었는데요, 이번에는 로드밸런서 환경 하에서의 Keepalived를 활용한 Active-Standby 구성에 대해 소개해드리고자 합니다.

사실, 웹서버 앞단에 로드밸런서가 있으면 로드밸런서가 바인딩 된 서버의 헬스 체크를 주기적으로 수행하며 헬스 체크에 실패했을 시 언바인딩하고 헬스 체크에 성공한 서버로만 트래픽을 보내는데요, 얼마 전 저희 쪽에 기술 문의 들어온 것 중, 로드밸런서 환경 하에서도Active-standby 환경을 구성하고 싶다는 문의가 온 적이 있어, 이에 대한 구성을 소개합니다.

Load Balancer 바로가기 >>

로드밸런서 환경 하에서 Keepalived를 활용하여 Active-Standby 구성하기

일단 로드밸런서가 있는 상황에서 Active-Standby를 구성하기 위해서, 로드밸런서에 바인딩 된 Active서버는 NGINX 데몬을 활성화해놓고, Standby 서버는 NGINX 데몬을 비활성화해놓다가 Active 서버가 어떠한 이유로 정상적으로 작동하지 않을 시에 Standby 서버의 NGINX 데몬을 활성화해서 바로 서비스에 투입될 수 있도록 구성할 예정입니다.

구성하고자 하는 환경은 다음과 같습니다.

Node1 서버와 Node 2 서버는 로드밸런서에 바인딩이 되어 있으며, Node 1은 Active 서버로 작동합니다. Node 2 서버는 Node 1이 장애나 기타 이유로 정상적으로 작동하지 않을 시를 대비해 BACKUP 서버로 작동하게 되는 구조입니다. Node 1 서버와 Node 2 서버는 Keepalived를 활용하여 서로 간의 Health-check를 수행합니다.
(Node 1과 Node 2에 Keepalived를 설치하고, VIP를 할당하는 방법에 대해서는 이전 포스트 글을 참고하시기 바랍니다)

오늘은 이미 Node 1 서버와 Node 2 서버에 Keepailived 설정이 완료되었다는 가정 하에 NGINX를 설치하고, Standby 서버가 active 상태로 전환될 시에 NGINX 데몬이 활성화되도록 Keepalived 내 설정에 스크립트를 추가하겠습니다.

Keepalived는 그 자체만으로도 많은 기능을 제공하고 있으며, 오늘 포스팅에서는 그중에서 Keepalived 내에 Notify 스크립트를 추가할 예정입니다.

* Notify 스크립트란?

→ Keepalived에서 서버의 상태(ex. StandbyàMaster)가 변경되었을 때, 특정 Action을 취하도록 제공되는 스크립트

저희는 Keepalived 설정 파일에서 다음과 같이 서버 상태에 따라 NGINX 데몬을 활성화하고 비활성화할 예정입니다.

■ MASTER >> NGINX Active

■ BACKUP >> NGINX In-Active

- 먼저 위 설정을 하기 전에 node 1 서버와 node 2 서버에 NGINX를 설치해보도록 하겠습니다.
(본 포스팅은 Ubuntu 16.04 서버를 기반으로 합니다)

Node 1 )

root@node1:~# apt-get install nginx

root@node1:~# nginx -v

root@node1:~# nginx version: nginx/1.10.3 (Ubuntu)

Node 2 )

root@node2:~# apt-get install nginx

root@node2:~# nginx -v

root@node2:~# nginx version: nginx/1.10.3 (Ubuntu)

- 그다음 서버의 상태가 변경되었을 때, NGINX의 동작을 정의하는 스크립트를 아래와 같이 추가했습니다.
( /etc/keepalived에 notify-nignx.sh 스크립트를 작성했습니다. )

Node 1 )

root@node1:~# cd /etc/keepalived

root@node1:~# vi notify-niginx.sh

#!/bin/bash

TYPE=$1

NAME=$2

STATE=$3

case $STATE in

“MASTER”) systemctl start nginx

exit 0

;;

“BACKUP”) systemctl stop nginx

exit 0

;;

“FAULT”) systemctl stop nginx

exit 0

;;

*) echo “unknown state”

exit 1

;;

esac

Node 2)

root@node 2:~# cd /etc/keepalived

root@node 2:~# vi notify-niginx.sh

#!/bin/bash

TYPE=$1

NAME=$2

STATE=$3

case $STATE in

“MASTER”) systemctl start nginx

exit 0

;;

“BACKUP”) systemctl stop nginx

exit 0

;;

“FAULT”) systemctl stop nginx

exit 0

;;

*) echo “unknown state”

exit 1

;;

esac

- 그리고 해당 스크립트가 정상적으로 동작할 수 있도록 Keepalived 설정 파일을 수정해주어야 합니다. 이전 포스팅에서 작성한 Keepalived 설정 파일에서, notify 부분만 추가해주시면 해당 스크립트가 동작하기 위한 모든 준비는 끝이 납니다.

Node 1)

root@node 1:~# vi /etc/keepalived/keepalived.conf

! Configuration File for Keepalived

vrrp_instance VI_1 {

state MASTER

interface eth1

virtual_router_id 51

priority 150 >> Priority 값이 node 2보다 높기 때문에 mater 서버가 됩니다.

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.102

}

notify /etc/keepalived/notify-nginx.sh >> notify 스크립트를 추가

}

Node 2)

root@node 2:~# vi /etc/keepalived/keepalived.conf

! Configuration File for Keepalived

vrrp_instance VI_1 {

state BACKUP

interface eth1

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.102

}

notify /etc/keepalived/notify-nginx.sh >> Notify 스크립트 추가

}

- 위와 같이 설정이 완료되었다면 저희가 처음에 구상한 구조대로 제대로 동작하는지 확인을 해보도록 하겠습니다.

먼저 두 대의 서버 모두 NIGNX 데몬을 활성화한 상태에서 로드밸런서에 연결을 해보도록 하겠습니다.

[node 1]

[node 2]

네이버 클라우드 플랫폼에 로드밸런서 생성하기

네이버 클라우드 플랫폼의 로드밸런서는 다음과 같이 생성하시면 됩니다.

1) All product > Network > Load Balancer 메뉴로 이동합니다.

2) 설정값

- 로드밸런서 이름 : ncp-lb

- 네트워크 : Public IP

- 로드밸런서 설정 : 프로토콜 HTTP / 로드밸런서 포트 80 / 서버 포트 80 / L7 헬스 체크 : “ / “

- 인터넷 회선 : 일반

- 로드밸런싱 알고리즘 : Round Robin

3) 위 설정값을 입력 후, 다음 버튼을 클릭하여 로드밸런서에 바인딩 할 서버인 node 1, node 2 서버를 추가합니다.

위와 같이 서버를 선택 후, 다음 버튼을 클릭하신 후에 ‘로드밸런서 생성’ 버튼을 클릭해주시면 모든 준비는 끝났습니다.

이제 실제로 로드밸런서에 바인딩 된 Node 1 서버와 Node 2 서버가 Active-Standby로 동작을 하는지 확인을 해보도록 하겠습니다. 현재는 Keepalived가 서버의 State 변경을 감지하지 못했기 때문에 로드밸런서에 바인딩 된 node 1, node 2 서버가 모두 NGINX 데몬이 활성화되어 있는 상태이기 때문에 연결 상태가 둘 다 성공으로 뜹니다.

그럼 Node 1(MASTER) 서버를 재시작해보도록 하겠습니다.

Node 1을 재시작했기 때문에 Master와 Backup 서버 State가 변경되었었고, 로드밸런서 상태를 확인해보시면 아래와 같이 Node 1만 active 한 상태로 보이게 되며, node 2 서버에 접속해 보시면 nginx 데몬이 비활성화되신 것을 확인해 보실 수 있습니다.

로드밸런서 상에서의 Node 1, Node 2 연결 상태

[Node 2 Nginx Status]

[Node 2 로그]

Apr 15 16:56:51 node2 Keepalived_vrrp[5976]: VRRP_Instance(VI_1) Received higher prio advert 150

Apr 15 16:56:51 node2 Keepalived_vrrp[5976]: VRRP_Instance(VI_1) Entering BACKUP STATE

Apr 15 16:56:51 node2 Keepalived_vrrp[5976]: Opening script file /etc/keepalived/notify-nginx.sh

Apr 15 16:56:51 node2 systemd[1]: Stopping A high performance web server and a reverse proxy server…

Apr 15 16:56:51 node2 systemd[1]: Stopped A high performance web server and a reverse proxy server.

위와 같이 Node 2 서버에 접속하려 로그를 살펴보면, Node 2 서버가 notify-niginx.sh 스크립트에 의해 NGINX 데몬을 정지시킨 것을 확인하실 수 있습니다.

글을 마무리하며…

지금까지 Keepalived를 사용하여 로드밸런서 환경하에서 Active-Standby를 구성하는 방법에 대해서 살펴보았습니다.

서비스 사용 및 구축 중에 이슈가 발생하신 경우, 네이버 클라우드 플랫폼 고객센터로 문의하시면 빠른 지원 받으실 수 있습니다.

앞으로도 네이버 클라우드 플랫폼에 많은 관심 부탁드립니다! 긴 글 읽어주셔서 다시 한 번 더 감사드립니다.

--

--

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM

We provide cloud-based information technology services for industry leaders from startups to enterprises.