[Redundancy] 10. DRBD의 Failover (NFS + DRBD + Keepalived 구성)

Date:     Updated:

카테고리:

태그:


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 설정

21312

$ 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

3333


▶ Failback

312312321


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 역할 수행

monitor

REDUNDANCY 카테고리 내 다른 글 보러가기

댓글 남기기