RHCS - Pacemaker 구축

김재현·2023년 8월 4일
0

Red Hat Cluster Suite

목록 보기
3/3
post-thumbnail

KVM 환경에서 Guest OS 노드를 다음과 같이 구성하였다.

  1. Hostname: cs-01 / cs-02
  2. OS: RHEL 8.4
  3. CPU: 4 cores
  4. Memory: 4 GB
  5. Disk
    OS Volume: 20 GB
    Swap: 2 GB
  6. Local Repository 설정
    기존 AppStream/BaseOS 에 High Availability Repo 추가 등록
    HA Repo는 https://access.redhat.com 사이트에서 다운로드 가능
  7. iSCSI 및 Multipath 설정
    각 노드에 initiator 및 multipath 구성

1. 사전 작업

1. 방화벽 및 SELinux 비활성화

cs-01, cs-02 # systemctl disable --now firewalld
cs-01, cs-02 # sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2. 각 노드 Hostname 및 /etc/hosts 설정

cs-01 # hostnamectl set-hostname cs-01 --static
cs-01 # hostnamectl set-hostname cs-02 --static

cs-01, cs-02 # vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

### +Pacemaker Configure
192.168.10.101	cs-01.cs
192.168.10.102	cs-02.cs

cs-01, cs-02 # ping cs-01.cs
cs-01, cs-02 # ping cs-02.cs

3. 공유 볼륨 설정

cs-01, cs-02 # vi /etc/lvm/lvm.conf

...
system_id_source = "uname"

// LVM이 공유 볼륨을 식별하는데 사용하는 소스를 설정한다.

cs-01, cs-02 # cd /boot
cs-01, cs-02 # cp initramfs-4.18.0-305.el8.x86_64.img initramfs-4.18.0-305.el8.x86_64.img.backup
// 기존 initramfs 이미지 백업

cs-01, cs-02 # dracut -fv
// 변경된 lvm.conf 설정을 적용하기 위해 새로운 initramfs 생성

cs-01, cs-02 # shutdown -r now

4. 설정 확인

cs-01, cs-02 # lsinitrd /boot/initramfs-4.18.0-305.el8.x86_64.img -f /etc/lvm/lvm.conf | grep system_id

system_id_source = "uname"

cs-01, cs-02 # systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

cs-01, cs-02 # getenforce

Disabled

5. 공유 볼륨 LVM 설정

cs-01 # fdisk /dev/mapper/mpatha
cs-01 # kpartx -a -v /dev/mapper/mpatha
// 파티셔닝된 블록 디바이스의 파티션들로부터 multipath 디바이스 매핑 정보를 새롭게 생성

cs-01 # pvcreate /dev/mapper/mpatha1
cs-01 # vgcreate csVG /dev/mapper/mpatha1
cs-01 # lvcreate -n csLV -l 100%FREE csVG

cs-01 # vgs

  VG   #PV #LV #SN Attr   VSize   VFree
  csVG   1   1   0 wz--n-   9.99g    0 
  rhel   1   2   0 wz--n- <19.00g    0 

cs-01 # lvs

  LV   VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  csLV csVG -wi-a-----   9.99g                                                 
  root rhel -wi-ao---- <17.00g                                                 
  swap rhel -wi-ao----   2.00g 

cs-01 # mkfs.xfs /dev/csVG/csLV

cs-01 # vgs -o+system_id

  VG   #PV #LV #SN Attr   VSize   VFree System ID
  csVG   1   1   0 wz--n-   9.99g    0  cs-01    
  rhel   1   2   0 wz--n- <19.00g    0    

2. Pacemaker 설치

1. Pacemaker 패키지 설치

cs-01, cs-02 # dnf groupinstall "high availability" -y

2. pcsd daemon 설정 및 시작

cs-01, cs-02 # systemctl enable --now pcsd
cs-01, cs-02 # echo P@ssw0rd | passwd hacluster --stdin

3. Cluster node 설정 및 corosync 시작

cs-01 # pcs host auth cs-01.cs cs-02.cs -u hacluster -p P@ssw0rd
// hacluster 유저를 P@ssw0rd 라는 비밀번호를 사용하여 cs-01, cs-02 노드에 인증을 시도

cs-01 # pcs cluster setup test-cluster cs-01.cs cs-02.cs totem token=15000 join=100
// test-cluster 라는 이름으로 cs-01, cs-02 노드를 포함시키는 클러스터 생성
// totem token: 클러스터 내의 노드간 상태를 체크하기 위해 메시지를 교환하는 기준의 값으로 밀리세컨(ms) 단위로 설정
// join: 다른 노드들과 상태를 동기화하기 위해 노드가 클러스터에 합류할 때까지 대기하는 시간을 설정

cs-01 # pcs cluster start --all

4. Cluster property 설정

cs-01 # pcs property set stonith-enabled=false
// 구축 단계에서 fencing 되는 것을 방지

cs-01 # pcs property set maintenance-mode=false
// 리소스가 자동으로 이동하거나 재시작되지 않는 유지 보수 모드를 해제

cs-01 # pcs resource defaults migration-threshold=1
// 체크 빈도를 설정하는 값으로 fail 발생 시 n번 체크하고 fail-over 진행

cs-01 # pcs resource defaults resource-stickiness=1000
// 클러스터 노드의 스코어 값을 설정
// 스코어 값: 숫자가 높을수록 리소스의 이동 경로가 우선시됨

cs-01 # pcs property

Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: test-cluster
 dc-version: 2.0.5-9.el8-ba59be7122
 have-watchdog: false
 maintenance-mode: false
 stonith-enabled: true

cs-01 # pcs resource defaults

Meta Attrs: rsc_defaults-meta_attributes
  migration-threshold=1
  resource-stickiness=1000

3. Resource 등록

1. VIP 등록

cs-01 # pcs resource create vip IPaddr2 ip=10.65.121.105 cidr_netmask=20 op monitor interval=10s timeout=15s --group web
// op monitor interval: 리소스 모니터링 주기 설정
// timeout: 리소스 상태 확인 최대 시간 설정

2. Volume Group 등록

cs-01 # pcs resource create halvm LVM-activate vgname=csVG activation_mode=exclusive vg_access_mode=system_id op monitor interval=60 timeout=120 on-fail=fence --group=web
// activation_mode: 클러스터에서 VG를 활성화하는 방법으로, exclusive 는 하나의 노드만이 LVM 리소스를 활성화함.

3. File System 등록

cs-01 # pcs resource create fs Filesystem device=/dev/csVG/csLV directory=/var/www/html fstype=xfs op monitor OCF_CHECK_LEVEL=10 --group web
// OCF_CHECK_LEVEL: 레벨에 따라 체크하는 범위가 결정됨.
// 0: 파일 시스템 체크
// 10: 파일 시스템 + Read 가능 여부 체크
// 20: 파일 시스템 + Read/Write 가능 여부 체크

4. Application 등록

어플리케이션 에이전트는 고객으로부터 각 어플리케이션에 알맞은 에이전트를 제공받는게 맞지만, 테스트 환경에서는 제공받을 수 없으므로 아래와 같이 httpd.sh 를 설정한다.
cs-01, cs-02 # dnf -y install httpd
cs-01, cs-02 # vi /etc/init.d/httpd.sh

#!/bin/sh -x
 
## 변수 ##
PUSER=root	#프로세스 소유자
SERVICE=DFOREGROUND	#프로세스 이름
FORCE_SHUTDOWN=yes	#Stop 정상적으로 되지 않을시 강제 Kill 사용 여부 소문자 yes or no
SLEEP_TIME=3	#Start,stop 시 해당 시간 이후에 정상 여부(monitor 함수 사용) 체크
 
 
## 함수 ##  
show_procs() {
ps -U $PUSER -o pid,user,args | grep $SERVICE | grep -v grep
}
 
get_pid() {
    show_procs | awk '{print $1}'	# 첫 번째 행(띄어쓰기 전까지)
}
 
status() {   
    PSNUM=$(show_procs | wc -l)
    if [ $PSNUM -eq 0 ]; then	# $PSNUM이 0이면
        return 1	# return값 1
    else	# 0이 아니면
        return 0	#$PSNUM이 1개 이상, return 값 0
    fi
}
 
process_kill() {
    kill -9 $(get_pid)
}
 
service_start() {
    systemctl start httpd.service
}
 
service_stop() {
    systemctl stop httpd.service
}
 
case $1 in
    start)
        if status; then	# status에서 return 0값을 받았을 때
            echo "$SERVICE is already running"
            exit 0
        fi
        service_start
        sleep $SLEEP_TIME
        if status; then # status에서 return 0값을 받았을 때
            echo "$SERVICE started"
            exit 0 
        else	# start가 안될 때
            echo "$SERVICE start failed"
            exit 1
        fi
        ;;
    stop)
        if ! status; then	# status에서 return 0값이 아닐 때
            echo "$SERVICE already stopped"
            exit 0
        fi
        service_stop
        sleep $SLEEP_TIME
        if ! status; then	# status에서 return 0값이 아닐 때의 반대=1일 때
            echo "$SERVICE stopped"
            exit 0
        else
            echo "$SERVICE stop failed"	# stop이 안될 때
            if [ $FORCE_SHUTDOWN = yes ] ;then	# 해당 변수에 yes로 check 되어있다면
                echo "$SERVICE is killed by cluster PID: " $(get_pid)	# 해당 서비스의 프로세스 kill하겠다.
                process_kill
                sleep $SLEEP_TIME
                if ! status; then
                    exit 0
                fi
            fi
            exit 1
         fi
                ;;
    status)
        if status; then	#status에서 return 0값을 받았을 때
            echo "$SERVICE is running PID: "$(get_pid)
            exit 0
        else	# status에서 return 1값을 받았을 때
            echo "$SERVICE is not running"
            exit 1
        fi
            ;;
esac

cs-01, cs-02 # chmod 755 /etc/init.d/httpd.sh
cs-01, cs-02 # ls /etc/init.d/

cs-01, cs-02 # cd /etc/init.d
cs-01, cs-02 # sh httpd.sh start
cs-01, cs-02 # sh httpd.sh status
// 에이전트 동작 확인

cs-01, cs-02 # sh httpd.sh sttop
cs-01, cs-02 # sh httpd.sh status

cs-01 # pcs resource create httpd lsb:httpd.sh --group web

5. node 우선 순위 제한 설정

cs-01 # pcs constraint location web prefers cs-01.cs=1000
cs-01 # pcs constraint location web prefers cs-02.cs=500
cs-01 # pcs constraint

4. Fence 등록

1. Fence device 설정

cs-01 # pcs stonith create ipmi1 fence_ipmilan pcmk_host_list=cs-01.cs ipaddr=192.168.10.15 login=admin passwd=P@ssw0rd lanplus=on auth=password ipport=5001 op monitor interval=60s delay=15
cs-01 # pcs stonith create ipmi2 fence_ipmilan pcmk_host_list=cs-02.cs ipaddr=192.168.10.15 login=admin passwd=P@ssw0rd lanplus=on auth=password ipport=5002 op monitor interval=60s
// pcmk_host_list: /etc/hosts 에 등록된 노드로 대상을 설정
// ipaddr: vbmc 서버의 Fencing network ip
// login, passwwd: vbmc 서버에 노드 등록 시 사용한 유저의 이름 및 패스워드
// ipport: vbmc 서버에 노드 등록 시 사용한 포트 번호
// delay: split brain 발생 시 양쪽 노드에 fencing signal 전송되는 것을 방지하기 위해 지연 시간 추가

cs-01 # pcs stonith create fence_kdump fence_kdump pcmk_reboot_action=off pcmk_host_list="cs-01.cs;cs-02.cs" timeout=30
// pcmk_reboot_action: Stonith 수행 시 노드 재부팅 여부
// timeout: 작업이 완료되는데 걸리는 최대 시간 설정

2. Fence agent rule 설정

cs-01 # pcs constraint location ipmi1 avoids cs-01.cs
// 리소스 위치 제약을 설정하여 리소스가 특정 노드에 위치하도록 강제 설정
// stonith 리소스가 자기 자신의 노드에서 실행되면 안됨.

cs-01 # pcs constraint location ipmi2 avoids cs-02.cs

3. Fence kdump 설정

cs-01 # vi /etc/kdump.conf

...
fence_kdump_nodes 192.168.10.102     // cs-01.cs H/B IP
fence_kdump_args -p 7410 -i 1

cs-01 # systemctl restart kdump

cs-02 # vi /etc/kdump.conf

...
fence_kdump_nodes 192.168.10.101    // cs-02.cs H/B IP
fence_kdump_args -p 7410 -i 1

cs-02 # systemctl restart kdump

cs-01, cs-02 # vi /etc/sysctl.conf

kernel.sysrq = 1
kernel.panic_on_io_nmi = 1
kernel.panic_on_unrecovered_nmi = 1
kernel.unknown_nmi_panic = 1

cs-01, cs-02 # sysctl -p

4. impi 연결 확인

cs-01, cs-02 # fence_impilan -A password -a 192.168.10.15 -u 5001 -l admin -p P@ssw0rd -o status -v
cs-01, cs-02 # fence_impilan -A password -a 192.168.10.15 -u 5002 -l admin -p P@ssw0rd -o status -v
// -a: vbmc 서버의 Fence network ip
// -u: vbmc 에 등록된 서버의 포트
// -l, -p: vbmc 서버에 노드 등록 시 사용한 유저의 이름 및 패스워드

5. Fence 우선순위 지정

cs-01 # pcs stonith level add 1 cs-01.cs fence_kdump
cs-01 # pcs stonith level add 1 cs-02.cs fence_kdump
cs-01 # pcs stonith level add 2 cs-01.cs ipmi1
cs-01 # pcs stonith level add 2 cs-02.cs ipmi2

5. Service network check resource

Ethernet Link 를 체크하는 리소스이다.
cs-01 # pcs resource create enp1s0-monitor ethmonitor interface=enp1s0 clone
cs-01 # pcs constraint location web rule score=-INFINITY ethmonitor-enp1s0 ne 1

6. Service start

cs-01 # pcs property set stonith-enabled=true

profile
Linux/Cluster/Infra Engineer

3개의 댓글

comment-user-thumbnail
2024년 1월 25일

좋은 글 잘 보고 갑니다.
2대의 서버가 공유 볼륨(공유 파티션)을 가지고, 그 공유 볼륨에 HTTP 관련 서비스 파일이 올라가고..
Virtual IP로 HTTP 서비스를 수행하는 HA 구성으로 이해를 했어요. 관련 내용이 맞는지요?

만일.. 제가 이해한 것이 맞다면, 지금 설정하신 공유 볼륨을 ..
데이타베이스 서비스에도 적용할 수 있는지 궁금합니다.

즉, 데이타베이스도 이중화하여 구성할려고 하는데.. 위 방식(공이 볼륨)으로 db 데이타 동기화가 가능한지 궁금합니다.

1개의 답글