요새 병렬 파일 시스템을 공부 중이다.
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도 사용가능하다.
설치 과정은 다음과 같이 요약할 수 있다. 이중화 구성은 아닌 기본 설치이다. 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를 이용해서 구현하게 되어 있다.
보통 이중화라 하면 가상 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 구현이 프로젝트 쪽에서는 제공되지 않는다. 알려진 솔루션 몇가지가 있긴 한데, 역시나 오픈소스라 구현하는 과정이 친절하게 문서화되어 있지 않다. 좀 더 공부해 보려 한다.
이번 이야기는 여기까지...
'디지털 라이프 電子的生活 My Digital Life > 슈퍼컴퓨터 (HPC)' 카테고리의 다른 글
제 59회 TOP500 순위 분석 (2022.06) (0) | 2022.06.20 |
---|---|
제 58회차 TOP500 슈퍼컴퓨터 랭킹 분석 (0) | 2021.11.18 |
제 57회 (2021년 6월) TOP500 슈퍼컴퓨터 랭킹 분석 (0) | 2021.07.01 |
제 55회 (2020년 6월) TOP500 슈퍼컴퓨터 랭킹 분석 (2) | 2020.07.09 |
NGC(NVIDIA GPU Cloud)를 사용하기 위한 환경 설정하기 (0) | 2020.06.03 |