본문 바로가기

리눅스

Pacemaker와 Corosync를 사용하여 NGINX의 고가용성 설정을 구성하는 방법

반응형

Pacemaker와 Corosync를 사용하여 NGINX의 고가용성(HA) 설정을 구성하는 방법

테스트 환경

호스트 이름 서버 아이피 도메인 운영체제 비고
VIP 192.168.0.60 vip.cluster.local    
control1 192.168.0.51 control1.cluster.local Ubuntu 22.04 LTS  
node3 192.168.0.63 node3.cluster.local Ubuntu 22.04 LTS  

NGINX 설치

curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt-get update
sudo apt-get install -y nginx
echo '<h1>webserver 01</h1>' > /usr/share/nginx/html/index.html
echo '<h1>webserver 02</h1>' > /usr/share/nginx/html/index.html
echo '<h1>webserver 03</h1>' > /usr/share/nginx/html/index.html
sudo systemctl restart nginx
curl -fsSL --resolve localhost:80:127.0.0.1 http://localhost

hacluster 사용자와 비밀번호를 설정

echo -e 'hacluster:hacluster' | sudo chpasswd

기존 클러스터 제거

더보기

---

클러스터를 제거하여 모든 리소스를 제거

sudo pcs cluster destroy

Corosync와 Pacemaker 서비스 중지

sudo systemctl stop corosync pacemaker

클러스터 노드 인증

sudo pcs host auth -u hacluster -p hacluster \
    192.168.0.121 192.168.0.122 192.168.0.123

클러스터를 설정(노드 지정) - 강제로 설정

sudo pcs cluster setup My_Cluster \
    192.168.0.121 192.168.0.122 192.168.0.123 --force

클러스터 시작

sudo pcs cluster start --all

STONITH 비활성화 (노드가 다운될 경우 재부팅 방지)

sudo pcs property set stonith-enabled=false

쿼럼이 없을 경우 무시하도록 설정

sudo pcs property set no-quorum-policy=ignore

클러스터 상태 확인

sudo pcs status

클러스터 중지

sudo pcs cluster stop --all

---

클러스터 상태 확인

sudo pcs status
Cluster name: My_Cluster
Cluster Summary:
  * Stack: corosync
  * Current DC: 192.168.0.123 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Wed Oct 30 16:08:25 2024
  * Last change:  Wed Oct 30 16:08:05 2024 by root via cibadmin on 192.168.0.121
  * 3 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ 192.168.0.121 192.168.0.122 192.168.0.123 ]

Full List of Resources:
  * No resources

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

NGINX를 클러스터 리소스로 추가

sudo pcs resource agents ocf:heartbeat | grep nginx
nginx
더보기

---

cd /usr/lib/ocf/resource.d/heartbeat
wget -q https://raw.githubusercontent.com/ClusterLabs/resource-agents/master/heartbeat/nginx
chmod +x /usr/lib/ocf/resource.d/heartbeat/nginx
pcs resource agents ocf:heartbeat
$ pcs resource agents ocf:heartbeat
IPaddr2
iscsi
iSCSILogicalUnit
iSCSITarget
LVM-activate
nginx

---

가상 IP 리소스 생성

sudo pcs resource create VirtualIP ocf:heartbeat:IPaddr2 \
  ip=192.168.0.120 cidr_netmask=24 op monitor interval=30s

NGINX 리소스 생성

sudo pcs resource create Nginx ocf:heartbeat:nginx \
    configfile="/etc/nginx/nginx.conf" op monitor interval=30s

리소스 상태 확인

sudo pcs status resources
  * VirtualIP   (ocf:heartbeat:IPaddr2):         Started 192.168.0.121
  * Nginx       (ocf:heartbeat:nginx):   Started 192.168.0.122

리소스 구성 확인

sudo pcs resource config
 Resource: VirtualIP (class=ocf provider=heartbeat type=IPaddr2)
  Attributes: cidr_netmask=24 ip=192.168.0.120
  Operations: monitor interval=30s (VirtualIP-monitor-interval-30s)
              start interval=0s timeout=20s (VirtualIP-start-interval-0s)
              stop interval=0s timeout=20s (VirtualIP-stop-interval-0s)
 Resource: Nginx (class=ocf provider=heartbeat type=nginx)
  Attributes: configfile=/etc/nginx/nginx.conf
  Operations: monitor interval=30s (Nginx-monitor-interval-30s)
              reload interval=0s timeout=40s (Nginx-reload-interval-0s)
              start interval=0s timeout=40s (Nginx-start-interval-0s)
              stop interval=0s timeout=60s (Nginx-stop-interval-0s)

리소스 구성 확인

# VirtualIP 리소스의 구성 확인
sudo pcs resource config VirtualIP

# Nginx 리소스의 구성 확인
sudo pcs resource config Nginx

리소스 삭제

# VirtualIP 리소스 삭제
sudo pcs resource delete VirtualIP

# Nginx 리소스 삭제
sudo pcs resource delete Nginx

리소스 시작

# VirtualIP 리소스 시작
sudo pcs resource start VirtualIP

# Nginx 리소스 시작
sudo pcs resource start Nginx

리소스 실패 기록 지우기

# VirtualIP 리소스 정리 (클러스터에서 실패한 리소스를 정리)
sudo pcs resource cleanup VirtualIP

# Nginx 리소스 정리
sudo pcs resource cleanup Nginx

리소스 그룹화

VIP와 NGINX 리소스를 하나의 그룹으로 묶습니다. 그룹으로 묶으면 클러스터가 VIP와 NGINX를 동시에 관리하고 필요 시 함께 페일오버할 수 있습니다.

sudo pcs resource group add Nginx_Group VirtualIP Nginx

Nginx 리소스가 VirtualIP와 함께 위치하도록 강제 설정

sudo pcs constraint colocation add Nginx with VirtualIP INFINITY

제약 조건 확인

sudo pcs constraint
Location Constraints:
Ordering Constraints:
Colocation Constraints:
  Nginx with VirtualIP (score:INFINITY)
Ticket Constraints:

 

$ pcs constraint order VirtualIP then webserver
Adding VirtualIP webserver (kind: Mandatory) (Options: first-action=start then-action=start)
$ pcs status resources                         
  * VirtualIP   (ocf:heartbeat:IPaddr2):         Started control1.cluster.local
  * webserver   (ocf:heartbeat:nginx):   Started control1.cluster.local

수동으로 리소스 이동

pcs constraint location webserver prefers node3.cluster.local=INFINITY
$ pcs status resources      
  * VirtualIP   (ocf:heartbeat:IPaddr2):         Started node3.cluster.local
  * webserver   (ocf:heartbeat:nginx):   Started node3.cluster.local
sudo pcs constraint --full
Location Constraints:
Ordering Constraints:
  start VirtualIP then start Nginx (kind:Mandatory) (id:order-VirtualIP-Nginx-mandatory)
Colocation Constraints:
  Nginx with VirtualIP (score:INFINITY) (id:colocation-Nginx-VirtualIP-INFINITY)
Ticket Constraints:

 

 

 

728x90
반응형