고가용성 클러스터

고가용성 클러스터

학습 목표

이 문서를 통해 다음을 학습합니다:

  • 고가용성(HA) 클러스터의 개념
  • Pacemaker와 Corosync 설정
  • DRBD를 이용한 스토리지 복제
  • 페일오버와 Fencing

난이도: ⭐⭐⭐⭐⭐ (최고급)


목차

  1. 고가용성 개요
  2. Corosync 설정
  3. Pacemaker 설정
  4. 리소스 관리
  5. DRBD 설정
  6. Fencing (STONITH)
  7. 실전 클러스터 구성

1. 고가용성 개요

HA 클러스터 아키텍처

┌─────────────────────────────────────────────────────────────┐
│                    HA Cluster                               │
│                                                             │
│  ┌───────────────────┐       ┌───────────────────┐         │
│  │      Node 1       │       │      Node 2       │         │
│  │   (Active)        │       │   (Standby)       │         │
│  │                   │       │                   │         │
│  │  ┌─────────────┐  │       │  ┌─────────────┐  │         │
│  │  │ Pacemaker   │◄─┼───────┼─►│ Pacemaker   │  │         │
│  │  └─────────────┘  │       │  └─────────────┘  │         │
│  │         │         │       │         │         │         │
│  │  ┌─────────────┐  │       │  ┌─────────────┐  │         │
│  │  │  Corosync   │◄─┼───────┼─►│  Corosync   │  │         │
│  │  └─────────────┘  │       │  └─────────────┘  │         │
│  │         │         │       │         │         │         │
│  │  ┌─────────────┐  │       │  ┌─────────────┐  │         │
│  │  │   DRBD      │◄─┼───────┼─►│   DRBD      │  │         │
│  │  │  (Primary)  │  │       │  │ (Secondary) │  │         │
│  │  └─────────────┘  │       │  └─────────────┘  │         │
│  │         │         │       │                   │         │
│  │  ┌─────────────┐  │       │                   │         │
│  │  │ Application │  │       │                   │         │
│  │  │  (Running)  │  │       │                   │         │
│  │  └─────────────┘  │       │                   │         │
│  └───────────────────┘       └───────────────────┘         │
│             │                                               │
│             ▼                                               │
│      ┌─────────────┐                                       │
│      │  Virtual IP │  ← 클라이언트 접속점                   │
│      └─────────────┘                                       │
└─────────────────────────────────────────────────────────────┘

HA 구성 요소

구성 요소 역할
Corosync 클러스터 통신 및 멤버십 관리
Pacemaker 리소스 관리 및 페일오버
DRBD 블록 레벨 스토리지 복제
STONITH/Fencing Split-brain 방지

패키지 설치

# Ubuntu/Debian
sudo apt install pacemaker corosync pcs resource-agents fence-agents

# RHEL/CentOS
sudo yum install pacemaker corosync pcs resource-agents fence-agents-all

2. Corosync 설정

기본 설정

# /etc/corosync/corosync.conf
totem {
    version: 2
    cluster_name: mycluster
    transport: knet

    crypto_cipher: aes256
    crypto_hash: sha256

    interface {
        ringnumber: 0
        bindnetaddr: 192.168.1.0
        mcastport: 5405
    }
}

logging {
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
    to_syslog: yes
    timestamp: on
}

quorum {
    provider: corosync_votequorum
    two_node: 1
    wait_for_all: 1
}

nodelist {
    node {
        ring0_addr: node1.example.com
        nodeid: 1
    }
    node {
        ring0_addr: node2.example.com
        nodeid: 2
    }
}

pcs를 이용한 클러스터 설정

# pcsd 서비스 시작
sudo systemctl enable pcsd
sudo systemctl start pcsd

# hacluster 사용자 비밀번호 설정 (모든 노드)
sudo passwd hacluster

# 노드 인증 (한 노드에서 실행)
sudo pcs host auth node1 node2

# 클러스터 생성
sudo pcs cluster setup mycluster node1 node2

# 클러스터 시작
sudo pcs cluster start --all

# 클러스터 활성화 (부팅 시 자동 시작)
sudo pcs cluster enable --all

# 상태 확인
sudo pcs cluster status
sudo pcs status

Corosync 상태 확인

# 멤버십 확인
sudo corosync-cmapctl | grep members

# 쿼럼 상태
sudo corosync-quorumtool

# 링 상태
sudo corosync-cfgtool -s

3. Pacemaker 설정

클러스터 속성 설정

# STONITH 비활성화 (테스트용, 운영에서는 필수)
sudo pcs property set stonith-enabled=false

# 쿼럼 정책
sudo pcs property set no-quorum-policy=ignore  # 2노드 클러스터

# 기본 스티키니스 (리소스 이동 방지)
sudo pcs resource defaults update resource-stickiness=100

# 속성 확인
sudo pcs property list

클러스터 상태 확인

# 전체 상태
sudo pcs status

# 리소스 상태
sudo pcs resource status

# 노드 상태
sudo pcs node status

# 제약 조건
sudo pcs constraint list --full

# 클러스터 설정 확인
sudo pcs config

4. 리소스 관리

기본 리소스 생성

# Virtual IP 리소스
sudo pcs resource create VirtualIP ocf:heartbeat:IPaddr2 \
    ip=192.168.1.100 \
    cidr_netmask=24 \
    op monitor interval=30s

# 웹 서버 리소스
sudo pcs resource create WebServer ocf:heartbeat:nginx \
    configfile=/etc/nginx/nginx.conf \
    op start timeout=40s \
    op stop timeout=60s \
    op monitor interval=10s

# 파일시스템 리소스
sudo pcs resource create WebFS ocf:heartbeat:Filesystem \
    device=/dev/drbd0 \
    directory=/var/www \
    fstype=ext4 \
    op start timeout=60s \
    op stop timeout=60s

리소스 그룹

# 그룹 생성 (순서대로 시작, 역순으로 중지)
sudo pcs resource group add WebGroup \
    WebFS \
    VirtualIP \
    WebServer

# 그룹 상태 확인
sudo pcs resource show WebGroup

리소스 제약 조건

# 위치 제약 (특정 노드 선호)
sudo pcs constraint location WebServer prefers node1=100
sudo pcs constraint location WebServer avoids node2

# 순서 제약 (시작 순서)
sudo pcs constraint order WebFS then VirtualIP then WebServer

# 콜로케이션 제약 (같은 노드에서 실행)
sudo pcs constraint colocation add WebServer with VirtualIP INFINITY
sudo pcs constraint colocation add VirtualIP with WebFS INFINITY

# 제약 조건 확인
sudo pcs constraint list --full

리소스 관리 명령

# 리소스 시작/중지
sudo pcs resource enable WebServer
sudo pcs resource disable WebServer

# 리소스 이동 (수동 페일오버)
sudo pcs resource move WebServer node2

# 이동 제약 제거 (원래 위치로 돌아갈 수 있게)
sudo pcs resource clear WebServer

# 리소스 재시작
sudo pcs resource restart WebServer

# 리소스 삭제
sudo pcs resource delete WebServer

5. DRBD 설정

DRBD 설치

# Ubuntu/Debian
sudo apt install drbd-utils

# RHEL/CentOS (ELRepo 사용)
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo yum install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
sudo yum install drbd90-utils kmod-drbd90

DRBD 리소스 설정

# /etc/drbd.d/r0.res (양쪽 노드 동일)
resource r0 {
    protocol C;

    startup {
        wfc-timeout  15;
        degr-wfc-timeout 60;
    }

    net {
        cram-hmac-alg sha1;
        shared-secret "mysecret123";
    }

    disk {
        on-io-error detach;
    }

    on node1 {
        device    /dev/drbd0;
        disk      /dev/sdb1;
        address   192.168.1.11:7788;
        meta-disk internal;
    }

    on node2 {
        device    /dev/drbd0;
        disk      /dev/sdb1;
        address   192.168.1.12:7788;
        meta-disk internal;
    }
}

DRBD 초기화

# 메타데이터 생성 (양쪽 노드)
sudo drbdadm create-md r0

# DRBD 시작 (양쪽 노드)
sudo drbdadm up r0

# Primary 설정 (한 노드에서만)
sudo drbdadm primary --force r0

# 상태 확인
cat /proc/drbd
sudo drbdadm status

# 파일시스템 생성 (Primary에서)
sudo mkfs.ext4 /dev/drbd0

Pacemaker와 DRBD 통합

# DRBD 리소스 생성
sudo pcs resource create DRBD ocf:linbit:drbd \
    drbd_resource=r0 \
    op monitor interval=60s

# 마스터/슬레이브 설정
sudo pcs resource promotable DRBD \
    promoted-max=1 \
    clone-max=2 \
    notify=true

# 파일시스템 리소스
sudo pcs resource create WebFS ocf:heartbeat:Filesystem \
    device=/dev/drbd0 \
    directory=/var/www \
    fstype=ext4

# 제약 조건: WebFS는 DRBD Primary에서만
sudo pcs constraint colocation add WebFS with DRBD-clone INFINITY with-rsc-role=Master
sudo pcs constraint order promote DRBD-clone then start WebFS

DRBD 상태 확인

# 상태 확인
sudo drbdadm status
sudo drbdadm dstate r0
sudo drbdadm cstate r0
sudo drbdadm role r0

# 동기화 상태
cat /proc/drbd

# 예시 출력:
# version: 8.4.11
#  0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

6. Fencing (STONITH)

Fencing 개요

┌─────────────────────────────────────────────────────────────┐
│                    Split-Brain 상황                         │
│                                                             │
│  ┌───────────┐     네트워크 단절     ┌───────────┐         │
│  │   Node1   │ ────────X──────────  │   Node2   │         │
│  │ (Primary) │                       │ (Primary) │ ← 위험! │
│  └───────────┘                       └───────────┘         │
│       │                                     │               │
│       └─────────────┬───────────────────────┘               │
│                     │                                       │
│              ┌──────┴──────┐                               │
│              │ Shared Data │ ← 데이터 손상 가능!            │
│              └─────────────┘                               │
│                                                             │
│  해결책: STONITH (Shoot The Other Node In The Head)        │
│  - 문제가 있는 노드를 강제로 리셋/전원 차단                 │
└─────────────────────────────────────────────────────────────┘

가상환경 Fencing (fence_virsh)

# fence_virsh 에이전트 테스트
sudo fence_virsh -a qemu+ssh://hypervisor -l root \
    -p password -n vm-node1 -o status

# Pacemaker 리소스 설정
sudo pcs stonith create fence_node1 fence_virsh \
    pcmk_host_list="node1" \
    ipaddr="qemu+ssh://hypervisor" \
    login="root" \
    passwd="password" \
    port="vm-node1" \
    ssl_insecure=1

sudo pcs stonith create fence_node2 fence_virsh \
    pcmk_host_list="node2" \
    ipaddr="qemu+ssh://hypervisor" \
    login="root" \
    passwd="password" \
    port="vm-node2" \
    ssl_insecure=1

# 위치 제약 (자신의 노드에서 실행되지 않도록)
sudo pcs constraint location fence_node1 avoids node1
sudo pcs constraint location fence_node2 avoids node2

IPMI Fencing

# fence_ipmilan 에이전트
sudo pcs stonith create fence_node1_ipmi fence_ipmilan \
    pcmk_host_list="node1" \
    ipaddr="192.168.1.101" \
    login="admin" \
    passwd="password" \
    lanplus=1 \
    power_timeout=20

sudo pcs stonith create fence_node2_ipmi fence_ipmilan \
    pcmk_host_list="node2" \
    ipaddr="192.168.1.102" \
    login="admin" \
    passwd="password" \
    lanplus=1 \
    power_timeout=20

클라우드 Fencing

# AWS (fence_aws)
sudo pcs stonith create fence_aws fence_aws \
    pcmk_host_map="node1:i-0123456789abcdef0;node2:i-0fedcba9876543210" \
    region="ap-northeast-2" \
    power_timeout=60

# GCP (fence_gce)
sudo pcs stonith create fence_gcp fence_gce \
    pcmk_host_map="node1:instance-1;node2:instance-2" \
    project="my-project" \
    zone="asia-northeast3-a"

Fencing 테스트

# STONITH 활성화
sudo pcs property set stonith-enabled=true

# Fencing 테스트
sudo stonith_admin --reboot node2 --verbose

# 수동으로 노드 fence
sudo pcs stonith fence node2

# Fencing 히스토리
sudo stonith_admin --history node2

7. 실전 클러스터 구성

2노드 웹 서버 클러스터

#!/bin/bash
# setup-ha-cluster.sh

# 클러스터 설정
pcs cluster setup mycluster node1 node2

# 클러스터 시작
pcs cluster start --all
pcs cluster enable --all

# 속성 설정
pcs property set stonith-enabled=true
pcs property set no-quorum-policy=ignore

# STONITH 리소스 (예: IPMI)
pcs stonith create fence_node1 fence_ipmilan \
    pcmk_host_list="node1" \
    ipaddr="10.0.0.101" login="admin" passwd="password" lanplus=1

pcs stonith create fence_node2 fence_ipmilan \
    pcmk_host_list="node2" \
    ipaddr="10.0.0.102" login="admin" passwd="password" lanplus=1

pcs constraint location fence_node1 avoids node1
pcs constraint location fence_node2 avoids node2

# DRBD 리소스
pcs resource create DRBD ocf:linbit:drbd drbd_resource=r0 \
    op monitor interval=60s
pcs resource promotable DRBD promoted-max=1 clone-max=2 notify=true

# 파일시스템 리소스
pcs resource create WebFS ocf:heartbeat:Filesystem \
    device=/dev/drbd0 directory=/var/www fstype=ext4

# VIP 리소스
pcs resource create VIP ocf:heartbeat:IPaddr2 \
    ip=192.168.1.100 cidr_netmask=24

# 웹 서버 리소스
pcs resource create WebServer ocf:heartbeat:nginx \
    configfile=/etc/nginx/nginx.conf

# 리소스 그룹
pcs resource group add WebGroup WebFS VIP WebServer

# 제약 조건
pcs constraint colocation add WebGroup with DRBD-clone INFINITY with-rsc-role=Master
pcs constraint order promote DRBD-clone then start WebGroup

# 상태 확인
pcs status

페일오버 테스트

# 현재 상태 확인
pcs status

# 수동 페일오버 테스트
pcs resource move WebGroup node2

# 노드 standby 모드
pcs node standby node1

# standby 해제
pcs node unstandby node1

# 시뮬레이션 (리소스 강제 중지)
pcs resource debug-stop WebServer

# 페일백 (원래 노드로 복귀)
pcs resource clear WebGroup

모니터링

# 실시간 상태 모니터링
watch -n 1 'pcs status'

# 클러스터 이벤트 로그
sudo journalctl -u pacemaker -f

# crm_mon (상세 모니터링)
sudo crm_mon -1
sudo crm_mon -Afr  # 전체 정보, 페일카운트, 리소스

# 리소스 히스토리
pcs resource history show WebServer

연습 문제

문제 1: 클러스터 설정

pcs를 사용하여 2노드 클러스터를 설정하는 명령 순서를 작성하세요.

문제 2: 리소스 그룹

VIP (192.168.1.200), 파일시스템 (/dev/sdb1 → /data), PostgreSQL 서비스를 포함하는 리소스 그룹을 생성하세요.

문제 3: DRBD 복제

DRBD 리소스 r0의 현재 상태와 동기화 상태를 확인하는 명령을 작성하세요.


정답

문제 1 정답

# 1. pcsd 시작 및 인증
sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo passwd hacluster
sudo pcs host auth node1 node2

# 2. 클러스터 생성 및 시작
sudo pcs cluster setup mycluster node1 node2
sudo pcs cluster start --all
sudo pcs cluster enable --all

# 3. 기본 속성 설정
sudo pcs property set stonith-enabled=false  # 테스트용
sudo pcs property set no-quorum-policy=ignore

문제 2 정답

# VIP 리소스
sudo pcs resource create VIP ocf:heartbeat:IPaddr2 \
    ip=192.168.1.200 cidr_netmask=24

# 파일시스템 리소스
sudo pcs resource create DataFS ocf:heartbeat:Filesystem \
    device=/dev/sdb1 directory=/data fstype=ext4

# PostgreSQL 리소스
sudo pcs resource create PostgreSQL ocf:heartbeat:pgsql \
    pgctl=/usr/lib/postgresql/14/bin/pg_ctl \
    pgdata=/var/lib/postgresql/14/main \
    op start timeout=60s \
    op stop timeout=60s \
    op monitor interval=10s

# 그룹 생성
sudo pcs resource group add DBGroup DataFS VIP PostgreSQL

# 순서 제약 (명시적)
sudo pcs constraint order DataFS then VIP then PostgreSQL

문제 3 정답

# DRBD 상태 확인
sudo drbdadm status r0

# /proc/drbd 확인
cat /proc/drbd

# 연결 상태
sudo drbdadm cstate r0

# 디스크 상태
sudo drbdadm dstate r0

# 역할 확인
sudo drbdadm role r0

# 상세 상태 (모든 리소스)
sudo drbdadm status all

다음 단계


참고 자료

to navigate between lessons