SBD Fencing Device 설정
목차
STONITH란
STONITH는 "Shoot The Other Node In The Head"의 약어이며 불량 노드나 동시 액세스로 인해 데이터가 손상되지 않도록 보호합니다.
상대편 노드가 응답하지 않는다고 해서 이것이 데이터에 액세스하지 않는다는 의미는 아니지만, 데이터의 무결성을 확신할 수 있는 유일한 방법은 STONITH를 사용하여 문제가 발생한 노드를 차단하여 다른 노드에서 데이터에 액세스할 수 있도록 허용하기 전에 노드가 실제로 오프라인인지 확인할 수 있도록 하는 것입니다.
STONITH는 클러스터링된 서비스를 중지할 수 없는 경우에도 수행할 역할이 있습니다. 이 경우 클러스터는 STONITH를 사용하여 전체 노드를 오프라인으로 강제 실행하므로 다른 곳에서 서비스를 안전하게 시작할 수 있습니다.
Pacemaker 구성
[HA] Pacemaker Cluster (CentOS7, KVM, pacemaker) - 1
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
'리눅스 > Pacemaker(HA Cluster)' 카테고리의 다른 글
[HA]적절한 Timeout 값과 설정 이유 (1) | 2024.10.26 |
---|---|
[HA] STONITH - fence device 별 stonith-timeout 설정 (0) | 2024.10.08 |
[HA] Pacemaker Cluster (CentOS7, KVM, pacemaker) - 4 (0) | 2024.04.17 |
[HA] Pacemaker Cluster (CentOS7, KVM, pacemaker) - 3 (0) | 2024.04.05 |
[HA] Pacemaker Cluster (CentOS7, KVM, pacemaker) - 2 (0) | 2024.04.04 |