avicom의 신변잡기

lustre 본문

LiNux / sTorAge

lustre

avicom 2011. 1. 3. 19:13

핵심 기능

확장성

클라이언트 노드, 디스크 용량, 대역폭을 동적으로 조절가능. 현재 lustre는 최대 26,000개의 클라이언트 노드까지 확장가능하며 10,000 - 20,000개의 클라이언트로 구성된 경우가 많음. OST의 경우 450개 이상의 OSS에 1,000개의 OST까지 확장 가능하며 1PB의 용량에 20억개의 파일 핸들링 가능함.

성능

실제 환경에서 최대 100GB/s의 성능을 보임. 테스트 환경에서는 130GB/S의 성능에 초당 13,000개의 파일 생성 성능을 지속적으로 보인 바 있음. 단일 클라이언트 노드에서 최대 2GB/S까지 측정됐으며, OSS는 최대 2.5GB/s의 tps를 보임. Oak Ridge National Laboratories의 Spider files system상에서는 240GB/S의 성능을 기록한 적도 있음.

POSIX 호환

Lustre 클라이언트에서 POSIX의 완벽한 호환이 보장됨.

고가용성

Lustre는 OSS 타겟(OST)과 MDS 타겟(MDT)에 대해 공유 스토리지 파티션을 지원함.

보안성

특정 포트의 접근을 지정할 수 있음. POSIX 기반 ACL도 지원함.

오픈소스

라이센스는 GPL임

상호호환성

Lustre는 이기종간 호환은 지원함.

ACL

Lustre 보안 모델은 POSIX acl을 비롯한 유닉스 파일시스템을 따름.

쿼터 지원

유저와 그룹 쿼터 설정가능

OSS

Lustre 파일 시스템의 용량과 클러스터 총 대역 증설이 서버 중단없이 동적으로 가능.

Striping

기본 스트라이프 카운트와 사이즈를 여러 방식으로 조정가능함. 파일시스템 기본 설정은 포맷시에 지정가능함. 디렉토리 속성도 지정가능해서, 스트라이핑 속성을 가진 디렉토리 아래의 모든 파일들과 서브 디렉토리들은 디렉토리와 동일한 속성을 가짐. 또한 개별 파일 생성 시의 스트라이핑 방식도 유틸리티를 사용해 제어가능함.

스냅샷

Lustre 서버는 서버의 로컬 디스크를 볼륨으로 사용함. Lustre는 스냅샷 생성을 위한 유틸리티(lvm 스냅삿 관련)를 제공하며 모든 볼륨과 그룹 스냅샷을 스냅샷 파일시스템에 마운트할 수 있음.

백업툴

Lustre는 백업을 지원하는 두 가지 툴을 제공함. 하나는 파일 시스템을 스캔하고 특정 시간 이후로 변경된 파일의 위치를 추적하여 해당 파일의 pathname 리스트를 만들어 rsync같은 다른 유틸리티가 병렬로 처리가능하도록 하는 툴이며, 다른 하나는 tar의 변형된 버전으로 file 스트라핑이나 풀 멤버쉽같은 부가 속성을 백업/복원하는 역할을 한다.

lustre 콤포넌트 구성

메타데이터 서버 (MDS)

lustre 클라이언가 사용가능한 하나 이상의 메타데이터 타겟에 메타데이터를 저장하도록 한다. 각 MDS는 lustre 파일시스템 내의 디렉토리와 파일이름을 관리하고 하나 이상의 로컬 MDT에 네트웍 요청 핸들링을 제공한다.

메타데이터 타겟 (MDT)

MDS상에 파일이름과 디렉토리, 파일 속성같은 메타데이터를 저장한다. 각각의 파일 시스템은 하나의 MDT를 가진다. 공유 스토리지 타겟의 MDT는 다수의 MDS가 사용할 수 있지만 실제로는 오직 하나의 MDS만이 사용할 수 있다. active MDS가 다운되면, 대기중인 MDS가 MDT를 서비스할 수 있고 클라이언트에 개방된다.

스토리지 서버 (OSS)

하나 이상의 OST에 파일에 대한 I/O 엑세스와 네트웍 핸들링을 제공한다. 일반적으로 OSS는 2개에서 8개 사이의 OST에서 8테라까지 서비스할 수 있다. MDT, OST와 lustre 클라이언트는 하나의 서버에서 구동될 수 있다. 하지만 일반적으로 독립 노드의 MDT와 각 OSS 노드마다 두개 이상의 OST, 그리고 수많은 클라이언트로 구성된다.

스토리지 타겟 (OST)

OST는 하나 이상의 OSS 상에 데이터 객체를 저장한다. 하나의 lustre 파일시스템은 각각의 파일 데이터셋을 제공하는 다수의 OST를 가질 수 있다. 파일과 OST사이에 반드시 1:1 매치를 해야하는 것은 아니다. 성능을 최적화하기 위해서는 파일이 다수의 OST에 걸쳐 퍼지게할 수도 있다. 논리객체볼륨(LOV)가 OST 상에 흩어져있는 파일들을 관리한다.

클라이언트 (lustre clients)

lustre 파일시스템을 마운트하고 실제로 사용하는 노드이다. 클라이언트 소프트웨어는 리눅스 VFS와 lustre 서버사이에 위치하고, 각 타겟은 하나의 클라이언트와 매치된다 (메타데이터 클라이언트, 객제 저장 클라이언트, 관리 클라이언트) 하나의 OSC의 그룹은 하나의 LOV로 감싸여있다. 실제로는 OSC는 파일시스템에 투명한 엑세스를 제공한다. lustre파일시스템을 마운트한 클라이언트는 단일하고, 응집성있고, 항상 네임스페이스에 동기화되어있다. 어떤 클라이언트가 파일을 읽는 동안 다른 클라이언트들은 동일 파일의 다른 부분에 쓰기작업을 할 수 있다.


필요콤포넌트

MDS, OSS : 패치된 커널, lustre 모듈, 설정 유틸리티 * http://wiki.lustre.org/index.php/Lustre_Documentation

서버

lustre-ldiskfs-3.0.9-2.6.18_164.11.1.el5_lustre.1.8.2
kernel-2.6.18-164.11.1.el5_lustre.1.8.2
lustre-modules-1.8.2-2.6.18_164.11.1.el5_lustre.1.8.2
lustre-1.8.2-2.6.18_164.11.1.el5_lustre.1.8.2


클라이언트

lustre-1.8.2-2.6.18_164.11.1.el5_lustre.1.8.2
kernel-2.6.18-164.11.1.el5_lustre.1.8.2
lustre-modules-1.8.2-2.6.18_164.11.1.el5_lustre.1.8.2


설정

MDS

메타데이터 저장소 타겟(MDT) / management 저장소 생성

[root@lustre-001 glusterfs]# mkfs.lustre --fsname=lustre --mdt --mgs  /dev/sdb1

   Permanent disk data:
Target:     lustre-MDTffff
Index:      unassigned
Lustre FS:  lustre
Mount type: ldiskfs
Flags:      0x75
              (MDT MGS needs_index first_time update )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters: mdt.group_upcall=/usr/sbin/l_getgroups

checking for existing Lustre data: not found
device size = 19085MB
2 6 18
formatting backing filesystem ldiskfs on /dev/sdb1
        target name  lustre-MDTffff
        4k blocks     4885760
        options        -J size=400 -i 4096 -I 512 -q -O dir_index,extents,uninit_groups -F
mkfs_cmd = mke2fs -j -b 4096 -L lustre-MDTffff  -J size=400 -i 4096 -I 512 -q -O dir_index,extents,uninit_groups -F /dev/sdb1 4885760
Writing CONFIGS/mountdata

마운트

[root@lustre-001 glusterfs]# mount -t lustre /dev/sdb1 /mds

OSS

스토리지 타겟(OST) 생성

[root@lustre-001 glusterfs]# mkfs.lustre --fsname=lustre --ost --mgsnode=192.168.100.76@tcp0 /dev/sdb2

   Permanent disk data:
Target:     lustre-OSTffff
Index:      unassigned
Lustre FS:  lustre
Mount type: ldiskfs
Flags:      0x72
              (OST needs_index first_time update )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.100.76@tcp

checking for existing Lustre data: not found
device size = 38154MB
2 6 18
formatting backing filesystem ldiskfs on /dev/sdb2
        target name  lustre-OSTffff
        4k blocks     9767520
        options        -J size=400 -i 16384 -I 256 -q -O dir_index,extents,uninit_groups -F
mkfs_cmd = mke2fs -j -b 4096 -L lustre-OSTffff  -J size=400 -i 16384 -I 256 -q -O dir_index,extents,uninit_groups -F /dev/sdb2 9767520
Writing CONFIGS/mountdata

스토리지 타겟 마운트

[root@lustre-001 glusterfs]# mount -t lustre /dev/sdb2 /data1


클라이언트

클라이언트 마운트
[root@manticore gluster]# mount -t lustre 192.168.100.76@tcp0:/lustre /lustre

[root@manticore gluster]# df -h /lustre/
Filesystem            Size  Used Avail Use% Mounted on
192.168.100.76@tcp0:/lustre
                       37G  449M   35G   2% /lustre

파일 복사 테스트

파일 사이즈 : 725M
rsync로 복사시 소요 시간 및 전송률
11.54MB/s
real    1m3.520s
user    0m13.244s
sys     0m15.330s

glusterfs에서 rsync로 복사시 소요 시간 및 전송률
10.06MB/s
real    1m12.379s
user    0m13.144s
sys     0m8.021s

근소하게 lustre가 앞서는 성능을 보여줌

OSS 확장

추가할 OSS에 서버와 동일한 패키지 설치
파일시스템(OST) 생성 : 기존에 lustre ost로 생성되었던 디바이스를 재생성시 --reformat 옵션을 추가한다.
[root@lustre-002 glusterfs]# mkfs.lustre --fsname=lustre --ost --reformat  --mgsnode=192.168.100.76@tcp0 /dev/sdb1

   Permanent disk data:
Target:     lustre-OSTffff
Index:      unassigned
Lustre FS:  lustre
Mount type: ldiskfs
Flags:      0x72
              (OST needs_index first_time update )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.100.76@tcp

device size = 38154MB
2 6 18
formatting backing filesystem ldiskfs on /dev/sdb1
        target name  lustre-OSTffff
        4k blocks     9767512
        options        -J size=400 -i 16384 -I 256 -q -O dir_index,extents,uninit_groups -F
mkfs_cmd = mke2fs -j -b 4096 -L lustre-OSTffff  -J size=400 -i 16384 -I 256 -q -O dir_index,extents,uninit_groups -F /dev/sdb1 9767512
Writing CONFIGS/mountdata

OST 마운트
[root@lustre-002 glusterfs]# mount -t lustre /dev/sdb1 /data1

클라이언트에서 용량 증설된 용량 확인 : 새로 마운트할 필요없이 동적으로 증가된 용량이 적용된다.
[root@manticore Oracle]# df -h /lustre/
Filesystem            Size  Used Avail Use% Mounted on
192.168.100.76@tcp0:/lustre
                       74G  1.6G   69G   3% /lustre

stripe 설정

lustre는 다수의 OSS가 설정될 경우 1개의 파일 object는 1개의 OSS(OST)에 할당된다. 클라이언트단에서 stripe 설정을 하면 해당 파일이나 디렉토리는 stripe count만큼 OST에 분산 할당되며 bandwidth도 선형적으로 증가한다.

stripe 설정
lfs setstripe -s 32M(스트라이프 사이즈) -c 2(스트라이프 OST 갯수) -i 1(인덱스) /lustre

파일 복사 테스트

파일 사이즈 : 725M

100Mbps 환경

기본 설정 (size : 1M, count : 1)
전송률 : 11.58MB/s

스트라이프 설정 1 (size : 1M, count : 2)
전송률 : 11.13MB/s
real    1m6.713s
user    0m12.731s
sys     0m13.313s

스트라이프 설정 2 (size : 4M, count : 2)
전송률 : 11.97MB/s
real    1m2.163s
user    0m12.583s
sys     0m12.896s

스트라이프 설정 3 (size : 16M, count : 2)
전송률 : 11.80MB/s
real    1m3.009s
user    0m13.069s
sys     0m13.745s

스트라이프 설정 4 (size : 32M, count : 2)
전송률 : 11.94MB/s
real    1m3.837s
user    0m12.537s
sys     0m12.780s
==> 스트라이프 사이즈가 4M를 초과하면서 네트웍 오버헤드 영향으로 성능 향상이 둔화된 것으로 추정.   4M에서 가장 좋은 성능이 나옴


FC (1000Mbps) 환경

기본 설정 (size : 1M, count : 1)
전송률 : 47.99MB/s
real    0m15.363s
user    0m5.494s
sys     0m3.393s

스트라이프 설정 1 (size : 1M, count : 2)
전송률 : 82.54MB/s
real    0m8.836s
user    0m5.539s
sys     0m3.777s

스트라이프 설정 2 (size : 4M, count : 2)
전송률 : 85.96MB/s
real    0m8.652s
user    0m5.474s
sys     0m3.818s

스트라이프 설정 3 (size : 16M, count : 2)
전송률 : 88.42MB/s
real    0m8.575s
user    0m5.587s
sys     0m3.451s

스트라이프 설정 4 (size : 32M, count : 2)
전송률 : 85.33MB/s
real    0m8.717s
user    0m5.643s
sys     0m3.365s
==> 마찬가지로 stripe size가 32M를 넘으면서 성능이 하락함. 16M에서 가장 좋은 성능이 나옴


Client on Patchless Kernel

클라이언트 전용 서버인 경우 커널 패치 없이 클라이언트 모듈만 올려서 lustre 클라이언트로 사용할 수 있다.

소스 빌드
./configure --with-linux=/path/to/linux/kernel (커널 모듈이 컴파일된 상태여야함)
make && make install
depmod -a && ldconfig
modprobe lustre
modprobe mgc

rpm 빌드
./configure --with-linux=/path/to/linux/kernel (커널 모듈이 컴파일된 상태여야함)
lustre.spec 파일을 열어 Requires: modutils >= 2.4.10, kernel = %{krequires} 항목 주석처리. (rpm 설치시 rpm 패키지에서 커널 찾는 동작 방지)
make rpms
rpm -Uvh lustre-1.8.2-2.6.24.2_201004051844.x86_64.rpm lustre-modules-1.8.2-2.6.24.2_201004051844.x86_64.rpm
depmod -a && ldconfig
modprobe lnet "networks=tcp0"
modprobe lustre
modprobe mgc

lustre 마운트
mkdir /lustre
mount -t lustre 192.168.100.76@tcp0:/lustre /lustre