L4 환경에서 HA 구성해보기
안녕하세요, 네이버 클라우드 플랫폼입니다.
오늘은 지난번에 이어서 HA라는 주제로 계속 이어나가겠습니다.
지난번 포스팅에서는 Private Subnet 환경하에서 간단하게 Keepalived를 활용하여 HA를 구성하는 내용에 대해 소개해드렸었는데요, 이번에는 로드밸런서 환경 하에서의 Keepalived를 활용한 Active-Standby 구성에 대해 소개해드리고자 합니다.
사실, 웹서버 앞단에 로드밸런서가 있으면 로드밸런서가 바인딩 된 서버의 헬스 체크를 주기적으로 수행하며 헬스 체크에 실패했을 시 언바인딩하고 헬스 체크에 성공한 서버로만 트래픽을 보내는데요, 얼마 전 저희 쪽에 기술 문의 들어온 것 중, 로드밸런서 환경 하에서도Active-standby 환경을 구성하고 싶다는 문의가 온 적이 있어, 이에 대한 구성을 소개합니다.
로드밸런서 환경 하에서 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를 구성하는 방법에 대해서 살펴보았습니다.
서비스 사용 및 구축 중에 이슈가 발생하신 경우, 네이버 클라우드 플랫폼 고객센터로 문의하시면 빠른 지원 받으실 수 있습니다.
앞으로도 네이버 클라우드 플랫폼에 많은 관심 부탁드립니다! 긴 글 읽어주셔서 다시 한 번 더 감사드립니다.