리눅스/Pacemaker(HA Cluster)

[HA] STONITH - fence device 별 stonith-timeout 설정

ㅎㄷㄹㅁㅇ 2024. 10. 8. 13:43
반응형

STONITH

STONITH는 "Shoot The Other Node In The Head"의 약자로 고가용성 컴퓨팅 및 클러스터에서 사용됩니다. 클러스터 컴퓨팅 환경에서 노드(서버)가 오작동하거나 응답하지 않을 경우 클러스터에서 해당 노드(서버)를 강제로 제거(Fencing)해 고가용성을 확보하기 위해 사용하는 기술을 말합니다

STONITH의 목적은 클러스터의 여러 노드가 자신을 기본 노드라고 믿고 실행 중인 서비스를 문제가 발생하지 않는 노드로 넘기는 것 동작을 통해 데이터 손상을 방지하는 것입니다.

상대편 노드가 응답하지 않는다고 해서 이것이 데이터에 액세스하지 않는다는 의미는 아닙니다. 데이터의 무결성을 확신할 수 있는 유일한 방법은 STONITH를 사용하여 문제가 발생한 노드를 차단하는(죽이는_Fencing) 것입니다. 다른 노드에서 데이터에 액세스할 수 있도록 허용하기 전에 노드가 실제로 오프라인인지 확인할 수 있도록 하는 것입니다.

 

stonith-timeout , pcmk_timeout, power_timeout

stonith-timeout 옵션은 Fencing 동작이 완료되기 까지 할당된 시간이며, 해당 시간이 지나면 다음 level 동작을 진행합니다. 노드가 Fencing 중인 경우 클러스터 관리자는 Fencing 작업이 성공할 때까지 일정 시간(시간 초과) 동안 기다립니다. timeout 내에 Fencing 동작이 완료되지 않으면 클러스터 관리자는 대체 방법을 사용하여 노드를 보호하거나 클러스터 리소스를 조정하여 가용성을 유지하는 등의 추가 조치를 취할 수 있습니다. stonith-timeout 설정은 클러스터에 등록된 fence-agent 전부에 동일하게 적용됩니다.

 

stonith-timeout이 클러스터에 등록한 모든 fence-agent에 동일하게 적용되기 때문에 각각 다른 timeout을 지정하고 싶어 아래 내용으로 테스트를 진행했습니다.

 

해당 글에서는 추가로 STONITH를 등록하는 방법은 적지 않습니다.

 

fence_kdump 옵션 설명 (metadata 확인)

아래의 설명을 보면 pcmk_XXX_timeout의 설정 값은 stonith-timeout을 대체 하는 설정 값으로 설명되어있습니다. 따라서 아래의 설정 중 하나를 선택해서 stonith-timeout을 대체하는 timeout을 설정하면 됩니다.

# pcs stonith describe fence_kdump --full
fence_kdump - fencing agent for use with kdump crash recovery service
...
Stonith options:
...
pcmk_reboot_timeout: Advanced use only: Specify an alternate timeout to use for reboot actions instead of stonith-timeout Some devices need much more/less time to complete than normal. Use this to specify an alternate, device-specific, timeout for 'reboot' actions.

pcmk_off_timeout: Advanced use only: Specify an alternate timeout to use for off actions instead of stonith-timeout Some devices need much more/less time to complete than normal. Use this to specify an alternate, device-specific, timeout for 'off' actions.

pcmk_on_timeout: Advanced use only: Specify an alternate timeout to use for on actions instead of stonith-timeout Some devices need much more/less time to complete than normal. Use this to specify an alternate, device-specific, timeout for 'on' actions.

pcmk_list_timeout: Advanced use only: Specify an alternate timeout to use for list actions instead of stonith-timeout Some devices need much more/less time to complete than normal. Use this to specify an alternate,device-specific, timeout for 'list' actions.

pcmk_monitor_timeout: Advanced use only: Specify an alternate timeout to use for monitor actions instead of stonith-timeout Some devices need much more/less time to complete than normal. Use this to specify an alternate,device-specific, timeout for 'monitor' actions.

pcmk_status_timeout: Advanced use only: Specify an alternate timeout to use for status actions instead of stonith-timeout Some devices need much more/less time to complete than normal. Use this to specify an alternate,device-specific, timeout for 'status' actions.
...

 

stonith_admin 명령어를 통해 추가 정보 확인
$ stonith_admin --metadata -a fence_kdump

 

 

fence_kdump 에서 pcmk_reboot_action

많은 문서에서 fence_kdump 설정을 진행 할 때 pcmk_reboot_action=off 라는 설정 값을 넣어주고 있습니다. 하지만 해당 설정은 RHEL7,8 기준으로 제대로 동작하지 않는 것을 확인했습니다. 아래 로그를 확인해보면 reboot action은 off action으로 대체 되어진다고 나옵니다. 실제로는 pcmk_reboot_action의 default 값인 reboot 과 off 설정이 둘 다 적용이 되지 않고 pcmk_off_action으로 동작하는 것을 확인했습니다.

Mar 11 17:14:16 r86_ha01 pacemaker-fenced[1576]: notice: kdump-fence is eligible to fence (reboot) r86_ha02.hb: static-list
Mar 11 17:14:16 r86_ha01 pacemaker-fenced[1576]: notice: sbd-fence is eligible to fence (reboot) r86_ha02.hb: static-list
Mar 11 17:14:16 r86_ha01 pacemaker-fenced[1576]: notice: Requesting that r86_ha01.hb perform 'reboot' action targeting r86_ha02.hb using kdump-fence
...

### 'fence_kdump' does not support reboot
Mar 11 17:14:16 r86_ha01 pacemaker-fenced[1576]: notice: Remapping 'reboot' action targeting r86_ha02.hb using kdump-fence to 'off' because agent 'fence_kdump' does not support reboot

...
Mar 11 17:14:16 r86_ha01 fence_kdump[2142]: waiting for message from '200.200.20.183'
Mar 11 17:14:16 r86_ha01 pacemaker-controld[1580]: notice: Result of start operation for kdump-fence on r86_ha01.hb: ok
Mar 11 17:14:16 r86_ha01 pacemaker-controld[1580]: notice: Initiating monitor operation kdump-fence_monitor_60000 locally on r86_ha01.hb
Mar 11 17:14:16 r86_ha01 pacemaker-controld[1580]: notice: Requesting local execution of monitor operation for kdump-fence on r86_ha01.hb

 

pcmk_off_timeout 설정을 통한 stonith-timeout 설정

pcmk_reboot_action이 pcmk_off_action로 대체되어 동작하기 떄문에 pcmk_off_timeout을 통해 stonith-timeout의 대체 옵션을 설정하면 해당 값으로 적용 됩니다. 아래는 stonith 설정과 log 메세지입니다.

 

pcs stonith show --full

[root@r86_ha01 ~]# pcs stonith show --full
Warning: This command is deprecated and will be removed. Please use 'pcs stonith config' instead.

 ### fence_kdump pcmk_off_timeout 설정 
 Resource: kdump-fence (class=stonith type=fence_kdump)
  Attributes: pcmk_host_list="r86_ha01.hb r86_ha02.hb" pcmk_monitor_action=metadata pcmk_off_timeout=30s pcmk_reboot_action=off pcmk_status_action=metadata
  Operations: monitor interval=60s timeout=60s (kdump-fence-monitor-interval-60s)
 Resource: sbd-fence (class=stonith type=fence_sbd)
  Attributes: devices=/dev/sbd_disk1,/dev/sbd_disk2,/dev/sbd_disk3 pcmk_delay_base=r86_ha01.hb:0;r86_ha02.hb:10s pcmk_host_list="r86_ha01.hb r86_ha02.hb" power_timeout=25
  Operations: monitor interval=60s (sbd-fence-monitor-interval-60s)
 Target: r86_ha01.hb
   Level 1 - kdump-fence
   Level 2 - sbd-fence
 Target: r86_ha02.hb
   Level 1 - kdump-fence
   Level 2 - sbd-fence
[root@r86_ha01 ~]# pcs property show 
Warning: This command is deprecated and will be removed. Please use 'pcs property config' instead.
Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: SBD-CLUSTER
 dc-version: 2.1.2-4.el8-ada5c3b36e2
 have-watchdog: true
 last-lrm-refresh: 1709000024
 maintenance-mode: false
 no-quorum-policy: ignore
 start-failure-is-fatal: true
 stonith-enabled: true

 ### stonith-timeout 시간 설정 
 stonith-timeout: 120s

 

log messages


### watting for message 부터 fence_kdump 동작 시간 체크 
Mar 13 16:05:53 r86_ha02 fence_kdump[2259]: waiting for message from '200.200.20.182'
Mar 13 16:05:53 r86_ha02 pacemaker-controld[1645]: notice: Result of start operation for sbd-fence on r86_ha02.hb: ok
Mar 13 16:05:53 r86_ha02 pacemaker-controld[1645]: notice: Initiating monitor operation sbd-fence_monitor_60000 locally on r86_ha02.hb
Mar 13 16:05:53 r86_ha02 pacemaker-controld[1645]: notice: Requesting local execution of monitor operation for sbd-fence on r86_ha02.hb
Mar 13 16:05:54 r86_ha02 pacemaker-controld[1645]: notice: Result of monitor operation for sbd-fence on r86_ha02.hb: ok

### 30초 뒤 timeout 발생 
Mar 13 16:06:23 r86_ha02 pacemaker-fenced[1641]: error: Operation 'reboot' [2259] targeting r86_ha01.hb using kdump-fence could not be executed: Timed Out (Fence agent did not complete in time)
Mar 13 16:06:23 r86_ha02 pacemaker-fenced[1641]: notice: Action 'reboot' targeting r86_ha01.hb using kdump-fence on behalf of pacemaker-controld.1645@r86_ha02.hb: Timed Out (Fence agent did not complete in time)

### sbd-fence 를 통해서 fencing 동작 수행 
Mar 13 16:06:23 r86_ha02 pacemaker-fenced[1641]: notice: Requesting that r86_ha02.hb perform 'reboot' action targeting r86_ha01.hb using sbd-fence
Mar 13 16:06:23 r86_ha02 pacemaker-controld[1645]: notice: Result of start operation for kdump-fence on r86_ha02.hb: ok
Mar 13 16:06:23 r86_ha02 pacemaker-controld[1645]: notice: Initiating monitor operation kdump-fence_monitor_60000 locally on r86_ha02.hb
Mar 13 16:06:23 r86_ha02 pacemaker-controld[1645]: notice: Requesting local execution of monitor operation for kdump-fence on r86_ha02.hb
Mar 13 16:06:23 r86_ha02 pacemaker-controld[1645]: notice: Result of monitor operation for kdump-fence on r86_ha02.hb: ok
Mar 13 16:06:43 r86_ha02 pacemaker-fenced[1641]: notice: Operation 'reboot' [2475] targeting r86_ha01.hb using sbd-fence returned 0
Mar 13 16:06:43 r86_ha02 pacemaker-fenced[1641]: notice: Action 'reboot' targeting r86_ha01.hb using sbd-fence on behalf of pacemaker-controld.1645@r86_ha02.hb: complete
Mar 13 16:06:43 r86_ha02 pacemaker-fenced[1641]: notice: Operation 'reboot' targeting r86_ha01.hb by r86_ha02.hb for pacemaker-controld.1645@r86_ha02.hb: OK (complete)
Mar 13 16:06:43 r86_ha02 pacemaker-controld[1645]: notice: Fence operation 3 for r86_ha01.hb passed
Mar 13 16:06:43 r86_ha02 pacemaker-controld[1645]: notice: Peer r86_ha01.hb was terminated (reboot) by r86_ha02.hb on behalf of pacemaker-controld.1645@r86_ha02.hb: OK

 

fence deive 별로 pcmk 동작이 다르다.

fence_kdump 설정에서 reboot 동작이 하지 않는 것을 알았습니다. 다른 fence device 에서도 다르게 동작 할 부분이 있기 때문에 확인 및 테스트가 필요해 보입니다. fence_ipmi 나 fence_vmware_rest 의 경우 power_timeout 을 통해서 조절이 가능해 보이나 테스트가 필요해 보입니다.

 

Case test

Case 0. (default) fence_kdump 120s 고정 / pcmk_off_timeout=
$ pcs stonith update kdump-fence Attributes: pcmk_off_timeout= pcmk_off_retries= timeout=
-> 120초에 fence_kdump timeout 발생 / stonith-timeout 로 인해 timeout 발생

 

Case 1. (pcmk_timeout) fence_kdump 120s 고정 / pcmk_off_timeout=120s
$ pcs stonith update kdump-fence Attributes: pcmk_off_timeout=120s
-> Case0 과 다르점 확인 필요

 

Case 2. (pcmk_timeout) fence_kdump 120s 고정 / pcmk_off_timeout=60s
$ pcs stonith update kdump-fence Attributes: pcmk_off_timeout=60s
-> 60초에 fence_kdump timeout 발생 / pcmk_off_timeout=60s 로 인해 timeout 발생

 

Case 3. (pcmk_timeout) fence_kdump 120s 고정 / pcmk_off_timeout=30s
$ pcs stonith update kdump-fence Attributes: pcmk_off_timeout=30s
-> 30초에 fence_kdump timeout 발생 / pcmk_off_timeout=30s 로 인해 timeout 발생

 

Case 4. (pcmk_timeout) fence_kdump 120s 고정 / pcmk_off_timeout=180s
$ pcs stonith update kdump-fence Attributes: pcmk_off_timeout=180s
-> 120초에 fence_kdump timeout 발생 / stonith-timeout=120s 로 인해 timeout 발생 > retry 2번 을 다 진행해서 다음 level로 진행

 

Case 5. (timeout) fence_kdump 120s 고정 / timeout=30s
$ pcs stonith update kdump-fence Attributes: timeout=30s
-> 60초에 fence_kdump timeout 발생 / timeout=30s 로 인해 timeout 발생 예상

 

Case 6. (timeout) fence_kdump 120s 고정 / timeout=90s
$ pcs stonith update kdump-fence Attributes: timeout=90s pcmk_off_retries= pcmk_off_timeout=
-> 90초에 fence_kdump timeout 발생 / timeout=90s 로 인해 timeout 발생을 예상하나, stonith-timeout은 120초 timeout 시간이 90초 retries가 2번이 default 일 때
90초까지 timeout을 확인 후 한번 더 retry를 할 경우 180초가 되기 때문에 90초에서 timeout 발생을 예상 >> 해당 내용은 버그가 의심 됨 82초는 정상 동작

 

Case 7. (pcmk_timeout / retries) fence_kdump 120s 고정 / pcmk_off_timeout=180s pcmk_off_retries=3
$ pcs stonith update kdump-fence Attributes: pcmk_off_timeout=180s pcmk_off_retries=3 timeout=
-> 0초에 fence_kdump timeout 발생 / pcmk_off_timeout=180s로 인해 timeout 발생


참고 : https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/s1-fencedevicesadditional-haar
https://github.com/ClusterLabs/fence-agents/blob/main/agents/kdump/options.h
https://clusterlabs.org/pacemaker/doc/2.1/Pacemaker_Explained/singlehtml/
https://clusterlabs.org/pacemaker/doc/2.1/Pacemaker_Explained/html/fencing.html

반응형
TOP