[Redundancy] 10. DRBD의 Failover (NFS + DRBD + Keepalived 구성)
카테고리: REDUNDANCY
태그: redundancy linux
10-1. DRBD + Keepalived 구성
DRBD는 마스터 서버에 문제가 발생하더라도 백업 서버가 자동적으로 마스터 서버가 되지는 않는다. 따라서 keepalived를 이용해서 Failover/Failback 할 수 있도록 한다.
■ DRBD 설치 및 설정
-----------+----------------------------------------------+-----------------------+---
| | |
|192.168.219.134 |192.168.219.135 |
+----------+-----------+ +----------+-----------+ |
| [ dlp.test.srv ] | VRRP | [ node01.test.srv ] | |
| DRBD |-----------------------| DRBD | |
| NFS Server | vip: 192.168.219.100 | NFS Server | |
| Keepalived | | Keepalived | |
+----------------------+ +----------------------+ |
|
------------+-----------------------------------------------------------------+---
|
|192.168.219.136
+-----------+----------+
| [ node02.test.srv ] |
| NFS Client |
+----------------------+
# 1) 스토리지 준비 (/dev/sdb) - (NFS Server) Active, Backup 노드 모두 적용
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 19.1G 0 disk
├─sda1 8:1 0 19G 0 part /
├─sda14 8:14 0 1M 0 part
└─sda15 8:15 0 64M 0 part /boot/efi
sdb 8:16 0 20G 0 disk
# 2-1) 만약 해당 예제가 안되면 SELinux 문제일 가능성이 높다.
$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled # <<-- disabled 변경
# 2-2) 방화벽 해제
$ systemctl stop firewalld
$ systemctl disable firewalld
# 3) DRBD, Keepalived 설치 및 설정 - (NFS Server) Active, Backup 노드 모두 적용
{
echo "DRBD 설치 시작"
dnf -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
dnf -y install drbd90-utils kmod-drbd90
systemctl enable --now drbd
sleep 1
parted -s -a optimal -- /dev/sdb mklabel gpt
sleep 1
parted -s -a optimal -- /dev/sdb mkpart primary 0% 100%
sleep 1
pvcreate /dev/sdb1
sleep 1
vgcreate drbdpool /dev/sdb1
sleep 1
lvcreate -n drbdata -l100%FREE drbdpool
sleep 1
cat <<EOF >> /etc/drbd.d/resource0.res
resource resource0 {
protocol C;
on dlp.test.srv {
device /dev/drbd0;
disk /dev/mapper/drbdpool-drbdata;
address 192.168.219.134:7789;
meta-disk internal;
}
on node01.test.srv {
device /dev/drbd0;
disk /dev/mapper/drbdpool-drbdata;
address 192.168.219.135:7789;
meta-disk internal;
}
}
EOF
echo "Keepalived 설치 시작"
echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
dnf -y install keepalived
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
cat <<EOF >> /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER # Backup 서버는 BACKUP으로 변경
interface ens32
virtual_router_id 51
priority 101 # Backup 서버는 100으로 설정
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.219.100/24
}
}
EOF
systemctl enable --now keepalived
ip addr
echo "설치 및 설정 완료"
}
# 4) DRDB 리소스 초기화 - (NFS Server) Active, Backup 노드 모두 적용
{
drbdadm create-md resource0
drbdadm up resource0
}
# 5) DRBD Primary 생성 - (NFS Server) Active 노드만 적용
{
drbdadm primary --force resource0
drbdadm status
mkfs.xfs /dev/drbd0
mkdir /mnt/mydrbd
mount /dev/drbd0 /mnt/mydrbd
df -hT /mnt/mydrbd/
}
■ nfs 서버 설치 - Active, Backup 노드 모두 적용
{
dnf -y install nfs-utils
cat <<EOF >> /etc/exports
/mnt/mydrbd 192.168.219.0/24(rw,no_root_squash)
EOF
systemctl enable --now rpcbind nfs-server
}
■ DRBD의 Failover 설정
▶ secondary 상태로 전환 스크립트
# Active/Backup 서버 모두 작성
cat <<EOF > /usr/local/sbin/drbd-backup.sh
#!/bin/sh
systemctl stop nfs-server.service
sudo umount -f /dev/drbd0
sudo rmdir /mnt/mydrbd
sudo drbdadm secondary all
EOF
chmod 755 /usr/local/sbin/drbd-backup.sh
▶ primary 상태로 전환 스크립트
# Active/Backup 서버 모두 작성
cat <<EOF > /usr/local/sbin/drbd-master.sh
#!/bin/sh
sudo drbdadm primary all
sudo mkdir /mnt/mydrbd
sudo mount /dev/drbd0 /mnt/mydrbd
systemctl restart nfs-server.service
EOF
chmod 755 /usr/local/sbin/drbd-master.sh
▶ DRBD - keepalived 설정
$ vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.219.100/24
}
# 아래 부분 Master/Backup 서버 모두 추가
notify_master "/usr/local/sbin/drbd-master.sh"
notify_backup "/usr/local/sbin/drbd-backup.sh"
notify_fault "/usr/local/sbin/drbd-backup.sh"
}
$ systemctl restart keepalived
| 옵션 | 설명 |
|---|---|
| nopreempt | VRRP의 Preemptive mode를 무효화 설정, Preemptive 모드는 기존 마스터보다도 높은 우선순위를 갖는 노드가 기동하면 장애극복이 일어나는데 Preemptive 모드를 무효화하면 이미 마스터 노드가 가동 중일 경우 자신의 우선순위가 높더라도 장애극복을 하지 않는다. (즉, 불필요한 장애극복을 피하기 위해 설정함) |
| notify_master | VRRP가 마스터 상태가 됐을 때 실행하고자 하는 명령을 지정 |
| notify_backup | VRRP가 백업 상태가 됐을 때 실행하고자 하는 명령을 지정 |
| notify_fault | 네트워크 인터페이스가 링크 다운되었을 때 실행하고자 하는 명령을 지정 |
■ nfs 클라이언트 - 설치 및 마운트
{
dnf -y install nfs-utils
mount -t nfs 192.168.219.100:/mnt/mydrbd /mnt
df -hT
}
▶ Failover
▶ Failback
10-2. Keepalived 서비스만 종료되었을 때 - Master/Backup 서버 모두 적용
위 구성은 Keepalived가 종료할 때에는 notify_backup, notify_master의 스크립트가 실행되지 않는다. 이로 인해 Master 서버의 keepalived가 정지하면 Master 서버의 DRBD가 primary 상태인 채로 장애 극복하게 되므로, 백업 서버의 drbd-master는 에러가 된다. 따라서, keepalived가 종료했을 때는 반드시 drbd-backup 스크립트가 실행하도록 해야 한다.
■ Keepalived 서비스를 모니터링하는 서비스 작성
# 1) 스크립트 작성
cat <<EOF > /usr/local/sbin/keepalived-monitoring.sh
#!/bin/bash
[ -f /var/run/vrrp.pid ] && exit
exec 2>&1
trap 'kill -TERM \$PID' TERM
trap 'kill -HUP \$PID' HUP
trap 'kill -INT \$PID' INT
/usr/sbin/keepalived -n -S 1 --vrrp &
PID=\$!
wait \$PID
/usr/local/sbin/drbd-backup.sh
EOF
chmod 755 /usr/local/sbin/keepalived-monitoring.sh
# 2) 서비스 파일 작성
cat <<EOF > /etc/systemd/system/keepalived-monitor.service
[Unit]
Description=Keepalived and DRBD Monitor Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/keepalived-monitoring.sh
Restart=always
RestartSec=10
User=root
[Install]
WantedBy=multi-user.target
EOF
# 3) 서비스 시작/활성화
sudo systemctl start keepalived-monitor
sudo systemctl enable keepalived-monitor
■ Master 서버의 Keepalived 종료 후, Backup 서버가 Master 역할 수행
댓글 남기기