* Fencing 이란?
클러스터 안의 노드가 문제가 있는 경우, 어떻게 동작할지 모르며 클러스터의 파일시스템 자원에 접근이 가능하다면 데이터 무결성을 손상시킬 수 있다. 이것을 막기 위해 문제가 있는 경우 해당 노드가 클러스터 리소스에 접근하는 것을 제한하는 외부 방법이 필요하다. 이것이 Fencing 이다.
Fencing의 방법은 여러가지가 있는데, 그중 서버를 꺼버리는 행위는 가장 간단하다. 죽은 노드는 확실하게 아무것도 할 수 없기 때문이다. 또 다른방법으로, 문제있는 노드를 네트워크/스토리지에서 분리하는 "작업의 조합"으로써 Fencing을 할 수도 있다. 네트워크에서 분리하는 이유는 새로운 리소스가 해당 노드로 가지 않게 하려는 것이며, 스토리지에서 분리하는 것은 문제있는 노드가 공유디스크에 쓰기를 하지 못하게 하기 위한 것이다.
Fencing은 클러스터에서 서비스와 리소스를 Recovery하는 매우 중요한 신호이며, 일반적인 절차이다. (서버가 꺼졌다고 난리를 피울 필요가 없다) Red Hat High Availability Add-on은, 응답없는 노드가 클러스터에 의해 Fencing 당하기 전까지는 해당 노드에서 리소스를 시작하지도 않고 서비스를 리커버리 하지도 않는다.
클러스터에서 Fencing이 올바르게 구성되면, 클러스터 내의 모든 노드가 다른 모든 노드를 Fencing 할 수 있어야 한다. 또한, 레드햇의 지원을 받으려면 클러스터의 모든 클러스터 노드가 Fencing을 받을 수 있도록 구성해야 한다.
* Fencing과 관련된 클러스터 시나리오
Fencing이 없는 상태에서 발생할 시나리오
3노드 클러스터 (노드1,노드2,노드3)이 Fencing없이 구성되어 있다. 노드1은 공유디스크에서 ext4 파일시스템 리소스를 마운트하였고, 웹서버 리소스가 해당 파일시스템에서 index.html등의 파일을 불러와 웹서비스를 수행한다. 갑자기 노드1 클러스터 네트워크 상에서 응답을 멈추는 문제가 발생하였다.
1. 노드2는 빠르게 파일시스템 체크를 수행한 후, 해당 공유 스토리지를 마운트한다.
2. 노드2는 웹 서비스를 시작한다.
3. 노드1이 갑자기 정상화되었고 마운트되어있는 파일시스템에서 쓰기를 시작한다. 현재 이 파일시스템은 노드2도 마운트 되어있다.
4. 파일시스템 손상이 발생한다. (ext4는 두군데 이상에서 마운트하고 쓰기가 발생하면 데이터 손상이 일어난다)
Fencing이 있는 상태에서 발생할 시나리오
3노드 클러스터 (노드1,노드2,노드3)이 Fencing없이 구성되어 있다. 노드1은 공유디스크에서 ext4 파일시스템 리소스를 마운트하였고, 웹서버 리소스가 해당 파일시스템에서 index.html등의 파일을 불러와 웹서비스를 수행한다. 갑자기 노드1 클러스터 네트워크 상에서 응답을 멈추는 문제가 발생하였다.
1. 클러스터는 노드1을 스토리지로부터 제거한다. (Fencing)
2. 노드2는 빠르게 파일시스템 체크를 수행한 후, 해당 공유 스토리지를 마운트한다.
3. 노드2는 웹 서비스를 시작한다.
4. 노드1이 정상화 되었으나 파일시스템은 마운트 할 수 없다. 또는, 노드1이 리부팅되었고 깨끗하게 되어 다시 클러스터에 들어가서 대기하게 된다.
* Fencing 방법
Fencing은 두가지 주요 방법이 있다. Power Fencing, Storage Fencing. 두 방법은 Power switch나 virtual fencing daemon 같은 fence device가 필요하다. 그리고 클러스터와 Fencing device간의 통신을 활성화 하기위한 Fencing agent 소프트웨어가 필요하다. 실제로 특정 노드에 Fencing을 해야 하는 경우, 클러스터는 Fence agent에게 이 임무를 위임한다. Fence agent는 Fence device에 통신하여 작업을 수행하도록 한다.
Power Fencing
서버의 전원을 차단하는 방법이다. 이 방법은 STONITH라고도 불리며, Shoot The Other Node In The Head의 줄임말이다. 파워 펜싱에는 두가지 종류가 있다. 또한 파워 펜싱은 서버를 끄거나 켜는 등 여러가지 방법으로 서버를 컨트롤 할 수 있다. 서버가 껐다 켜지면 클린한 상태가 되며, 클러스터 서비스가 enable 되어있다면 리부팅후 다시 자동으로 클러스터에 조인하게 된다.
1. 서버 외부에서 제어되는 네트워크 멀티탭 같이 전원차단 기능이 있는 하드웨어
2. 서버 내부에 전원을 차단하는 IPMI (예: iLO, DRAC, IPMI) 또는 가상 머신 Fencing Device 등
아래는 1번의 예시이다. 1번의 경우 일반적으로 서버는 파워 서플라이가 2개이상이므로, 모든 파워서플라이가 꺼지도록 설정해야 한다. 잘못 설정하는 경우, 실제로는 펜싱이 되지 않았는데 겉으로는 펜싱이 된 것처럼 보여 큰 문제가 발생할 수도 있다.
Storage Fencing
서버를 스토리지에서 연결을 해제하는 펜싱 방법이다. 이것은 SCSI reservation을 쓰거나 FC 스위치의 포트를 닫는 등의 방법으로 구현한다. 파워 펜싱 없이 스토리지 펜싱만 쓰는 경우, 해당 서버가 클러스터에 다시 조인되는지는 관리자가 확인해야만 한다. 사실 일반적으로 파워 펜싱을 사용하며 스토리지 펜싱을 사용하는 것은 드물다. 아래는 멀티패스를 사용하는 FC 스토리지를 사용하여 스토리지 펜싱을 수행하는 예시이다.
* Fence agent의 종류 (자주 사용하는것만)
- Hareware Management Fencing : 서버 관리 툴 (iLO, iDRAC, IPMI 등) 을 통해 사용하는 Fencing
- Virtual Mahine Fencing / Libvirt Fencing : 가상머신(VMWare, KVM 등의 하이퍼바이저) 를 통해 사용하는 Fencing
- Cloud instance fencing : 클라우드 종류에 따라, 예를들어 알리바바, AWS, AZURE등에서 사용할 수 있는 Fencing agent 들이 있다.
* Fence 여러개 조합하기
Fence는 하나만 사용하는것이 아닌 여러개 사용이 가능하다. 위에서 소개한 파워 펜싱, 스토리지 펜싱을 함께 쓸 수도 있다. 여러개의 펜싱 조합은 서로 백업으로써 작동할 수 있다. 펜싱도 실패할 수 있기 때문이다. 예를들어 첫번째로 파워 펜스를 수행하고, 실패한다면 스토리지 펜스를 수행하게 할 수도 있다.
* Fence Agent 에 대해 알아보기
Red Hat High Availability Add-on은 여러가지 펜스 장치를 지원하는 Fence agent들을 제공한다. 실제 사용하는 Fence Device를 지원하는 Fence agent를 설치하여 Fence를 구성하면 된다. fence-agents-all 패키지를 설치하면 레드햇에서 제공하는 대부분의 Fence Agents를 설치할 수 있다. 그러나, 모든 fecing agent를 싹다 모은것은 아니다. 또한 그중 몇가지는 수동으로 설치해야 한다. 더 많은 정보는 다음을 참고한다. https://access.redhat.com/articles/2912891
Fence Device와 Fence agents 각각 종류에 따라 모두 요구되는 파라미터가 다르다. 공통되는 파라미터도 있지만 각각 파라미터가 다르므로 미리 확인이 필요하다. 각각의 Fence agent들은 명령어들처럼 쓸 수도 있다. 추가적으로, 모든 fencing agents은 /usr/sbin/fence_* 에서 확인할 수 있다.
명령어1 : 설치된 fence agent 정보 확인하기 - pcs stonith list
[root@node ~]# pcs stonith list
fence_amt_ws - Fence agent for AMT (WS)
fence_apc - Fence agent for APC over telnet/ssh
fence_apc_snmp - Fence agent for APC, Tripplite PDU over SNMP
fence_bladecenter - Fence agent for IBM BladeCenter
...output omitted...
명령어2 : Fence Agent의 상세 정보 확인하기
pcs stonith describe [Fence agent 이름] (--full 옵션을 추가하여 아주 상세히 볼 수 있다)
위와 같이 해당 에이전트는 어디에 사용하는지도 설명이 나오며, ip는 필수적으로 필요하고, port는 옵션으로 필요하다는 것을 알 수 있다.
명령어3 : Fence Agent의 상세 정보 확인하기 - man 사용, fence 에이전트 자체 사용
- man [Fence agent 이름]
- [Fence agent 이름] -h
명령어4 : Fence Agent를 명령어로써 사용하기
fence_ipmilan은 아래와 같은 명령으로 Fence를 수행할수도 있다.
Fence Device 만들기
클러스터에서, pcs stonith create 명령으로 Fence Device를 생성할 수 있다. 기본 형식은 다음과 같다.
- name : STONITH fence device의 이름. pcs status 등 상태 확인 명령에서 나오는 이름이다.
- fencing_agent : fence device에 의해 사용될 fencing agent의 이름.
- fencing_parameter : fencing agent에 사용할 요구되는 파라미터들.
* Fence 관련 여러 명령어들
설정된 Fence device의 현재 상태 보기
pcs stonith status 명령 : 클러스터에서 구성된 fence device, 사용되는 fencing agent, fence device 상태를 보여준다. fence device의 상태는 started와 stopped 두가지가 있다.
- started : 해당 device는 작동중인 상태
- stopped : 해당 fence device는 작동하지 않는 상태
설정된 Fence device의 정보 보기
pcs stonith config 명령 : 모든 STONITH 리소스의 configuration option들을 보여준다. 특정 STONITH 리소스 이름을 줘서 해당 리소스의 configuration option만 볼수도 있다.
설정된 Fence device 속성값 변경하기
pcs stonith update fence_device_이름 : fencing device의 옵션을 변경할 수 있다. 이 명령은 새로운 fencing device 옵션을 추가하거나, 원래 있는 값을 변경할 수 있다. 예를들어, fencing device 인 fence_node2가 node2 대신 node1를 펜스해버렸다. 이경우, 아래 명령으로 바로잡을 수 있다.
설정된 Fence device 삭제하기
어떤 시점에서는 클러스터에서 fencing device를 제거해야 할 수 있다. 이는 해당 클러스터 노드를 삭제하거나, 노드를 펜스하기 위해 다른 펜스 매커니즘을 사용하기 위해 사용할 수 있다. pcs stonith delete Fence_device_name 명령으로 수행한다.
* fence 구성 테스트하기
- 구성된 fencing 설정이 잘 작동하는지 두가지 방법으로 확인할 수 있다.
1. pcs stonith fence 노드명
- 이것은 요청한 노드를 펜스시킨다.
- 사용자는 fence 시키고 싶은 노드에서 하는게 아니라, 다른 노드에서 이 명령을 사용해야 한다 (should)
- 만약 이 명령이 성공하면, 해당 노드는 펜스된다.
2. 한 노드를 네트워크 케이블을 뽑거나 방화벽에서 포트를 닫거나, 전체 네트워크 스택을 비활성화여 노드에서 네트워크를 비활성화한다.
- 그러면 클러스터의 다른 노드는 해당 노드가 장애라는것을 확인하고 펜스를 해야 한다. (should)
- 이는 실패한 노드를 감지하는 클러스터의 기능도 테스트합니다.
* Fence agent 의 파라미터
Fence agent 의 파라미터는 크게 일반 파라미터와 전용 파라미터 두가지 범주가 있다. 일반 파라미터는 대부분의 Fence agent가 모두 동일하게 사용하며, 전용 파라미터는 Fence agent 마다 각각 다른 파라미터이다. 파라미터부터는 이해가 잘 안될텐데, 자주 사용하는 Fence agent의 파라미터의 예시를 보면서 이해하면 도움이 된다.
<일반 파라미터>
아래는 자주 사용하는 일반 파라미터이다.
pmk_host_list
- 이 매개변수는 fencing device에 의해 제어되는 node 들의 리스트를 스페이스로 구분한 리스트를 제공한다.
- pcmk_host_check 매개변수가 static-list로 되어있는경우, 필수 값이다.
pcmk_host_map
- 일반적으로 이 파라미터는 여러개의 노드를 fence 할 수 있는 fence agent와 함께 사용된다.
- 예를들어, fence_rhevm 에이전트를 사용하면 모든 클러스터 노드를 차단하기 위해 하나의 STONITH 리소스만 생성된다.
- pcmk_host_map에 노드들을 나열하고, 그 노드들은 가상머신이름을 연결한다.
- 목록은 세미콜론(;)으로 구분된다. nodename:port 와 같은 식으로 매핑된다. node1.example.com:1;node2.example.com:2 이런식. (여기서 포트는 포트번호가 아니고, 어떤 용어를 지칭한다)
pcmk_host_check
- 이 파라미터는 클러스터가 fencing device에서 제어할 수 있는 노드를 식별하는 방법을 정의한다. 가능한 값은 다음과 같다.
- dynamic-list : 클러스터는 fencing device를 쿼리한다. 이것은 만약 fencing device가 port의 리스트들을 반환할 수 있고 포트 이름이 클러스터 노드의 이름과 일치하는 경우에만 작동한다.
- static-list : 클러스터는 pcmk_host_list에서 제공된 노드 리스트를 사용하거나 또는 pcmk_host_map에서 nodename:port 형식으로 제공된 리스트를 사용한다.
- none : 클러스터는 모든 fencing device가 모든 node를 fence 할수 있다고 간주한다.
- 이 값의 default는 dynamic-list이지만 pcmk_host_map 또는 pcmk_host_list 옵션이 사용될 때 마다 static-list로 변경된다. (디폴트값이 변경될 수 있다는 얘기)
pcmk_reboot_timeout
- fencing이 complete 될 때까지의 시간을 정의. 초단위이다.
- 기본값은 60초이다. 이 값을 사용해 장치별 timeout을 정의할 수 있다.
- fencing 이 이 시간보다 오래걸리는경우, 클러스터는 fencing이 실패한 것으로 간주한다.
- 클러스터 수준에서 이 값을 설정하려면, pcs property set stonith-timeout=180s 로 해야한다.
<Fence agent 전용 파라미터>
위에서 나열한 일반 fencing 속성 외에도, fencing agent 별 속성이 따로 있다. pcs stonith describe 펜스장치명
이 명령은 특정 fence device에 대해 설정할 수 있는 모든 필수/선택 매개변수를 보여준다.
* 펜스 동작 예시
방화벽으로 nodea를 차단하면, 통신이 되지 않으므로 클러스터는 해당 nodea를 펜스시키고, 리소스는 다른곳으로 이동한다.
1. 방화벽 nodea 차단
2. nodea 는 펜스되고 wwfs는 nodeb에서 올라가게 된다.
* References
pcs(8) and fence_*(8) man pages
For more information, refer to the High Availability Add-On Overview chapter in the Configuring and managing high availability clusters guide at Configuring and managing high availability clusters Red Hat Enterprise Linux 8 | Red Hat Customer Portal https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_high_availability_clusters/index
Knowledgebase: "Support Policies for RHEL High Availability Clusters General Requirements for Fencing/STONITH"
Support Policies for RHEL High Availability Clusters - General Requirements for Fencing/STONITH - Red Hat Customer Portal
https://access.redhat.com/articles/2912891
주요 클라우드 제공자에서 지원되는 fencing agent에 대한 더 많은 정보를 볼려면, 아래를 참고하세요.
"Support Policies for RHEL High Availability Clusters" Support Policies for RHEL High Availability Clusters - Red Hat Customer Portal
References
For more information, refer to Chapter 9. Configuring fencing in a Red Hat High Availability cluster in the Configuring and managing high availability clusters guide at https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/configuring_and_managing_high_availability_clusters/index#assembly_configuring-fencing-configuring-and-managing-high-availability-clusters
Knowledgebase: "What format should I use to specify node mappings to stonith devices in pcmk_host_list and pcmk_host_map in a RHEL 6, 7, or 8 High Availability cluster?"
https://access.redhat.com/solutions/2619961
* 실습 - 클러스터 노드 펜싱 구성하기
Fence 구성을 위한 정보 확인
모든 서버마다 BMC가 있거나 가상으로 구현할 수 있다. 각 BMC는 IP, ID, PW를 가지고 있다. 이 정보로 fence 를 생성한다. 또한 각 서버의 관리 툴에서 ipmi over lan 옵션을 활성해야 할 수도 있으므로 참고할 것.
BMC를 사용하지 않는 경우, 여러가지 하드웨어 디바이스들이 있다. 이 장치들은 장치마다 구성 방법이 있으므로 따로 참고해야 하며, 이 예시에서는 BMC를 사용한 fence_ipmilan 에이전트를 예시로 든다.
• Uninterruptible power supplies (UPS)
• Power distribution units (PDU)
• Blade power control devices
• Lights-out devices
Fence 구성 명령
이 예시에서는 fence_ipmilan 이라는 에이전트를 예시로 들며, 각각 노드마다 fence 장치를 생성해야 한다. 따라서 총 3개를 만든다. pcs stonith create 명령을 사용한다. 이 커맨드는 클러스터 노드를 fence할 수 있는 fence agent에 의해 요구되는 파라미터의 세트와 value값을 요구한다. fence agent 인 fence_ipmilan 의 파라미터는 pcmk_host_list, username, password, ip가 요구된다. pcmk_host_list 파라미터는 클러스터에 알려진 해당 호스트를 나열한다. ip 매개변수는 펜싱 장치의 IP 주소 또는 호스트 이름을 요구한다.
구성된 Fence 상태 확인
pcs stonith status 명령은 클러스터에 연결된 fence 장치의 상태를 보여준다. 모든 fence_ipmilan 펜스 장치는 started로 보여야만 한다.
만약 하나 이상의 fence 장치가 stopped 되어있는 경우, 대부분 fence agent와 fencing server간 커뮤니케이션의 문제이다. "pcs stonith config 펜스장치" 명령으로 fence device의 세팅을 확인한다. 또한 pcs stonith update 명령으로 펜스장치를 업데이트할 수 있다.
실제로 fence를 수행하여 잘 작동하는지 확인
아래 두가지 방법으로 Fence 를 수행해볼 수 있다. 이미 Fence가 구성되었다면 첫번째 방법으로, 구성되지 않았다면 두번째 방법으로 할 수 있다. 아래 두번째 캡쳐는 위 정보와 맞지 않은데, 이런 형식으로 하면 된다는 것을 얘기하는 것이다.
Fence가 성공되었다면 해당 서버는 종료되며, 다시 부팅된다. 부팅되고 다시 클러스터에 조인하게 된다. (enable 설정 했을 시)
'High Availability > RH436 & EX436' 카테고리의 다른 글
[RH436/EX436] 5. 클러스터 관리 (0) | 2024.02.06 |
---|---|
[RH436/EX436] 4. 리소스 - 리소스 관리와 Constraint (0) | 2024.02.03 |
[RH436/EX436] 3. 리소스 - 리소스 개념 (0) | 2024.02.03 |
[RH436/EX436] 1. 클러스터 개념 및 기본클러스터 구성 (0) | 2024.02.03 |
[RH436/EX436] 0. High Availability Cluster Lab Network Environment (0) | 2024.02.03 |