리눅스/Pacemaker(HA Cluster)

[HA] SBD Fencing Device 설정

ㅎㄷㄹㅁㅇ 2024. 10. 7. 15:08
반응형

SBD Fencing Device 설정

 

목차

    STONITH란

    STONITH는 "Shoot The Other Node In The Head"의 약어이며 불량 노드나 동시 액세스로 인해 데이터가 손상되지 않도록 보호합니다.
    상대편 노드가 응답하지 않는다고 해서 이것이 데이터에 액세스하지 않는다는 의미는 아니지만, 데이터의 무결성을 확신할 수 있는 유일한 방법은 STONITH를 사용하여 문제가 발생한 노드를 차단하여 다른 노드에서 데이터에 액세스할 수 있도록 허용하기 전에 노드가 실제로 오프라인인지 확인할 수 있도록 하는 것입니다.
    STONITH는 클러스터링된 서비스를 중지할 수 없는 경우에도 수행할 역할이 있습니다. 이 경우 클러스터는 STONITH를 사용하여 전체 노드를 오프라인으로 강제 실행하므로 다른 곳에서 서비스를 안전하게 시작할 수 있습니다.

     

    Pacemaker 구성 

    [HA] Pacemaker Cluster (CentOS7, KVM, pacemaker) - 1

     

    [HA] Pacemaker Cluster (CentOS7, KVM, pacemaker) - 1

    Pacemaker 구성 1 목차 클러스터란 두대 이상의 서버들을 하나로 묶어서 하나의 서버로 동작하게 하는 것을 말합니다. 클러스터는 고가용성(High-availability, HA), 부하분산(load balance)등이 있습니다.

    handari.tistory.com

     

     

    SBD란

    Storage-Based Death 또는 STONITH Block Device 의 약어로 셀프 펜싱을 위한 방법입니다. 블록 디바이스를 통한 fencing 을 제공합니다.

    SBD 장점

    • sbd는 네트워크에 종속되지 않으므로 구성원 간에 네트워크 링크가 끊어질 수 있는 환경이나 상황에 대한 차단 방법을 제공할 수 있습니다.
    • sbd는 적합한 STONITH/펜싱 설계를 찾는 데 어려움을 겪을 수 있는 다중 사이트 클러스터에 대한 안정적인 펜싱 방법을 제공합니다.
    • sbd는 전원 또는 스토리지 관리 장치를 위해 노드에 보안 자격 증명을 저장할 필요가 없습니다.
    • sbd를 통한 자체 펜싱은 외부 장치의 상태나 응답성에 의존하지 않습니다.
    • 일반적으로 감시 타이머 장치가 클러스터 노드의 프로세서, 메인(마더)보드 또는 가상화 플랫폼에 통합되어 있는 경우 감시 구성 요소에 오류가 발생하면 일반적으로 노드 자체에 오류가 발생했음을 의미합니다. 따라서 이 장치 유형에 대한 오류 시나리오라도 성공적인 자체 보호로 이어질 수 있습니다.

     

    고려 사항

    • sbd에 대한 잠재적인 부정적인 고려 사항: 이러한 요소는 클러스터에서 sbd를 사용하는 데 부담이 될 수 있습니다.
    • sbd는 하드웨어 감시 타이머 장치에 액세스해야 합니다. 이는 모든 환경에서 사용할 수 있는 것은 아닙니다. 이는 일반적인 SBD 요구 사항이며 감시용 펜싱뿐만 아니라 독약 펜싱에도 적용됩니다.
    • VMware 플랫폼 또는 RHEV와 같은 일부 가상화 환경은 호환되는 감시 타이머 장치를 제공하지 않을 수 있습니다. 자세한 내용은 RHEL 고가용성 클러스터에 대한 지원 정책 - sbd 및 Fence_sbd를 참조하세요.
    • sbd는 이전 릴리스에서 사용할 수 없거나 지원되지 않습니다.
    • 일부 조직에서는 조사할 수 있도록 문제가 발생한 시스템의 상태를 보존하려는 경우와 같이 노드가 자동으로 재부팅 되지 않도록 하는 것을 선호할 수 있습니다.
    • Pacemaker로 SBD를 구성하려면 워치독 장치가 작동해야 함
      Watchdog : 타이머 하드웨어. task 감시/재시작
      하드웨어가 없는 경우엔 softdog을 통해 watchdog 기능을 이용할 수 있다.

     

    iscsi를 이용한 SBD device 생성

    Server 구성

    DATA 영역(SBD와 무관함)

    $ targetcli backstores/fileio create test-data1 /iscsi/test_data1.img 2G
    $ targetcli backstores/fileio create test-data2 /iscsi/test_data2.img 2G
    
    $ targetcli iscsi/ create iqn.2024-02.com.data:test-data
    
    $ targetcli iscsi/iqn.2024-02.com.data:test-data/tpg1/luns create /backstores/fileio/test-data1
    $ targetcli iscsi/iqn.2024-02.com.data:test-data/tpg1/luns create /backstores/fileio/test-data2
    
    
    $ targetcli iscsi/iqn.2024-02.com.data:test-data/tpg1/acls create iqn.2024-02.com.data:test-data:initiator01
    $ targetcli iscsi/iqn.2024-02.com.data:test-data/tpg1/acls create iqn.2024-02.com.data:test-data:initiator02
    
    $ targetcli iscsi/iqn.2024-02.com.data:test-data/tpg1/ set attribute generate_node_acls=1
    $ targetcli iscsi/iqn.2024-02.com.data:test-data/tpg1/ set attribute demo_mode_write_protect=0

     

    SBD Device

    $ targetcli backstores/fileio create sbd01 /sbd/sbd_disk01.img 500M
    $ targetcli backstores/fileio create sbd02 /sbd/sbd_disk02.img 600M
    $ targetcli backstores/fileio create sbd03 /sbd/sbd_disk03.img 700M
    
    
    $ targetcli iscsi/ create iqn.2024-02.com.sbd:test-sbd
    
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/luns create /backstores/fileio/sbd01
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/luns create /backstores/fileio/sbd02
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/luns create /backstores/fileio/sbd03
    
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/acls create iqn.2024-02.com.sbd:test-sbd:initiator01
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/acls create iqn.2024-02.com.sbd:test-sbd:initiator02
    
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/ set attribute generate_node_acls=1
    $ targetcli iscsi/iqn.2024-02.com.sbd:test-sbd/tpg1/ set attribute demo_mode_write_protect=0
    $ targetcli ls

    Client 구성

    [root@node01 ~]# cat /etc/iscsi/initiatorname.iscsi 
    InitiatorName=iqn.2024-02.com.sbd:test-sbd:initiator01
    InitiatorName=iqn.2024-02.com.data:test-data:initiator01
    
    [root@node02 ~]# cat /etc/iscsi/initiatorname.iscsi 
    InitiatorName=iqn.2024-02.com.sbd:test-sbd:initiator02
    InitiatorName=iqn.2024-02.com.data:test-data:initiator02

     

    sbd device 생성

    YUM 을 통한 SBD 설치

    $ yum install fence-agents-all OR fence-agents-sbd
    $ rpm -qa | grep -i sbd
    fence-agents-sbd-4.2.1-89.el8.noarch
    sbd-1.5.1-1.el8.x86_64

     

    서버 설정 파일 변경

    Module 등록

    $ echo "softdog" > /etc/modules-load.d/softdog.conf
    $ cat /etc/modules-load.d/softdog.conf
    softdog
     

    SBD Device 파티션 매핑(udev 이름 변경)

    $ lsblk
    
    $ udevadm info -a -p /sys/block/sda | egrep -i "size|model"
        ATTR{size}=="1024000"
        ATTRS{model}=="sbd01           "
    $ udevadm info -a -p /sys/block/sdb | egrep -i "size|model"
        ATTR{size}=="1228800"
        ATTRS{model}=="sbd02           "
    $ udevadm info -a -p /sys/block/sdc | egrep -i "size|model"
        ATTR{size}=="1433600"
        ATTRS{model}=="sbd03           "
    
    $ vi /etc/udev/rules.d/99-persistent-sbd.rules 
    #SUBSYSTEM=="block", ATTR{size}=="확인된_size", ATTRS{model}=="확인된_model_name", SYMLINK+="지정할 이름"
    SUBSYSTEM=="block", ATTR{size}=="1024000", ATTRS{model}=="sbd01", SYMLINK+="sbd_disk1"
    SUBSYSTEM=="block", ATTR{size}=="1228800", ATTRS{model}=="sbd02", SYMLINK+="sbd_disk2"
    SUBSYSTEM=="block", ATTR{size}=="1433600", ATTRS{model}=="sbd03", SYMLINK+="sbd_disk3"
    
    $ udevadm trigger
    
    $ ls /dev/sbd_disk*

     

    sbd device 등록

    $ sbd -d /dev/sbd_disk1 -1 10 -4 20 create
    $ sbd -d /dev/sbd_disk2 -1 10 -4 20 create
    $ sbd -d /dev/sbd_disk3 -1 10 -4 20 create
    $ sbd -d /dev/sbd_disk1 dump
    $ sbd -d /dev/sbd_disk2 dump
    $ sbd -d /dev/sbd_disk3 dump

    Timeout Setting
    Formula for timeout calculation
    Timeout (msgwait) >= (Timeout (watchdog) * 2)
    stonith-timeout >= Timeout (msgwait) + 20%
    https://www.suse.com/support/kb/doc/?id=000021362

     

    예를 들어 watchdog을 120으로 설정한 경우, msgwait 타임아웃을 240 이상, stonith-timeout을 288 이상으로 설정

     

    Node 별 설정 파일 수정

    $ cat /etc/sysconfig/sbd
    SBD_DELAY_START=no
    SBD_DEVICE="/dev/sbd_disk1;/dev/sbd_disk2;/dev/sbd_disk3"
    SBD_OPTS="-n hmangoap1.hb"
    SBD_PACEMAKER=yes
    SBD_STARTMODE=always
    SBD_WATCHDOG_DEV=/dev/watchdog
    SBD_WATCHDOG_TIMEOUT=10
    
    # r86_ha01
    $ cat /etc/sysconfig/sbd
    SBD_DELAY_START=no
    SBD_DEVICE="/dev/sbd_disk1;/dev/sbd_disk2;/dev/sbd_disk3"
    SBD_OPTS="-n r86_ha01.hb"
    SBD_PACEMAKER=yes
    SBD_STARTMODE=always
    SBD_WATCHDOG_DEV=/dev/watchdog
    SBD_WATCHDOG_TIMEOUT=10
    
    # r86_ha02
    SBD_DELAY_START=no
    SBD_DEVICE="/dev/sbd_disk1;/dev/sbd_disk2;/dev/sbd_disk3"
    SBD_OPTS="-n r86_ha02.hb"
    SBD_PACEMAKER=yes
    SBD_STARTMODE=always
    SBD_WATCHDOG_DEV=/dev/watchdog
    SBD_WATCHDOG_TIMEOUT=10
    
    $ systemctl enable sbd

    SBD 데몬은 pacemaker 데몬이 start 될 시에 자동으로 start가 되기 때문에 따로 start 해 줄 필요는 없다. 따라서 enable 만 등록하면 된다.

    $ pcs cluster start --all 명령어를 수행하면 자동으로 sbd 데몬도 기동된다.

     

    kdump 설정 (선택)

    $ systemctl status kdump
    $ cat /etc/kdump.conf
    ...
    path /var/crash
    core_collector makedumpfile -l --message-level 1 -d 31
    fence_kdump_args -p 7410 -f auto -c 0 -i 1
    fence_kdump_nodes [hmangoap2.hb]
    
    $ systemctl restart kdump

     

    명령어를 통한 SBD device 테스트

    클러스터 설정

    # property 등록
    $ pcs cluster start --all
    
    $ pcs property set stonith-enabled=true 
    $ pcs property set stonith-timeout=30s
    $ pcs property set no-quorum-policy=ignore
    $ pcs property set maintenance-mode=false
    $ pcs property
    
    # fence 추가
    $ pcs stonith create kdump-fence fence_kdump pcmk_host_list="r86_ha01.hb r86_ha02.hb" pcmk_monitor_action=metadata pcmk_reboot_action=off pcmk_status_action=metadata
    
    $ pcs stonith create sbd-fence fence_sbd devices=/dev/sbd_disk1,/dev/sbd_disk2,/dev/sbd_disk3  pcmk_delay_base="r86_ha01:0;r86_ha02:10s" pcmk_host_list="r86_ha01.hb r86_ha02.hb" power_timeout=25
    
    
    # fencing level 설정
    $ pcs stonith level add 1 r86_ha01.hb kdump-fence
    $ pcs stonith level add 1 r86_ha02.hb kdump-fence
    $ pcs stonith level add 2 r86_ha01.hb sbd-fence
    $ pcs stonith level add 2 r86_ha02.hb sbd-fence
    
    # TEST-GROUP 우선 기동
    $ pcs constraint location TEST-GROUP prefers r86_ha01.hb=200
    $ pcs constraint location TEST-GROUP prefers r86_ha01.hb=0

     

    명령어 사용으로 fence TEST

    # 각 노드에서 명령어를 통한 테스트 진행
    $ pcs stonith fence r86_ha01.hb 
    $ pcs stonith fence r86_ha02.hb 
    
    # 각 노드에서 명령어를 통한 테스트 진행
    $ ip link set down [HB 네트워크]

     

    클러스터 설정 (추가 리소스)

    $ pcs resource create test1_lv ocf:heartbeat:LVM-activate activation_mode=exclusive tag=pacemaker vg_access_mode=tagging vgname=VG10 --group TEST-GROUP
    
    $ pcs resource create test2_lv ocf:heartbeat:LVM-activate activation_mode=exclusive tag=pacemaker vg_access_mode=tagging vgname=VG11 --group TEST-GROUP
    
    $ pcs resource create test1_fs ocf:heartbeat:Filesystem device=/dev/VG10/test1  directory=/test1 fstype=xfs options=defaults,noatime,discard op monitor interval=60s OCF_CHECK_LEVEL=10 stop on-fail=fence --group  TEST-GROUP
    
    $ pcs resource create test2_fs ocf:heartbeat:Filesystem device=/dev/VG11/test2  directory=/test2 fstype=xfs options=defaults,noatime,discard op monitor interval=60s OCF_CHECK_LEVEL=10 stop on-fail=fence --group  TEST-GROUP
    
    $ pcs resource create test_vip ocf:heartbeat:IPaddr2 cidr_netmask=24 ip=192.168.122.180 nic=enp1s0 --group TEST-GROUP
    
    $ pcs resource create vip_ping ocf:pacemaker:ping debug=1 host_list=192.168.122.1  name=vip1 attempts=5 dampen=10 op monitor interval=10 timeout=10
    
    $ pcs resource clone vip_ping
    
    $ pcs constraint location test_vip rule score=-INFINITY vip1 lt 1 or not_defined vip1

     

     

     

    참고 사항

    dlm.service

    SBD 서비스 구동 간 dlm 서비스는 disable 상태여야 한다. 해당 service가 enable 되어있는 경우 SBD fencing 문제가 발생한다. 펜싱 된 장비가 살아 올라올 때 마다 반대편 노드를 죽여, ping pong으로 노드를 죽이기 때문에 해당 서비스를 확인해야 한다.

     

    SBD timeout 시간

    SBD Fence Device를 사용할 경우엔 모든 구성 요소가 서로 의존하기 때문에 SBD의 timeout을 고려하는 것이 중요합니다. SBD Device를 2개 이상 사용할 때는 모든 Device의 timeout 값이 동일하게 설정되어야 합니다.

     

    watchdog timeout

    watchdog timeout은 SBD 장치를 초기화하는 동안 설정됩니다.($ sbd create)
    watchdog timeout의 경우 스토리지 지연 시간에 따라 달라집니다. 설정 된 시간 내에 스토리지를 성공적으로 읽어야 합니다. 그렇지 않으면 노드가 자체적으로 self-fencing 동작을 진행합니다.

     

    • Multipath 또는 iSCSI 설정
      SBD가 Multipath 또는 iSCSI로 구성되어 있는 경우, path의 문제를 감지하고 다음 경로로 전환하는 데 필요한 시간으로 제한 시간을 설정해야 합니다.
      이는 또한 /etc/multipath.conf 설정에서 max_polling_interval의 값이 watchdog timeout 값보다 작게 설정 되어야 합니다.

     

    msgwait timeout

    msgwait timeout은 SBD 장치를 초기화하는 동안 설정됩니다. 이 타임아웃은 SBD Device의 노드 슬롯에 쓰여진 메시지가 전달된 것으로 간주되는 시간을 정의합니다.
    msgwait timeout은 노드가 self-fencing이 필요하다는 것을 감지할 수 있을 만큼 충분히 길어야 합니다. watchdog timeout의 2배 이상을 설정 합니다.
    그러나 msgwait 타임아웃이 길면 리소스가 절체되기 전에 펜싱 된 클러스터 노드가 다시 클러스터에 rejoin 될 수 있습니다. 이는 /etc/sysconfig/sbd 설정에서 SBD_DELAY_START 변수를 설정함으로써 완화할 수 있습니다.

     

    stonith-timeout (Pacemaker CIB 설정)

    stonith-timeout은 클러스터 설정 값으로, 이는 STONITH 작업(reboot, on, off)이 완료될 때까지 기다리는 시간을 정의합니다. 해당 시간을 넘어가면 다음 Level의 STONITH 동작을 수행합니다.
    ex) kdump -> fence-sbd 등

     

    stonith-watchdog-timeout (Pacemaker CIB 설정)

    stonith-watchdog-timeout
    stonith-watchdog-timeout은 클러스터 설정 값으로, 설정하지 않으면 기본값이 0으로 설정됩니다. 이는 1~3개의 SBD Device를 사용하는 데 적합합니다. diskless 모드의 SBD의 경우 stonith-watchdog-timeout의 값이 0이 되어서는 안 됩니다.

     

     


    연관 tag : #SBD #fence #fence_device #pacemaker #watchdog #msgwaittimeout #stonith-timeout
    연관 문서 : [[RHEL8_Pacemaker]]
    참고 :
    https://access.redhat.com/webassets/avalon/j/includes/session/scribe/?redirectTo=https%3A%2F%2Faccess.redhat.com%2Farticles%2F2941601
    https://learn.microsoft.com/ko-kr/azure/sap/large-instances/large-instance-high-availability-rhel
    https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/s1-stonithtest-haar
    https://documentation.suse.com/sle-ha/15-SP3/html/SLE-HA-all/cha-ha-storage-protect.html
    https://documentation.suse.com/sle-ha/15-SP5/html/SLE-HA-all/cha-ha-storage-protect.html

    반응형
    TOP