개요
기억의 해시된 서비스를 운영하며 장애 발생 시 시스템을 자동으로 복구하거나, 무중단 서비스를 실행하기 위해 고가용성(HA, High Availability) 구성이 필요합니다.
CentOS 7.9 환경에서 대표적인 오픈소스 고가용성 구성 도구인 DRBD와 Pacemaker를 이용하여 고가용성 환경을 구축하는 방법을 자세히 다룰 것입니다.
DRBD란?
정의
DRBD(Distributed Replicated Block Device)는 리눅스 기반 시스템에서 블록 장치를 네트워크를 통해 실시간으로 복제할 수 있도록 설계된 오픈소스 소프트웨어이다. 고가용성(HA)을 제공하는 클러스터 환경에서 두 개 이상의 서버 간 스토리지 레벨의 동기화를 구현하여, 하나의 노드가 장애를 일으키더라도 다른 노드가 동일한 데이터로 서비스를 지속할 수 있게 한다.
동작 원리
DRBD는 로컬 디스크에 기록되는 데이터를 네트워크를 통해 원격 노드의 디스크에도 동일하게 복제하는 방식으로 동작한다.
- 애플리케이션이 DRBD 디바이스에 쓰기 요청
- DRBD는 로컬 디스크와 원격 노드의 DRBD 디바이스에 동시에 데이터 기록
- 두 노드의 쓰기 완료를 확인한 후 애플리케이션에 완료 응답
- 이 과정을 통해 항상 동기화된 스토리지를 유지함
- DRBD는 Primary/Secondary 구조로 작동
- Primary는 읽기/쓰기 가능, Secondary는 읽기 만 가능
- 데이터는 local disk에 쓰기 전에 peer로 전송
- /dev/drbd0같은 값의 가상 블록 장치 형태
구성 요소
구성 요소 | 설명 |
---|---|
drbd kernel module | 커널 수준에서 동작하는 드라이버, 블록 장치 복제를 담당 |
drbdadm, drbdsetup | 사용자 공간에서 설정 및 관리 명령어 제공 |
drbd.conf | DRBD 리소스 정의 및 동작 설정 파일 |
/dev/drbdX | DRBD가 제공하는 가상 블록 장치 (예: /dev/drbd0) |
작동 모드
- Primary/Secondary 모드: 한 노드만 데이터에 쓰기 가능 (가장 일반적인 구성)
- Primary/Primary 모드: 양쪽 노드 모두 읽기/쓰기가 가능 (클러스터 파일시스템 필요)
동기화 방식
- Sync (동기 복제): 로컬, 원격 디스크 모두 쓰기 완료 시 응답 (높은 일관성)
- Async (비동기 복제): 로컬 쓰기 완료 후 응답, 이후 원격으로 전송 (성능 우선)
사용 사례
- Pacemaker와 연동하여 고가용성 클러스터 구성
- 데이터 손실 없는 장애 복구 환경 구성
- DRBD + Filesystem + Virtual IP로 Active-Passive 스토리지 구성
주요 특징 요약
항목 | 설명 |
---|---|
고가용성 스토리지 제공 | 두 노드 간의 실시간 데이터 복제를 통해 서비스 연속성 보장 |
블록 수준 복제 | 파일 시스템이 아닌 블록 단위에서 데이터 복제 수행 |
동기/비동기 복제 지원 | 높은 일관성(동기) 또는 빠른 응답(비동기) 선택 가능 |
다양한 구성 지원 | Primary/Secondary, Primary/Primary 모드 모두 가능 |
리눅스 커널 통합 | 커널 모듈로 작동하여 성능과 안정성 보장 |
Pacemaker 연동 용이 | 고가용성 클러스터 구성 시 유기적으로 통합 가능 |
디스크 자원 재사용 가능 | 기존 디스크 파티션을 그대로 DRBD 리소스로 활용 가능 |
네트워크 기반 복제 | SAN 없이도 이더넷만으로 데이터 복제 가능 |
스플릿 브레인 방지 기능 | STONITH, fencing 등을 통한 데이터 무결성 유지 |
장애 복구 자동화 | 한 노드 장애 시 자동으로 다른 노드에서 서비스 재개 |
DRBD는 이러한 특징들을 바탕으로 고가용성과 데이터 무결성이 중요한 인프라에서 핵심적인 역할을 수행한다.
Pacemaker란?
정의
Pacemaker는 고가용성(High Availability, HA)을 보장하기 위한 클러스터 리소스 관리자(Resource Manager)로, 리눅스 기반 시스템에서 다양한 서비스를 장애 없이 지속적으로 운영할 수 있도록 돕는다. 노드 장애나 리소스 실패 발생 시 자동으로 감지하고 정의된 정책에 따라 리소스를 다른 노드로 이전(Failover)시키는 것이 핵심 기능이다.
아키텍처 구성요소
클러스터 통신 계층
- Corosync 또는 Heartbeat를 백엔드로 사용
- 노드 간 통신, 장애 감지, Quorum 판단 기능 제공
Cluster Information Base (CIB)
- XML 기반으로 클러스터 설정, 리소스 상태, 정책 등을 저장
- 클러스터 전체의 실시간 정보를 포함함
Policy Engine (PE)
- 장애 발생 시 CIB 정보를 기반으로 조치 판단
- 리소스 시작/중지, 이동 등의 작업 순서를 결정
Local Resource Manager (LRM)
- 로컬 노드에서 실제 리소스를 제어하는 역할
- 리소스 상태 모니터링 및 제어 담당
Fencing / STONITH
- 실패한 노드의 강제 종료
- 클러스터 분할(brain split) 방지
- STONITH = Shoot The Other Node In The Head
동작 원리
- Corosync가 노드 간 통신 및 상태 감지
- 장애 감지 시 CIB에서 설정된 정책을 PE가 판단
- LRM을 통해 리소스 시작/중지/이동 수행
- 상태 변경 사항은 CIB에 반영되어 전체 클러스터에 공유
장애처리 정책
- on-fail=restart: 리소스 실패 시 재시작
- on-fail=standby: 노드를 대기 상태로 전환
- migration-threshold: 허용된 실패 횟수 초과 시 페일오버
고급 기능
- Clone Resource: 리소스를 다중 노드에 동시에 실행
- Master/Slave Resource: DRBD 같은 주종 리소스 정의
- Resource Stickiness: 동일 노드 유지 선호도 설정
- Quorum 설정: 노드 과반수 유지 여부 기준
주요 특징 요약
항목 | 설명 |
---|---|
고가용성 제공 | 장애 발생 시 자동으로 리소스를 다른 노드에 이전하여 서비스 중단 최소화 |
정책 기반 제어 | 리소스의 실행 조건, 우선순위, 실행 순서 등을 세부적으로 설정 가능 |
자동 복구 | 리소스 오류나 노드 장애 시 자동으로 재시작 또는 다른 노드로 페일오버 수행 |
분산 구조 및 확장성 | 2노드 이상의 클러스터 구성 가능, 다양한 리소스 동시 관리 가능 |
STONITH 통한 노드 격리 | 장애 노드를 강제 종료하여 클러스터 일관성 보장 (Split-brain 방지) |
강력한 리소스 추적 | 각 리소스의 상태 및 실패 내역을 세밀하게 모니터링 가능 |
다양한 리소스 지원 | IP, 파일시스템, 스크립트, systemd 서비스, DRBD 등 다양한 리소스 관리 가능 |
CRM 기반 보고서 도구 | 문제 발생 시 crm_report 명령으로 클러스터 이슈 진단 자료 수집 가능 |
명령어 기반 구성 가능 | pcs 명령어로 전체 클러스터 설정 자동화 가능 |
모니터링 주기 설정 | 리소스별로 상태 점검 주기 설정 가능하여 세밀한 제어 가능 |
Pacemaker는 이러한 특징들을 기반으로 기업용 서비스에 필수적인 무중단 서비스 환경을 구축하는 데 최적화된 도구입니다.
DRBD + Pacemaker 함께 사용하는 이유
- DRBD로 데이터 복제
- Pacemaker로 리소스 모니터링 및 failover 처리
함계해서 시스템 전체의 HA 구성 가능
예시 구성 가능 리소스
- DRBD 장치 → Filesystem → IP → Apache/DB
사전 준비사항
항목 | 설명 |
---|---|
OS | CentOS 7.9 (모든 노드 동일) |
서비 수 | 2대 (Node1, Node2) |
패키지 | drbd, pacemaker, pcs, corosync |
시간 동기화 | chronyd 또는 ntpd 필수 |
방화범 | 관련 포트 오픈 (TCP 7789, TCP 2224, UDP 5404~5405) |
SELinux | permissive 또는 비활성화 권장 |
설치 및 구성 절차
DRBD 설치 및 설정
yum install -y epel-release elrepo-release
yum install -y drbd-dkms drbd-utils kmod-drbd
⚠️ 설치 오류 발생 시 대안
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* elrepo: ftp.yz.yamagata-u.ac.jp
* epel: d2lzkl7pfhq30w.cloudfront.net
No package drbd-dkms available.
Package drbd-utils-9.17.0-1.el7.x86_64 already installed and latest version
No package kmod-drbd available.
# 위와 같이 패키지 설치가 안될 경우 아래 방법으로 설치
yum install -y epel-release gcc make flex bison patch \
kernel-devel-$(uname -r) elfutils-libelf-devel \
openssl-devel xmlto asciidoc wget
cd /usr/src
wget https://linbit.com/downloads/drbd/9.0/drbd-9.0.29-1.tar.gz
tar -xzf drbd-9.0.29-1.tar.gz
cd drbd-9.0.29-1
make clean
make KDIR=/usr/src/kernels/$(uname -r)
make install
depmod -a
modprobe drbd
lsmod | grep drbd
modinfo drbd
✅ 추가 구성요소 개발 정보
- ✅ drbd-dkms
- DKMS 기반으로 커널 업데이트 시 자동으로 모듈 재컴파일
/usr/src/drbd*/
에 소스가 저장되어 관리
✅ drbd-utils
- 리소스 설정 및 제어를 위한 명령어 모음 (drbdadm, drbdsetup 등)
/etc/drbd.d/*.res
설정 파일 기반으로 동작
✅ kmod-drbd
- 정적 커널 모듈 방식으로
/lib/modules/$(uname -r)/extra/drbd.ko
에 설치 - 안정성이 높은 환경에 적합하지만 커널 업데이트 시 수동 재설치 필요
/etc/drbd.d/r0.res 설정 예시
resource r0 {
device /dev/drbd0; # DRBD 장치 이름 (가상 블록 디바이스)
disk /dev/sdb1; # 실제 물리 디스크 또는 파티션 경로
meta-disk internal;
on node1 {
address 192.168.1.1:7789;
node-id 0;
}
on node2 {
address 192.168.1.2:7789;
node-id 1;
}
}
# 실제 물리 디스크는 반드시 umount & 초기화되어 있어야 합니다.
# 아래는 예시입니다.
umount /dev/sdb1
wipefs -a /dev/sdb1
drbdadm create-md r0
drbdadm up r0
# UP 확인 명령어
drbdsetup status
########################################
# 여기까지 Primary & Secondary 모두 수행 #
########################################
# Primary로 승격
drbdadm -- --overwrite-data-of-peer primary r0
# drbdadm -- --overwrite-data-of-peer primary r0 명령어가 안될 경우 아래 명령어 실행
# Primary로 강제 승격
drbdadm -- --force primary r0
📊 DRBD 프로토콜 종류 요약
프로토콜 | 설명 |
---|---|
A | 가장 빠름, 쓰기 완료를 로컬 디스크에만 반영 후 ACK → 원격 노드로 전송은 하지만 기다리지 않음 → ⚠ 데이터 유실 가능성 존재 |
B | 로컬 디스크 + 원격 노드 메모리에 도달해야 ACK → 네트워크 전송 성공까지는 보장 |
C | 가장 안전함. 로컬 + 원격 디스크 기록 완료까지 대기 후 ACK → 동기식 복제 방식 → 💡 실무에서 가장 많이 사용 |
📌 실무 권장사항
- 데이터 무결성이 중요한 경우 → Protocol C 사용 권장
- 비동기 복제가 필요하거나 성능이 우선인 경우 → Protocol A 또는 B도 가능 (주의 필요)
Filesystem 및 Mount(Primary 노드)
mkfs.ext4 /dev/drbd0
mkdir /data
mount /dev/drbd0 /data
Pacemaker 및 Corosync 설치
yum install -y pacemaker pcs corosync
systemctl enable pcsd --now
echo password | passwd hacluster --stdin
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
systemctl enable --now pacemaker corosync
클래스터 구성
pcs cluster auth node1 node2
pcs cluster setup --name mycluster node1 node2
pcs cluster start --all
pcs cluster enable --all
# 오류 발생 시 Error: nodes availability check failed, use --force to override. WARNING: This will destroy existing cluster on the nodes. You should remove the nodes from their clusters instead to keep the clusters working properly.
# 모든 노드에서 클러스터 삭제
pcs cluster stop --all
pcs cluster destroy
리소스 등록
pcs property set stonith-enabled=false
pcs resource defaults resource-stickiness=100
pcs resource create drbd_res ocf:linbit:drbd drbd_resource=r0 op monitor interval=15s
# Master(Primary)에서 진행
pcs resource master drbd_master drbd_res \
master-max=1 \ # 동시에 master가 될 수 있는 노드는 1개
master-node-max=1 \ # 한 노드에서 master가 될 수 있는 인스턴스는 최대 1개
clone-max=2 \ # 클러스터 전체에서 클론 인스턴스는 최대 2개 (노드 2개)
clone-node-max=1 \ # 한 노드당 1개만 클론 인스턴스 생성
notify=true # 상태 변화 시 notification (promote/demote) 동작 활성화
pcs resource create fs_res Filesystem device=/dev/drbd0 directory=/data fstype=ext4
pcs resource create vip_res IPaddr2 ip=192.168.1.100 cidr_netmask=24
pcs constraint order promote drbd_master then start fs_res
pcs constraint order start fs_res then start vip_res
pcs constraint colocation add fs_res with drbd_master INFINITY with-rsc-role=Master
pcs constraint colocation add vip_res with fs_res INFINITY
# 에러 발생
pcs resource create drbd_res ocf:linbit:drbd drbd_resource=r0 op monitor interval=15s
Error: Agent 'ocf:linbit:drbd' is not installed or does not provide valid metadata: Metadata query for ocf:linbit:drbd failed: Input/output error, use --force to override
# 해결 방법
mkdir -p /usr/lib/ocf/resource.d/linbit/
wget -O /usr/lib/ocf/resource.d/linbit/drbd https://raw.githubusercontent.com/LINBIT/drbd-utils/master/scripts/drbd.ocf
chmod +x /usr/lib/ocf/resource.d/linbit/drbd
/usr/lib/ocf/resource.d/linbit/drbd meta-data #스크립트 정상 동작 확인 명령
다시 pcs resource create drbd_res ocf:linbit:drbd drbd_resource=r0 op monitor interval=15s
# 에러 발생
/usr/lib/ocf/resource.d/linbit/drbd: line 636:
/usr/lib/ocf/resource.d/linbit/drbd.shellfuncs.sh: No such file or directory
wget -O /usr/lib/ocf/resource.d/linbit/drbd.shellfuncs.sh https://raw.githubusercontent.com/LINBIT/drbd-utils/master/scripts/drbd.shellfuncs.sh
chmod +x /usr/lib/ocf/resource.d/linbit/drbd.shellfuncs.sh
# 다시 확인
/usr/lib/ocf/resource.d/linbit/drbd meta-data
구축 확인 사항
pcs status
으로 리소스 상태 확인drbdadm status
로 동기화 여부 확인- vip ping 테스트
- 노드 장애 시 failover 동작 확인
페일오버(failover) 테스트
구성 지운
[node-001] ← DRBD Master + /dev/drbd0 → /data + VIP: 192.168.0.100 + NFS Server
[node-002] ← DRBD Secondary (Pacemaker + DRBD standby)
[node-003] ← NFS Client (VIP 이용 /data 마운트)
NFS Server 설치 (노드 2개 당)
yum install -y nfs-utils
/data 공유 가이드 설정 (node-001 / node-002 모두)
echo "/data *(rw,no_root_squash,sync)" > /etc/exports
exportfs -r
systemctl restart nfs
systemctl enable nfs
node-003 mount 및 node-001 (node-001 / node-003)
아래와 같이 작업을 한 후 node-003에서 확인하였을 때 VIP로 연결한 파일서버는 끊기지 않고 정상 사용 가능한 것을 확인할 수 있다.
# node-003
mount -t nfs [VIP]:/mount_target /mount_point
ex) mount -t nfs 192.168.0.100:/data /data
# node-001
reboot or init 0
마무리 및 실무 핀
사용 장점
- DRBD + Pacemaker = 실시간 복제 + failover 가능
- 오픈소스로 무중단 서비스 구성 가능
권장 구성
- STONITH(노드 강제 복구) 활성화
- quorum, fencing 고도
- 리소스 의연관 명확히 설정
유의 사항
- DRBD는 네트워크 품질에 매우 무게기
- Filesystem은 항상 primary 노드에서만 mount
- 장애 후 sync 시 성능 저하 가능