EBS Multi-Attach 볼륨 기능 사용을 위해 GFS2 클러스터 파일시스템을 설정하는 방법은 무엇인가요?
Amazon EBS Multi-Attach 볼륨을 여러 EC2 인스턴스에서 동시에 안전하게 사용하기 위해 GFS2 클러스터 파일시스템을 설정하고 싶습니다.
Short Description
Amazon EBS Multi-Attach 기능을 사용하면 하나의 io1/io2 볼륨을 동일 가용 영역 내 여러 EC2 인스턴스에 동시에 연결할 수 있습니다. 그러나 일반적인 파일시스템(ext4, xfs)은 단일 호스트 접근만을 가정하고 설계되었기 때문에, 여러 인스턴스에서 동시에 쓰기 작업을 수행하면 데이터 손상이 발생합니다.
GFS2(Global File System 2)는 분산 락 매니저(DLM)를 통해 여러 노드에서 동시에 안전하게 읽기/쓰기가 가능한 클러스터 파일시스템입니다. Pacemaker/Corosync 클러스터와 함께 구성하여 고가용성 공유 스토리지를 구현할 수 있습니다.
Resolution
사전 조건
- Nitro 기반 EC2 인스턴스 2대 이상 (동일 가용 영역)
- io2 볼륨 (io1 대비 NVMe Reservations 지원, 생성 후 Multi-Attach 활성화/비활성화가능, 더 넓은 리전 지원)
- 인스턴스 간 네트워크 통신이 가능한 보안 그룹 설정
- Fencing용 IAM 권한 (EC2 인스턴스 시작/중지/재부팅/상태 확인 권한 — IAM Role 또는 Access Key)
참고: 이 가이드는 Amazon Linux 2 를 기준으로 작성되었습니다.
중요: 프로덕션 환경에서는 작업 전 EBS 스냅샷을 생성하여 백업하세요.
1단계: Multi-Attach EBS 볼륨 생성 및 연결
볼륨 생성
- EC2 콘솔에서 Elastic Block Store > 볼륨으로 이동합니다.
- 볼륨 생성을 클릭합니다.
- 다음과 같이 설정합니다:
- 볼륨 유형: Provisioned IOPS SSD (io2)
- 크기: 필요한 용량 입력 (예: 100 GiB)
- IOPS: 필요한 IOPS 입력 (예: 3000)
- 가용 영역: EC2 인스턴스와 동일한 AZ 선택
- **Multi-Attach 활성화: 체크 **
- 볼륨 생성을 클릭합니다.
볼륨 연결
- 생성된 볼륨을 선택하고 작업 > 볼륨 연결을 클릭합니다.
- 첫 번째 인스턴스를 선택하고 연결합니다.
- 동일한 볼륨을 다시 선택하고 작업 > 볼륨 연결을 클릭합니다.
- 두 번째 인스턴스를 선택하고 연결합니다.
양쪽 노드에서 볼륨이 보이는지 확인합니다:
lsblk
2단계: 클러스터 소프트웨어 설치 (양쪽 노드)
sudo yum -y install pcs pacemaker fence-agents-aws dlm lvm2-cluster gfs2-utils
fence_aws는 Python 2의 boto3 라이브러리가 필요합니다. 설치되어 있지 않으면 추가로 설치합니다:
sudo yum -y install python2-boto3
pcsd 서비스를 시작하고 활성화합니다:
sudo systemctl start pcsd.service sudo systemctl enable pcsd.service
hacluster 사용자 비밀번호를 설정합니다 (양쪽 노드에서 동일하게):
echo 'YourPassword' | sudo passwd --stdin hacluster
3단계: 호스트명 및 네트워크 설정 (양쪽 노드)
각 노드의 호스트명을 설정합니다:
# node1에서 실행 sudo hostnamectl set-hostname node1 # node2에서 실행 sudo hostnamectl set-hostname node2
양쪽 노드의 /etc/hosts에 상대방 정보를 추가합니다:
# 양쪽 노드에서 실행 (IP는 실제 프라이빗 IP로 변경) echo '172.31.x.x node1' | sudo tee -a /etc/hosts echo '172.31.x.x node2' | sudo tee -a /etc/hosts
4단계: 클러스터 구성 (한쪽 노드에서 실행)
노드를 인증합니다:
sudo pcs cluster auth node1 node2 -u hacluster -p YourPassword
클러스터를 생성하고 시작합니다:
sudo pcs cluster setup --name mycluster node1 node2 sudo pcs cluster enable --all sudo pcs cluster start --all
클러스터가 안정화될 때까지 잠시 기다린 후 상태를 확인합니다:
sudo pcs status
양쪽 노드가 Online으로 표시되어야 합니다.
5단계: Fencing 설정 (한쪽 노드에서 실행)
Fencing이 필요한 이유
Fencing(STONITH — Shoot The Other Node In The Head)은 클러스터 환경에서 데이터 무결성을 보장하기 위한 필수 메커니즘입니다.
클러스터 노드가 응답하지 않을 때, 해당 노드가 실제로 중단된 것인지 네트워크 문제로 일시적으로 통신이 끊긴 것인지 나머지 노드에서는 알 수 없습니다. 만약 응답하지 않는 노드가 여전히 공유 스토리지에 쓰기 작업을 수행하고 있다면, 다른 노드에서도 동시에 쓰기를 시도할 경우 데이터 손상이 발생합니다.
Fencing은 이 문제를 해결합니다:
- 응답하지 않는 노드를 강제로 재부팅하거나 중지하여 공유 스토리지에 대한 접근을 차단합니다.
- 나머지 노드가 안전하게 리소스를 인수받아 서비스를 계속할 수 있도록 합니다.
- GFS2와 같은 클러스터 파일시스템은 Fencing 없이는 정상 동작을 보장하지 않습니다.
AWS 환경에서는 fence_aws 에이전트를 사용하여 EC2 API를 통해 문제 노드를 재부팅합니다. 이를 위해 EC2 인스턴스에 다음 IAM 권한이 필요합니다:
- ec2:DescribeInstances
- ec2:StartInstances
- ec2:StopInstances
- ec2:RebootInstances
Fencing 리소스 생성
IAM Instance Profile을 사용하는 경우 (권장):
sudo pcs stonith create clusterfence fence_aws \ region=ap-northeast-2 \ pcmk_host_map="node1:i-aaaaaaaa;node2:i-bbbbbbbb" \ power_timeout=240 pcmk_reboot_timeout=480 pcmk_reboot_retries=4
IAM Access Key를 사용하는 경우:
sudo pcs stonith create clusterfence fence_aws \ access_key=[YOUR ACCESS_KEY] \ secret_key=[YOUR SECRET_KEY] \ region=ap-northeast-2 \ pcmk_host_map="node1:i-aaaaaaaa;node2:i-bbbbbbbb" \ power_timeout=240 pcmk_reboot_timeout=480 pcmk_reboot_retries=4
참고: region과 인스턴스 ID를 실제 값으로 바꾸세요. 프로덕션 환경에서는 보안을 위해 IAM Instance Profile 사용을 권장합니다.
Fencing이 정상 동작하는지 확인합니다:
sudo pcs stonith show clusterfence sudo pcs status
6단계: LVM 클러스터 설정
6-1. LVM 클러스터 모드 활성화 (양쪽 노드)
sudo lvmconf --enable-cluster
6-2. DLM 및 clvmd 리소스 생성 (한쪽 노드)
# quorum 정책 설정 sudo pcs property set no-quorum-policy=freeze # DLM 리소스 생성 (클론으로 양쪽 노드에서 실행) sudo pcs resource create dlm ocf:pacemaker:controld \ op monitor interval=30s on-fail=fence \ clone interleave=true ordered=true # clvmd 리소스 생성 (클론으로 양쪽 노드에서 실행) sudo pcs resource create clvmd ocf:heartbeat:clvm \ op monitor interval=30s on-fail=fence \ clone interleave=true ordered=true # clvmd는 DLM이 먼저 시작된 후에 시작되어야 합니다 sudo pcs constraint order start dlm-clone then clvmd-clone sudo pcs constraint colocation add clvmd-clone with dlm-clone
리소스 상태를 확인합니다:
sudo pcs status
dlm-clone과 clvmd-clone이 양쪽 노드에서 Started로 표시되어야 합니다.
7단계: 공유 볼륨 및 GFS2 생성 (한쪽 노드에서 실행)
물리 볼륨과 클러스터 볼륨 그룹을 생성합니다:
sudo pvcreate /dev/nvme1n1 sudo vgcreate -cy shared_vg /dev/nvme1n1
참고: /dev/nvme1n1을 실제 디바이스 경로로 바꾸세요. lsblk로 확인할 수 있습니다. -cy 옵션은 클러스터 볼륨 그룹을 생성합니다.
논리 볼륨을 생성합니다:
sudo lvcreate -L50G -n shared_lv shared_vg
GFS2 파일시스템을 생성합니다:
sudo mkfs.gfs2 -j2 -p lock_dlm -t mycluster:sharedfs -O /dev/shared_vg/shared_lv
참고: -j2는 저널 2개(노드 수)를 의미합니다. -t 옵션은 클러스터이름:파일시스템이름 형식입니다. -O는 확인 프롬프트를 건너뜁니다.
8단계: 클러스터 리소스로 마운트 설정 (한쪽 노드에서 실행)
마운트 포인트를 생성합니다 (양쪽 노드):
sudo mkdir -p /sharedfs
파일시스템 리소스를 생성합니다:
sudo pcs resource create clusterfs Filesystem \ device="/dev/shared_vg/shared_lv" directory="/sharedfs" fstype="gfs2" \ options="noatime" op monitor interval=10s on-fail=fence \ clone interleave=true
제약 조건을 설정합니다:
sudo pcs constraint order start clvmd-clone then clusterfs-clone sudo pcs constraint colocation add clusterfs-clone with clvmd-clone
9단계: 설정 확인
양쪽 노드에서 마운트 상태를 확인합니다:
mount | grep gfs2 df -h /sharedfs
파일 생성 테스트를 수행합니다:
# node1에서 실행 echo "test from node1" | sudo tee /sharedfs/test.txt # node2에서 확인 cat /sharedfs/test.txt
클러스터 전체 상태를 확인합니다:
sudo pcs status
정상적인 경우 다음과 같이 표시됩니다:
- Online: [ node1 node2 ]
- clusterfence (stonith:fence_aws): Started
- dlm-clone: Started [ node1 node2 ]
- clvmd-clone: Started [ node1 node2 ]
- clusterfs-clone: Started [ node1 node2 ]
주의사항
- Multi-Attach는 동일 가용 영역 내에서만 지원됩니다.
- io1 또는 io2 볼륨만 Multi-Attach를 지원합니다.
- GFS2 생성 시 -j 옵션으로 지정한 저널 수만큼의 노드만 동시 마운트 가능합니다.
- /etc/fstab에 마운트 항목을 추가하지 마세요. 클러스터가 마운트를 관리합니다.
- 프로덕션 환경에서는 반드시 Fencing을 구성하고 정상 동작을 확인해야 합니다.
- Amazon Linux 2023에서는 High Availability 패키지(pacemaker, gfs2-utils 등)가 제공되지 않습니다. Amazon Linux 2 또는 RHEL을 사용하세요.
Related Information
[1] 설명서 > Amazon EBS > Amazon EBS Multi-Attach를 사용하여 여러 인스턴스에 볼륨 연결
[2] AWS Storage Blog > Clustered storage simplified: GFS2 on Amazon EBS Multi-Attach enabled volumes
[3] 설명서 > Amazon EBS > Multi-Attach 볼륨에서 NVMe 예약 사용
[4] Red Hat Documentation > GFS2 파일 시스템 구성
- 언어
- 한국어
