
On-Premises 배포에서 NGINX Plus에 대한 고가용성(High Availability) 지원
On-Premises 배포에서 NGINX Plus 인스턴스의 고가용성(High Availability)을 지원하여 Keepalived 및 VRRP 기반 솔루션에서 Active-Passive 쌍을 구성할 수 있습니다.
이 문서에서는 Keepalived 기반 솔루션을 사용하여 On-Premises 배포에서 NGINX Plus 인스턴스의 고가용성을 구성하는 방법에 대해 설명합니다.
Note: 이 솔루션은 표준 운영 체제 호출을 통해 IP 주소를 제어할 수 있는 환경에서 작동하도록 설계되었으며, 클라우드 인프라와의 인터페이스를 통해 IP 주소를 제어하는 클라우드 환경에서는 작동하지 않는 경우가 많습니다.
목차
1. Keepalived 기반 고가용성 지원
2. 고가용성 구성
3. Health Check 스크립트를 사용하여 기본 서버 제어
4. 노드 상태 표시
5. 상태 변경 강제 적용
6. 가상 IP 주소 추가하기
7. IPv4 및 IPv6의 듀얼 스택 구성
8. Keepalived 및 VRRP 문제 해결
9. NGINX Plus 구성 파일 동기화 유지
10. 추가 구성 예제
1. Keepalived 기반 고가용성 지원
NGINX Plus R6 이상 버전은 Keepalived를 기반으로 Active-Passive 고가용성(HA) 설정에서 NGINX Plus 를 빠르고 쉽게 구성할 수 있는 솔루션을 지원합니다.
Keepalived Open Source 프로젝트에는 세 가지 구성 요소가 포함되어 있습니다.
- Linux 서버용
Keepalived
데몬입니다. - 가상 라우터(가상 IP 주소 또는 VIP)를 관리하기 위한 Virtual Router Redundancy Protocol(VRRP)의 구현입니다.
VRRP는 항상 기본 노드가 있는지 확인합니다. 백업 노드는 기본 노드로부터 VRRP 광고 패킷을 수신 대기합니다. 구성된 광고 간격의 3배를 초과하는 기간 동안 광고 패킷을 수신하지 못하면 백업 노드가 기본 노드를 대신하여 구성된 VIP를 자신에게 할당합니다. - 서비스(예: 웹 서버, PHP Backend 또는 데이터베이스 서버)가 가동 중이고 작동 중인지 확인하기 위한 Health‑Check 기능입니다.
기본 노드의 서비스가 구성된 Health Check 횟수에 실패하면Keepalived
는 기본 노드에서 백업(Passive) 노드로 가상 IP 주소를 재할당합니다.
2. 고가용성 구성
root
사용자로 두 노드에서 nginx-ha-setup
스크립트를 실행합니다(이 스크립트는 기본 NGINX Plus 패키지에 추가로 설치해야 하는 nginx-ha-keepalived 패키지로 배포됩니다). 이 스크립트는 기본 및 백업 노드 역할을 하는 Active-Passive 쌍의 노드로 고가용성 NGINX Plus 환경을 구성합니다. 다음 데이터를 입력하라는 메시지가 표시됩니다.
- 로컬 및 원격 노드의 IP 주소(하나는 기본 노드로, 다른 하나는 백업 노드로 구성됨)
- 클러스터 Endpoint의 (Floating) VIP로 사용할 추가 무료 IP 주소 1개
keepalived
데몬의 구성은 /etc/keepalived/keepalived.conf에 기록됩니다. 이 구성 블록에는 파일 제어 알림 설정, 관리할 VIP, VIP에 의존하는 서비스를 테스트하는 데 사용할 Health Check이 포함되어 있습니다. 다음은 CentOS 7 머신에서 nginx-ha-setup
스크립트로 생성한 구성 파일입니다. 이 파일은 NGINX Plus 구성 파일이 아니므로 구문이 다릅니다(예를 들어 세미콜론은 지시문을 구분하는 데 사용되지 않습니다).
global_defs {
vrrp_version 3
}
vrrp_script chk_manual_failover {
script "/usr/libexec/keepalived/nginx-ha-manual-failover"
interval 10
weight 50
}
vrrp_script chk_nginx_service {
script "/usr/libexec/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
priority 101
virtual_router_id 51
advert_int 1
accept
garp_master_refresh 5
garp_master_refresh_repeat 1
unicast_src_ip 192.168.100.100
unicast_peer {
192.168.100.101
}
virtual_ipaddress {
192.168.100.150
}
track_script {
chk_nginx_service
chk_manual_failover
}
notify "/usr/libexec/keepalived/nginx-ha-notify"
}
전체 구성을 설명하는 것은 이 글의 범위를 벗어나지만 몇 가지 항목은 주목할 가치가 있습니다.
- HA 설정의 각 노드에는 노드의 역할(기본 또는 백업)에 적합한
priority
,unicast_src_ip
,unicast_peer
지시문 값이 포함된 자체 구성 파일 사본이 필요합니다. priority
지시문은 다음 섹션에서 설명하는 것처럼 어떤 호스트가 기본 호스트가 될지 제어합니다.notify
지시문은 배포에 포함된 알림 스크립트의 이름을 지정하며, 상태 전환 또는 오류가 발생할 때 Syslog 메시지(또는 기타 알림)를 생성하는 데 사용할 수 있습니다.vrrp_instance VI_1
블록의virtual_router_id
지시문에 대한 값51
은 샘플 값입니다. 환경에서 고유하도록 필요에 따라 변경하십시오.- 로컬 네트워크에서 여러 쌍의
keepalived
인스턴스(또는 다른 VRRP 인스턴스)가 실행 중인 경우, 각 인스턴스에 대해 고유한 이름(예:VI_1
)과virtual_router_id
번호를 사용하여vrrp_instance
블록을 생성합니다.
3. Health Check 스크립트를 사용하여 기본 서버 제어
keepalived
에는 펜싱 메커니즘이 없습니다. 한 쌍의 두 노드가 서로를 인식하지 못하면 각각이 기본 노드라고 가정하고 자신에게 VIP를 할당합니다. 이러한 상황을 방지하기 위해 구성 파일은 정기적으로 스크립트를 실행하여 NGINX Plus 의 작동 여부를 확인하고 스크립트의 반환 코드에 따라 로컬 노드의 우선순위를 조정하는 chk_nginx_service
라는 스크립트 실행 메커니즘을 정의합니다. 코드 0
(zero)은 올바른 작동을 나타내고 코드 1
(또는 0이 아닌 코드)은 오류를 나타냅니다.
스크립트의 샘플 구성에서 weight
지시문은 50
으로 설정되어 있는데, 이는 검사 스크립트가 성공하면(암시적으로 코드 0
을 반환합니):
- 첫 번째 노드(기본 우선 순위가
101
인)의 우선 순위는151
로 설정됩니다. - 두 번째 노드(기본 우선 순위가
100
인 노드)의 우선 순위는150
으로 설정됩니다.
첫 번째 노드는 우선 순위가 더 높으며(이 경우 151
) 기본 노드가 됩니다.
interval
지시문은 검사 스크립트가 실행되는 빈도(초)를 지정합니다(샘플 구성 파일에서는 3초). 시간 제한에 도달하면 검사가 실패합니다(기본적으로 시간 제한은 검사 간격과 동일합니다).
rise
및 fall
지시문(샘플 구성 파일에는 사용되지 않음)은 스크립트가 작업을 수행하기 전에 성공 또는 실패해야 하는 횟수를 지정합니다.
nginx-ha-keepalive 패키지와 함께 제공되는 nginx-ha-check
스크립트는 NGINX Plus 가 가동 중인지 확인합니다. 로컬 설정에 맞게 추가 스크립트를 생성하는 것이 좋습니다.
4. 노드 상태 표시
현재 특정 VIP의 기본 노드를 확인하려면 VRRP 인스턴스가 정의된 인터페이스에 대해 ip addr show
명령을 실행합니다(다음 명령에서는 노드 centos7-1 및 centos7-2의 인터페이스 eth0).
centos7-1 $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
UP qlen 1000
link/ether 52:54:00:33:a5:a5 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.100/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 3071sec preferred_lft 3071sec
inet 192.168.100.150/32 scope global eth0
valid_lft forever preferred_lft forever
centos7-2 $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
UP qlen 1000
link/ether 52:54:00:33:a5:87 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.101/24 brd 192.168.122.255 scope global eth0
valid_lft forever preferred_lft forever
이 출력에서 centos7-1의 두 번째 inet
줄은 기본 노드임을 나타내며, 정의된 VIP(192.168.100.150)가 할당되어 있습니다. 다른 inet
줄은 기본 노드의 실제 IP 주소(192.168.100.100)와 백업 노드의 IP 주소(192.168.100.101)를 표시합니다.
노드의 현재 상태는 로컬 /var/run/nginx-ha-keepalived.state 파일에 기록됩니다. cat
명령을 사용하여 표시할 수 있습니다.
centos7-1 $ cat /var/run/nginx-ha-keepalived.state
STATE=MASTER
centos7-2 $ cat /var/run/nginx-ha-keepalived.state
STATE=BACKUP
nginx-ha-keepalived 패키지 버전 1.1 이상에서는 다음 명령을 사용하여 VRRP 확장 통계 및 데이터를 파일시스템에 저장할 수 있습니다.
centos7-1 $ service keepalived dump
이 명령은 실행 중인 Keepalived
프로세스에 신호를 보내 현재 상태를 /tmp/keepalived.stats 및 /tmp/keepalived.data에 기록하도록 합니다.
5. 상태 변경 강제 적용
기본 노드를 강제로 백업 노드로 설정하려면 다음 명령을 실행합니다.
$ service keepalived stop
종료 시 keepalived
는 우선순위 0의 VRRP 패킷을 백업 노드로 전송하여 백업 노드가 VIP를 인계받게 합니다.
클러스터에서 nginx-ha-keepalived 패키지 버전 1.1을 사용하는 경우, 이 방법이 상태 변경을 강제하는 더 간단한 방법입니다.
$ touch /var/run/keepalived-manual-failover
이 명령은 vrrp_script chk_manual_failover
블록에 정의된 스크립트에 의해 확인된 파일을 생성합니다. 파일이 존재하면 keepalived
가 기본 노드의 우선순위를 낮추어 백업 노드가 VIP를 인계받게 됩니다.
6. 가상 IP 주소 추가하기
nginx-ha-setup
스크립트로 생성된 구성은 매우 기본적이며 단일 IP 주소의 가용성을 높입니다.
둘 이상의 IP 주소를 고가용성으로 만들 수 있습니다.
1. 두 노드 모두의 /etc/keepalived/keepalived.conf 파일에 있는 virtual_ipaddress
블록에 각각의 새 IP 주소를 추가합니다.
virtual_ipaddress {
192.168.100.150
192.168.100.200
}
virtual_ipaddress
블록의 구문은 ip 유틸리티의 구문을 복제합니다.
2. 두 노드 모두에서 Keepalived Reload 명령을 실행하여 Keepalived 서비스를 Reload
합니다.
centos7-1 $ service keepalived reload
centos7-2 $ service keepalived reload
7. IPv4 및 IPv6의 듀얼 스택 구성
keepalived
버전 1.2.20 이상(및 nginx-ha-keepalived 패키지 버전 1.1 이상)에서 keepalived
는 VRRP 표준을 위반하기 때문에 하나의 VRRP 인스턴스(virtual_ipaddress
블록)에 IPv4와 IPv6 주소를 혼합하는 것을 더 이상 지원하지 않습니다.
VRRP로 듀얼 스택 HA를 구성하는 방법에는 두 가지가 있습니다.
- 한 Family의 주소가 포함된 virtual_ipaddress_excluded 블록을 추가합니다.
vrrp_instance VI_1 {
...
unicast_src_ip 192.168.100.100
unicast_peer {
192.168.100.101
}
virtual_ipaddress {
192.168.100.150
}
...
virtual_ipaddress_excluded {
1234:5678:9abc:def::1
}
...
}
해당 주소는 VRRP 광고에서 제외되지만 keepalived
에서 계속 관리하며 상태 변경이 있을 때 추가 또는 제거됩니다.
- IPv6 주소에 다른 VRRP 인스턴스를 추가합니다.
기본 노드의 IPv6 주소에 대한 VRRP 구성은 다음과 같습니다.
vrrp_instance VI_2 {
interface eth0
priority 101
virtual_router_id 51
advert_int 1
accept
unicast_src_ip 1234:5678:9abc:def::3
unicast_peer {
1234:5678:9abc:def::2
}
virtual_ipaddress {
1234:5678:9abc:def::1
}
track_script {
chk_nginx_service
chk_manual_failover
}
notify "/usr/libexec/keepalived/nginx-ha-notify"
}
VRRP IPv4 및 IPv6 인스턴스는 서로 완전히 독립적이므로 VRRP 인스턴스는 모두 동일한 virtual_router_id
를 사용할 수 있습니다.
8. Keepalived 및 VRRP 문제 해결
keepalived
데몬은 로깅을 위해 syslog
유틸리티를 사용합니다. CentOS, RHEL 및 SLES 기반 시스템에서는 일반적으로 /var/log/messages에 기록되는 반면, Ubuntu 및 Debian 기반 시스템에서는 /var/log/syslog에 기록됩니다. 로그 항목에는 keepalived
데몬의 시작 및 상태 전환과 같은 이벤트가 기록됩니다.
다음은 keepalived
데몬이 시작되고 노드가 VRRP 인스턴스를 기본 상태로 전환하는 것을 보여주는 몇 가지 샘플 항목입니다(읽기 쉽도록 첫 번째 줄 이후 각 줄에서 centos7-1 호스트 이름을 제거했습니다).
Feb 27 14:42:04 centos7-1 systemd: Starting LVS and VRRP High Availability Monitor...
Feb 27 14:42:04 Keepalived [19242]: Starting Keepalived v1.2.15 (02/26,2015)
Feb 27 14:42:04 Keepalived [19243]: Starting VRRP child process, pid=19244
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink reflector
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink command channel
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering gratuitous ARP shared channel
Feb 27 14:42:05 systemd: Started LVS and VRRP High Availability Monitor.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Opening file '/etc/keepalived/keepalived.conf '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Truncating auth_pass to 8 characters
Feb 27 14:42:05 Keepalived_vrrp [19244]: Configuration is using: 64631 Bytes
Feb 27 14:42:05 Keepalived_vrrp [19244]: Using LinkWatch kernel netlink reflector...
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP sockpool: [ifindex(2), proto(112), unicast(1), fd(14,15)]
Feb 27 14:42:05 nginx-ha-keepalived: Transition to state 'BACKUP ' on VRRP instance 'VI_1 '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Script(chk_nginx_service) succeeded
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:07 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150
Feb 27 14:42:08 nginx-ha-keepalived: Transition to state 'MASTER ' on VRRP instance 'VI_1 '.
Feb 27 14:42:13 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150
시스템 로그에 문제의 원인이 설명되어 있지 않은 경우 다음 매개변수와 함께 tcpdump
명령을 실행하여 로컬 네트워크에서 전송된 VRRP 광고를 표시하세요.
$ tcpdump -vvv -ni eth0 proto vrrp
로컬 네트워크에 여러 VRRP 인스턴스가 있고 특정 서비스에 대해 노드와 해당 peer 간의 트래픽만 포함하도록 출력을 필터링하려면 다음 예제에서와 같이 host
매개 변수를 포함하고 keepalived.conf 파일의 unicast_peer
블록에 정의된 대로 peer의 IP 주소를 지정합니다.
centos7-1 $ tcpdump -vvv -ni eth0 proto vrrp and host 192.168.100.101
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:48:27.188100 IP (tos 0xc0, ttl 255, id 382, offset 0, flags [none],
proto VRRP (112), length 40)
192.168.100.100 > 192.168.100.101: vrrp 192.168.100.100 >
192.168.100.101: VRRPv2 , Advertisement , vrid 51, prio 151,
authtype simple , intvl 1s, length 20, addrs: 192.168.100.150 auth
"f8f0e511"
출력의 몇 가지 필드는 디버깅에 유용합니다.
vrid
– 가상 라우터 ID(virtual_router_id
지시문으로 설정)prio
– 노드의 우선순위(priority
지시문으로 설정)authtype
– 사용 중인 인증 유형(authentication
지시문으로 설정)intvl
– 광고가 전송되는 빈도(advert_int
지시문으로 설정)auth
– 인증 토큰 전송(auth_pass
지시문으로 설정)
9. NGINX Plus 구성 파일 동기화 유지
노드의 NGINX Plus 구성 파일은 모두 고가용성을 제공하는 서비스를 정의해야 합니다.
10. 추가 구성 예제
nginx-ha-keepalived 패키지는 /usr/share/doc/nginx-ha-keepalived 디렉터리에 더 많은 구성 예제가 포함되고 있습니다.