디지털 라이프 電子的生活 My Digital Life/슈퍼컴퓨터 (HPC)

Lustre 파일 시스템 스터디 중 잡다한 이야기

미친도사 2022. 4. 14. 16:05

요새 병렬 파일 시스템을 공부 중이다.

BeeGFS를 주력하고자 교육도 받고 시스템 엔지니어 자격증도 받았는데, 아무래도 Lustre를 모르고는 이 바닥을 이해하기 어려울 것 같아 Lustre도 공부하고 있다. 마침 고객 중에 Lustre를 쓰겠다는 고객이 있어 이 참에 공부해서 구축하고자 한다.

 

Lustre를 시험하면서 특징 혹은 고려 사항 등을 정리해보면 다음과 같다.

  • 전용 커널을 사용해야 해서, 사용할 수 있는 리눅스 배포판이 정해져 있다. 현재 최신 버전인 2.12.8을 기준으로 하면, RHEL/CentOS 7.9가 Lustre 서버로 구성할 수 있는 배포판이다.
  • InfiniBand를 지원하기 위한 패키지가 별도로 존재한다. 따라서, repository 지정을 제대로 해야 한다.
  • InfiniBand 지원을 위한 OFED가 포함되어 있다. 따라서, Mellanox OFED 등을 사용하면 매우 복잡해진다. 그냥 포함된 OFED 쓴다. 버전은 4.9 대이다.
  • 다른 병렬 파일 시스템들과 같이 management, metadata 및 storage로 3가지 용도의 서버가 존재한다. 각각 MGS, MDS, OSS라 칭한다.
  • 각각의 서버의 데이터를 저장하는 공간(target)을 MGT, MDT, OST라고 칭한다.
  • MGT와 MDT는 통합하여 구성할 수 있다.
  • 클라이언트는 배포판 제약이 적은데, 기본적으로 드라이버 모듈을 제공하는 버전은 제한적이라 소스를 컴파일해서 쓰는 것이 편하다. Mellanox OFED도 사용가능하다.

 

Lustre 파일 시스템 기본 구성 요소

 

설치 과정은 다음과 같이 요약할 수 있다. 이중화 구성은 아닌 기본 설치이다. IB용 hostname은 -ib0로 /etc/hosts에 지정했다.

  • (ALL) 패키지 설치 (커널 업데이트 후 부팅)
  • (ALL) LNET 설정
    # lnetctl lnet configure --all
    # lnetctl net add --net o2ib0 --if ib0
  • (MGS) MGT 파티션 포맷, fstab 등록, mount
    # mkfs.lustre --fsname=lustre --reformat --mgs $DEV
  • (MDS) MDT 파티션 포맷, fstab 등록, mount
    # mkfs.lustre --fsname=lustre --mdt --index=$MDTID --mgsnode=${MGS}-ib0@o2ib0 --reformat $DEV
  • (OSS) OST 파티션 포맷, fstab 등록, mount
    # mkfs.lustre --fsname=lustre --mgsnode=${MGS}-ib0@o2ib0 --ost --index=$OSTID --reformat $DEV

참고 링크: https://doc.lustre.org/lustre_manual.xhtml#idm140469756766080

 

어떤 systemctl나 init.d 서비스가 아닌, 파티션을 포맷하고 마운트하는 것만으로 시스템이 구현된다. 설정 파일 같은 것 없다. 그냥 파일 시스템에 tune2fs로 내용을 추가/변경/삭제하는 것으로 구현된다. 그래서, 어떤 설정을 바꾸기 위해서 unmount > 수정 > mount 의 과정이 필요하겠다.

 

이중화는 pacemaker를 이용해서 구현하게 되어 있다.

Lustre 파일 시스템의 확장 구성 예

보통 이중화라 하면 가상 IP(VIP)를 이용하는 것이 일반적인 접근일 텐데, Lustre는 파티션 생성할 때 해당 서비스를 하는 노드의 IP를 추가적으로 기록하고, 다른 서비스에서 MGS에 접근할 때 여러 IP를 추가하는 것으로 이중화 구성이 가능하다. 따라서, pacemaker에서 노드 등록하고, 자원(resource) 등록하는 것만으로도 그닥 어렵지 않게 이중화 구성이 가능하였다.

 

아래는 단순 구성 및 이중화 구성 시의 파티션 생성 명령어를 정리해 본 것이다. o2ib0라는 인피니밴드 LNET을 기본으로 한다.

Node MGS 구성 non-HA HA
MGS 단독 MGT # mkfs.lustre --fsname=lustre --mgs
--reformat $DEV
# mkfs.lustre --fsname=lustre --mgs
--servicenode={MGS1}-ib0@o2ib0
--servicenode={MGS2}-ib0@o2ib0
--reformat $DEV
MDT와 결합 # mkfs.lustre --fsname=lustre --mgs --mdt --index=0
--reformat $DEV
# mkfs.lustre --fsname=lustre --mgs --mdt --index=0
--servicenode={MGS1}-ib0@o2ib0
--servicenode={MGS2}-ib0@o2ib0
--reformat $DEV
MDS non-HA MGS # mkfs.lustre --fsname=lustre --mdt --index=$MDTID
--mgsnode=${MGS}-ib0@o2ib0
--reformat $DEV
# mkfs.lustre --fsname=lustre --mdt --index=$MDTID
--mgsnode=${MGS}-ib0@o2ib0
--servicenode={MDS1}-ib0@o2ib0
--servicenode={MDS2}-ib0@o2ib0
--reformat $DEV
HA MGS # mkfs.lustre --fsname=lustre --mdt --index=$MDTID
--mgsnode={MGS1}-ib0@o2ib0:{MGS2}-ib0@o2ib0
--reformat $DEV
# mkfs.lustre --fsname=lustre --mdt --index=$MDTID
--mgsnode={MGS1}-ib0@o2ib0:{MGS2}-ib0@o2ib0
--servicenode={MDS1}-ib0@o2ib0
--servicenode={MDS2}-ib0@o2ib0
--reformat $DEV
OSS non-HA MGS # mkfs.lustre --fsname=lustre --ost --index=$OSTID
--mgsnode=${MGS}-ib0@o2ib0
--reformat $DEV
# mkfs.lustre --fsname=lustre --ost --index=$OSTID
--mgsnode=${MGS}-ib0@o2ib0
--servicenode={MDS1}-ib0@o2ib0
--servicenode={MDS2}-ib0@o2ib0
--reformat $DEV
HA MGS # mkfs.lustre --fsname=lustre --ost --index=$OSTID
--mgsnode={MGS1}-ib0@o2ib0:{MGS2}-ib0@o2ib0
--reformat $DEV
# mkfs.lustre --fsname=lustre --ost --index=$OSTID
--mgsnode={MGS1}-ib0@o2ib0:{MGS2}-ib0@o2ib0
--servicenode={MDS1}-ib0@o2ib0
--servicenode={MDS2}-ib0@o2ib0
--reformat $DEV
Client non-HA MGS # mount.lustre {MGS}-ib0@o2ib:/lustre /mnt/lustre
HA MGS # mount.lustre {MGS1}-ib0@o2ib:{MGS2}-ib0@o2ib:/lustre /mnt/lustre

 

HA를 구성해본 예이다. bee1, bee2 노드에 공유 스토리지가 2개 있어서 하나는 MGT, 다른 하나는 MDT로 지정해서 pacemaker에 등록해 본 것이다.

 

## HA 구성에 속하는 노드 모두에서 실행
# yum install pcs fence-agents-all lustre-resource-agents.x86_64 -y
# passwd hacluster
# systemctl enable --now pcsd
 
## 이하 구성 노드 중 한 대에서만 실행해도 됨
# pcs cluster auth {node1} {node2}
 
# pcs cluster destroy --all
 
# pcs cluster setup --start --name lustreHA bee1 bee2
# pcs cluster enable --all
(# pcs property set stonith-enabled=false)
 
## 아래 pcs resource는 primary가 될 노드에서 실행하는 게 좋아 보임
# pcs resource create MGT Filesystem device="/dev/disk/by-uuid/df5ea00a-26a4-4c60-bc78-c0473b8a5abf" directory="/mnt/mgt/" fstype="lustre"
# pcs resource create MDT0 Filesystem device="/dev/disk/by-uuid/12ec15ba-c308-4ccd-aa11-3c894c72e602" directory="/mnt/mdt00/" fstype="lustre"
 
## 상태 확인
# pcs status
Cluster name: lustreHA
Stack: corosync
Current DC: bee2 (version 1.1.23-1.el7-9acf116022) - partition with quorum
Last updated: Thu Apr 14 15:43:10 2022
Last change: Thu Apr 14 13:40:35 2022 by root via crm_resource on bee1
 
2 nodes configured
2 resource instances configured
 
Online: [ bee1 bee2 ]
 
Full list of resources:
 
 MDT0   (ocf::heartbeat:Filesystem):    Started bee2
 MGT    (ocf::heartbeat:Filesystem):    Started bee1
 
Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

 

오픈 소스여서 그런지, 문서가 좀 읽기가 힘들다. 그리고, 모니터링 GUI 구현이 프로젝트 쪽에서는 제공되지 않는다. 알려진 솔루션 몇가지가 있긴 한데, 역시나 오픈소스라 구현하는 과정이 친절하게 문서화되어 있지 않다. 좀 더 공부해 보려 한다.

 

이번 이야기는 여기까지...

반응형