
Keepalived를 사용하여 Active-Active 고가용성 및 추가 Passive 노드 구성하기
On-Premises 배포에서 Active-Active 쌍 및 여러 Passive 인스턴스를 사용하여 NGINX Plus 인스턴스의 고가용성을 사용할 수 있습니다.
목차
1. 소개
2. Passive 노드를 추가하는 이유
3. Active-Active HA를 구성해야 하는 이유
4. 추가 Passive 노드에 대한 Keepalived 구성하기
5. Active-Active HA를 위한 keepalived 구성하기
6. Active-Active HA를 위한 NGINX Plus 구성
6-1. 각 노드에서 다양한 애플리케이션에 맞게 NGINX Plus 구성하기
6-2. 모든 노드에서 모든 애플리케이션을 위한 NGINX Plus 구성하기
7. 메서드 결합 및 확장
7-1. 3개 이상의 노드에서 All-Active HA 구성하기
7-2. Active-Active-Passive HA 구성하기
1. 소개
NGINX Plus는 keepalived를 활용하여 표준 Active-Passive 방식으로 고가용성(HA)을 제공합니다. 이는 기본 NGINX Plus 노드에 문제가 발생할 경우 장애 조치 이중화를 제공합니다. 추가 노드 및 keepalived
구성 변경을 통해 이 기능을 확장하여 추가적인 중복성 및 확장성 옵션을 제공할 수 있습니다. 이 가이드에서는 이미 NGINX HA 솔루션과 함께 Active-Passive 구현으로 NGINX Plus를 구성했다고 가정합니다.
Note: 퍼블릭 클라우드 배포에서는 클라우드 제공업체에서 제공하는 Layer 4 또는 TCP Load Balancing 서비스를 사용하여 Active-Active 기능을 위해 NGINX Plus에 트래픽을 분산하는 것이 좋습니다.
2. Passive 노드를 추가하는 이유
많은 조직은 중복성 Level에 대한 엄격한 요구 사항을 가지고 있으며, 2노드 Active-Passive 시스템은 이러한 요구 사항을 충족하지 못할 수 있습니다. 다른 두 노드가 모두 다운될 경우 이를 대신하도록 구성된 세 번째 노드를 추가하면 구성을 단순하게 유지하면서 추가적인 중복성을 제공할 수 있습니다. 또한 중복성을 잃지 않고 노드에서 유지보수를 수행할 수 있습니다.
3. Active-Active HA를 구성해야 하는 이유
두 개 이상의 노드가 동시에 트래픽을 처리하는 ” Active-Active” 방식으로 NGINX Plus를 실행할 수 있습니다. 이는 여러 개의 활성 IP 주소를 사용하여 이루어집니다. 각 IP 주소는 단일 NGINX 인스턴스에서 호스팅되며, Keepalived 구성은 이러한 IP 주소가 두 개 이상의 활성 노드에 분산되도록 합니다.
- 여러 서비스를 호스팅하는 경우 각 서비스의 DNS 이름은 IP 주소 중 하나로 확인되어야 합니다. 서비스 간에 IP 주소를 공유하세요.
- Round-Robin DNS를 사용하여 단일 DNS 이름을 여러 IP 주소에 매핑할 수 있습니다.
- 데이터센터 Edge Load Balancer와 같은 L3 Load Balancing 장치를 사용하여 IP 주소 간에 L3 트래픽을 분산합니다.
Active-Active를 사용하여 Load Balancing 클러스터의 용량을 늘릴 수 있지만 Active-Active 쌍의 단일 노드에 장애가 발생하면 용량이 절반으로 줄어든다는 점에 유의하세요. 두 노드가 모두 Active 상태일 때 예기치 않은 트래픽 급증을 흡수할 수 있는 충분한 리소스를 제공하기 위한 안전 수단으로 Active-Active를 사용할 수 있으며, 더 큰 규모의 클러스터에서 Active-Active를 사용하여 더 많은 이중화를 제공할 수 있습니다.
Note: Load Balancing 클러스터의 NGINX 인스턴스가 구성이나 상태를 공유하지 않도록 합니다. Active-Active 시나리오에서 최상의 성능을 얻으려면 동일한 클라이언트의 연결이 동일한 Active IP 주소로 라우팅되도록 하고, 서버 측 상태에 의존하지 않는 sticky cookie
와 같은 세션 지속성 방법을 사용하세요.
4. 추가 Passive 노드에 대한 Keepalived 구성하기
기존 NGINX Plus Active-Passive HA 쌍에 대한 추가 Passive 노드를 구성하려면 다음 단계를 수행합니다.
1. 새 노드에 nginx-plus 및 nginx-ha-keepalived 패키지를 설치합니다.
2. 보조 노드의 /etc/keepalived/keepalived.conf를 새 노드의 동일한 위치로 복사합니다.
3. 새 노드에서 keepalived.conf를 편집합니다.
- 다른 노드보다 낮은
priority
를 갖도록vrrp_instance
블록의 priority를 낮춥니다. - 새 노드의 호스트 IP 주소와 일치하도록
unicast_src_ip
를 변경합니다. - 다른 모든 노드가 나열되도록 보조 노드의 IP 주소를
unicast_peer
섹션에 추가합니다.
아래는 IP 주소가 192.168.10.12인 추가 Passive 노드에 있는 keepalived.conf 샘플입니다. 다른 두 노드의 IP 주소는 192.168.10.10과 192.168.10.11입니다. 가상 IP 주소(VIP)는 192.168.10.100입니다.
vrrp_script chk_nginx_service {
script "/usr/lib/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 99
virtual_router_id 51
advert_int 1
accept
unicast_src_ip 192.168.10.12
unicast_peer {
192.168.10.10
192.168.10.11
}
virtual_ipaddress {
192.168.10.100
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
4. 다른 노드에서 keepalived.conf를 편집하여 새 Passive 노드의 IP 주소를 unicast_peer
섹션에 추가하여 다른 모든 노드가 나열되도록 합니다.
unicast_peer {
192.168.10.11
192.168.10.12
}
5. 모든 노드에서 keepalived
를 다시 시작합니다.
6. 처음 두 노드에서 NGINX Plus를 중지하여 테스트합니다.
모든 NGINX Plus 노드에는 동일한 구성 및 SSL 인증서가 있어야 합니다.
5. Active-Active HA를 위한 keepalived 구성하기
두 노드에 동시에 트래픽을 전송하려면 추가 VIP를 사용해야 합니다. 이 새 VIP는 이전 Passive 노드에서 활성화되므로 각 노드는 자체 VIP로 활성화됩니다. 기존 NGINX Plus HA 쌍을 Active- Active로 구성하려면 다음 단계를 수행하세요.
1. 보조 노드에서 keepalived.conf를 편집합니다.
- 전체
vrrp_instance block VI_1
섹션을 복사하여 기존 블록 아래에 붙여넣습니다. - 복사한
vrrp_instance
섹션에서:- 새
vrrp_instance
의 이름을VI_2
또는 다른 고유 이름으로 변경합니다. virtual_router_id
를61
또는 다른 고유 값으로 변경합니다.virtual_ipaddress
를 동일한 서브넷에서 사용 가능한 IP 주소로 변경합니다(이 예제에서는 192.168.10.101).priority
값을100
으로 변경
- 새
vrrp_script chk_nginx_service {
script "/usr/lib/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 101
virtual_router_id 51
advert_int 1
accept
unicast_src_ip 192.168.10.10
unicast_peer {
192.168.10.11
}
virtual_ipaddress {
192.168.10.100
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
vrrp_instance VI_2 {
interface eth0
state BACKUP
priority 100
virtual_router_id 61
advert_int 1
accept
unicast_src_ip 192.168.10.10
unicast_peer {
192.168.10.11
}
virtual_ipaddress {
192.168.10.101
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
2. 기본 노드에서 keepalived.conf를 편집합니다.
- 보조 노드에서 수행한 편집을 반복합니다.
- 새
vrrp_instance
내의priority
를99
또는 보조 노드보다 낮은 값으로 설정합니다.
3. 모든 노드에서 keepalived
를 다시 시작합니다.
구성 파일 및 SSL 인증서 파일 동기화는 이 문서에서 다루지 않지만 모든 노드가 동일한 NGINX Plus 구성을 가지고 있는지 확인하세요.
6. Active-Active HA를 위한 NGINX Plus 구성
이제 두 개의 NGINX Plus 노드가 자체 VIP로 활성화되었으므로 NGINX Plus 자체를 구성해야 합니다. 활성 노드에 트래픽을 분산하는 데는 두 가지 옵션이 있습니다. 옵션 1은 모든 노드를 활성화하고 각 노드가 하나 이상의 애플리케이션을 처리합니다. 옵션 2는 모든 노드에서 모든 애플리케이션을 활성화합니다.
Note: Load Balancing 중인 애플리케이션에 세션 지속성이 필요한 경우 여러 활성 노드에서 올바르게 작동하는 Sticky Cookie, Sticky Route 또는 IP 해시 방법을 사용하는 것이 좋습니다. Sticky Learn은 활성 노드 간에 공유되지 않는 세션 테이블을 메모리에 생성합니다.
6-1. 각 노드에서 다양한 애플리케이션에 맞게 NGINX Plus 구성하기
이 구성에서 각 NGINX Plus 노드는 Active VIP가 있는 server
블록에 대한 요청만 처리합니다. 장애가 발생하면 Active 노드가 추가 VIP에 대한 기본 노드가 되어 연결된 server
블록에 대한 요청을 처리합니다.
각 server
블록에는 수신 중인 VIP를 지정하는 listen 지시문이 포함되어 있습니다.
이전 섹션의 Active-Active keepalived
구성을 기반으로 여기서는 동일한 두 개의 VIP를 사용합니다. 이 예제에서 애플리케이션 1은 NGINX Plus 노드 1에서 활성화되고 애플리케이션 2는 NGINX 노드 2에서 활성화됩니다.
server {
listen 192.168.10.100:80;
location / {
root /application1;
}
}
server {
listen 192.168.10.101:80;
location / {
root /application2;
}
}
6-2. 모든 노드에서 모든 애플리케이션을 위한 NGINX Plus 구성하기
이 구성에서 NGINX Plus는 모든 VIP에서 모든 애플리케이션의 트래픽을 처리할 수 있습니다. 노드에 장애가 발생하면 해당 노드의 VIP는 우선순위가 다음으로 높은 노드로 이동합니다. 이렇게 하면 DNS Load Balancing 구성을 변경할 필요가 없습니다.
각 NGINX Plus 노드는 모든 요청을 수신 대기합니다. DNS Load Balancing은 요청을 NGINX Plus 노드에 분산하는 데 사용됩니다. 간단한 Round-Robin DNS로 충분하며 DNS 서버 설명서에 따라 구성할 수 있습니다. 각 VIP에 대해 동일한 FQDN(정규화된 도메인 이름)을 가진 A가 있는지 확인하세요. 이름이 확인될 때마다 DNS 서버의 응답에는 모든 VIP가 포함되지만 다른 순서로 포함됩니다.
server {
listen *:80;
location /app1 {
root /application1;
}
location /app2 {
root /application2;
}
}
7. 메서드 결합 및 확장
Active-Active HA를 위한 NGINX Plus 구성의 두 가지 방법을 모두 결합하여 Active-Active-Passive 구성을 구성하거나 Active 노드 수에 관계없이 구성으로 확장할 수도 있습니다.
7-1. 3개 이상의 노드에서 All-Active HA 구성하기
다음 keepalived
구성은 Active-Active-Active 구성을 위한 것입니다. 여기서는 Active 노드를 추가하는 단계가 세 번째 노드에 대해 반복됩니다. 이 노드는 한 명의 VIP에 대해 Active, 두 번째 노드는 한 명의 VIP에 대해 Active, 세 번째 노드는 한 명의 VIP에 대해 Active임을 알 수 있습니다.
vrrp_script chk_nginx_service {
script "/usr/lib/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 101
virtual_router_id 51
advert_int 1
accept
unicast_src_ip 192.168.10.10
unicast_peer {
192.168.10.11
192.168.10.12
192.168.10.13
}
virtual_ipaddress {
192.168.10.100
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
vrrp_instance VI_2 {
interface eth0
state BACKUP
priority 100
virtual_router_id 61
advert_int 1
accept
unicast_src_ip 192.168.10.10
unicast_peer {
192.168.10.11
192.168.10.12
192.168.10.13
}
virtual_ipaddress {
192.168.10.101
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
vrrp_instance VI_3 {
interface eth0
state BACKUP
priority 99
virtual_router_id 71
advert_int 1
accept
unicast_src_ip 192.168.10.10
unicast_peer {
192.168.10.11
192.168.10.12
192.168.10.13
}
virtual_ipaddress {
192.168.10.102
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
7-2. Active-Active-Passive HA 구성하기
이 예제 keepalived
구성은 Active-Active-Passive 구성의 Passive 노드에 대한 것입니다. 추가 Passive 노드에 대한 keepalived 구성 및 Active-Active HA에 대한 keepalived 구성의 단계를 결합합니다.
vrrp_script chk_nginx_service {
script "/usr/lib/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 99
virtual_router_id 51
advert_int 1
accept
unicast_src_ip 192.168.10.12
unicast_peer {
192.168.10.10
192.168.10.11
}
virtual_ipaddress {
192.168.10.100
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
vrrp_instance VI_2 {
interface eth0
state BACKUP
priority 99
virtual_router_id 61
advert_int 1
accept
unicast_src_ip 192.168.10.12
unicast_peer {
192.168.10.10
192.168.10.11
}
virtual_ipaddress {
192.168.10.101
}
track_script {
chk_nginx_service
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}