[클러스터] pvfs2 를 이용한 병렬 파일시스템 구축
[목차]
1. 개요
2. pvfs2 란?
3. pvfs2 설정 및 구축하기
4. pvfs2 테스트
1. 개요
리눅스 클러스터라는 말을 서로 다른 설정 및 시스템 구성에 따라 각기 다른 이름을 가지고 클러스터에 부합하여 사용되고 있는데, 이 글에서 다룬 내용은 그 중에서 구지 명명 짓자면 스토리지 클러스터라고 할까?
왜?? 클러스터란 말을 이글에 사용하였냐 하면, 내가 알기쉽게 생각하는 클러스터라 함은 여러 노드들을 단일 노드처럼 사용하는 것을 말합니다.. 꼭 HPC 만이 단일노드화 해서 사용한다고 볼 수 없습니다.
개념적으로 각각의 클러스터는 차이점이 있지만 대표적인 예로 LVS 도 여러시스템들이 동일 ip를 공유해서 사용합니다. 여러시스템들이 하나의 ip로 클러스터 되었다고 보면 쉽게 이해가 갈 것입니다.
pvfs2 를 이용하여 여러 시스템의 하드디스크를 하나의 저장 공간인 것 처럼 사용할 수 있는데 위 글과 연관지어 보면 왜 클러스터를 말하는지 알것입니다.
구지 pvfs 를 가지고 설정하는것 이외에 gfs, google file system 등등 여러가지가 존재하며, 여기서는 pvfs에 대하여 테스트 해보겠습니다.
클러스터의 종류에는 LVS 클러스터, HA 클러스터, 마이그레이션 클러스터, 계산용 클러스터, 스토리지 클러스터 등이 있는데 여기서는 자세히 다루지 않았습니다.
이 글에서 언급되지 않은 로드밸런싱(LVS) 솔루션, 고가용성(HA) 솔루션, 계산용(HPC) 클러스터를 비롯한 많은 솔루션들을 리눅스원(주)에서 실제 고객 사이트에서 구축하고 있습니다.
2. pvfs2 란?
pvfs2 홈페이지에(http://www.pvfs.org/pvfs2/) 있는 내용에서 자세한 내용이 나오지만, 간단하게 이해해보면 클러스터 시스템을 구성하다보면 공유되는 디스크 공간이 필요하다. 이런 공유 저장장소를 nfs 로 구성하여 사용할수도 있지만, pvfs 를 사용하여 구성할수도 있습니다.
그러면 구체적으로 pvfs2가 어떻게 구동되는지 알아보겠습니다.
pvfs2 시스템에서는 중요한 3가지 roles 이 있는데 그 3가지 roles 이라 함은 metadata server, I/O server, client 라 합니다.
metadata server 는 퍼미션, 파일이 언제생성되었는지?, 파일의 위치, 어떤 시스템에 분산되어 저장되어 있는지? 이런 정보들을 metadata 라하는데 이와 같은 정보들을 유지하고 가지고 있습니다.
I/O server 는 pvfs2 파일(data)를 실질적으로 저장하고 있습니다.
client 는 pvfs2 파일을 읽고 쓰기를 하는 노드를 말합니다.
하나의 시스템에 위의 3가지 role이 다 존재할 수도 있고, 하나 또는 두개가 존재할수도 있습니다.
pvfs1 은 두가지 형태의 서버 프로세스가 있다. 하나는 mgrs 로 metadata 를 제공하고 다른 하나는 iods 로 data를 제공합니다.
그러나 pvfs2 는 pvfs1과는 다르게 한가지 형태의 서버 프로세스인 pvfs2-server 로 구성됩니다. 다시말해 mgrs 와 iods 서버가 합쳐진 것입니다.
현제 하나의 metatdata server 만을 제공하며 추후 이러한 제한사항을 업그레이드 하려고 한답니다.
그리고 왜 파일시스템을 RAID 를 사용하거나 nfs 등을 이용해도 되는데 구지 병렬처리 파일시스템이 나왔는지는 여러분이 한번 생각해 보시기 바랍니다.
3. pvfs2 설정 및 구축하기
지금부터 pvfs2 설정에 들어가 보겠습니다.
일단 http://www.pvfs.org/pvfs2/ 여기서 pvfs2 를 다운 받아야 겠죠?
test1.com 노드를 metadata 를 제공하는 metadata server로 설정을 할것이고,
client1.krb.com, client2.krb.com, krb.com 노드들을 I/O 서비스를 제공하는 I/O server로 만들것입니다.
#호스트 확인
[root@test1 pvfs-meta]# cat /etc/hosts <— 각각의 호스트를 확인한다.
127.0.0.1 test1.com localhost.localdomain localhost
192.168.5.1 test1.com test1
192.168.5.2 krb.com krb
192.168.5.3 client1.krb.com client1
192.168.5.4 client2.krb.com client2
#configur& make & make install
[root@test1 pvfs2-1.0.1]# ./configure –prefix=/usr/local/pvfs –with-kernel=/down/kernel/linux-2.6.10
참고 :
./configure –with-kernel=/usr/src/linux-`uname -r | cut -d- -f1,2` –enable-mmap-racache
–with-kernel=나중에 pvfs2 파일시스템 모듈을 생성해야 하는데 이때 사용할 2.6.x 커널 소스가 있는 경로를 지정합니다.
[root@test1 pvfs2-1.0.1]# make; make install
#make & Installing PVFS2 kernel module
pvfs2 커널 디바이스 드라이버는 리눅스 커널 디바이스 드라이버 만들기 강좌를 참고하고 생성해 보시기 바랍니다.
저도 그 강좌를 보고 만들었기때문에 쉽게 만들어 보실 수 있을 겁니다.
만드셨다면 모듈을 올리십시오.
#Installing PVFS2 on a cluster
하나의 시스템에서 metadat server와 I/O server 가 존재하게 설정하는 것과 클러스터로 묶여 있는 시스템에 하나의 metadata server 와
다수의 I/O server 로 구성할수 있습니다.
앞에서 후자의 경우를 설정해본다고 했으니 그렇게 해야겠죠?
순서는 다음과 같습니다.
1. 모든 i/o server 로 사용할 노드들에 pvfs2 를 설치합니다.
2. 설정파일을 생성합니다.
3. test1.com (metadata server)에 있는 /etc/pvfs2* 파일을 각각의 i/o 노드에 복사합니다.
4. 서버를 실행하면 됩니다.
#Server configuration
여기서 pvfs2 data 는 /pvfs-meta 안에 저장할 것이 고요.
/mnt/pvfs2 는 클라이언트에서 마운트 포인트 입니다.
pvfs2-genconfig 툴을 사용하여 두가지의 설정파일을 생성할것인데요.
하나는 file system 설정파일이며 모든 서버의 동일한 설정부분을 가지고 있습니다.
다른 하느는 각각의 서버들읠 설정파일들을 가지고 있습니다.
루트 사용자로 실행을 해야하며 /etc 디렉토리안에 설정파일이 존재합니다.
[root@test1 bin]# ./pvfs2-genconfig /etc/pvfs2-fs.conf /etc/pvfs2-server.conf
**********************************************************************
Welcome to the PVFS2 Configuration Generator:
This interactive script will generate configuration files suitable
for use with a new PVFS2 file system. Please see the PVFS2 quickstart
guide for details.
**********************************************************************
You must first select the network protocol that your file system will use.
The only currently supported options are “tcp”, “gm”, and “ib”.
(For multi-homed configurations, use e.g. “ib,tcp”.)
* Enter protocol type [Default is tcp]: <– enter(default) pvfs2 에서 사용할 프로토콜을 결정합니다.
Choose a TCP/IP port for the servers to listen on. Note that this
script assumes that all servers will use the same port number.
* Enter port number [Default is 3334]: <– enter(default) 사용할 포트 번호를 지정합니다.
Next you must list the hostnames of the machines that will act as
I/O servers. Acceptable syntax is “node1, node2, …” or “node{#-#,#,#}”.
#### A list of all of the hosts that will be providing disk space ####
* Enter hostnames [Default is localhost]: krb.com, client1.krb.com, client2.krb.com <– I/O server 로 사용할 서버들을 나열합니다.
여기서 metadata server 를 지정하면 한시스템에 모든 기능을 하는 싱글 시스템이 됩니다.
Now list the hostnames of the machines that will act as Metadata
servers. This list may or may not overlap with the I/O server list.
* Enter hostnames [Default is localhost]: test1.com <– metadata server 호스트를 지정합니다. 여기까지 하면 아래와 같은 내용이 출력됩니다.
Configured a total of 4 servers: <– 총 4개의 서버가 설정되었구요.
3 of them are I/O servers. <– 3개의 I/O 서버가 설정되었내요.
1 of them are Metadata servers. <– 한개의 metadata 서버가 설정되고요.
* Would you like to verify server list (y/n) [Default is n]? y <– 지금까지의 설정을 검사할 것인지 물어보내요..
****** I/O servers:
tcp://client1.krb.com:3334
tcp://client2.krb.com:3334
tcp://krb.com:3334
****** Metadata servers:
tcp://test1.com:3334
* Does this look ok (y/n) [Default is y]? y <— 검사한 설정이 맞으면 y 를 누르세요… ^^
Choose a file for each server to write log messages to.
* Enter log file location [Default is /tmp/pvfs2-server.log]: /var/log/pvfs2.log <— 로그가 기록될 파일명을 지정합니다.
Choose a directory for each server to store data in.
* Enter directory name: [Default is /pvfs2-storage-space]: /pvsf-meta <— data 가 저장될 디렉토리를 지정합니다.
Writing fs config file… Done.
Writing 4 server config file(s)… Done.
The resulting configuration will be saved in /etc/pvfs*.
You will want to make sure this is in sync with the rest of the cluster
[root@test1 pvfs-meta]# ls /etc/pvfs2-*
/etc/pvfs2-fs.conf /etc/pvfs2-server.conf-krb.com
/etc/pvfs2-server.conf-client1.krb.com /etc/pvfs2-server.conf-test1.com
/etc/pvfs2-server.conf-client2.krb.com
#copied out to all of the server nodes
위의 설정파일들을 모든 I/O server 노드에 복사를 합니다.
시스템이 Redhat 스타일이라면 디렉토리 안에 있는 rc 스크립트를 편집하여 자동으로 복사하시면 됩니다.
예제파일을 싱행하여 보았습니다.
[root@test1 pvfs-meta]# for i in `seq 1 8`; do
> scp /etc/pvfs2-server.conf-cluster\\${i} cluster\\${i}:/etc/
> scp /etc/pvfs2-fs.conf cluster\\${i}:/etc/
> scp /usr/src/pvfs2/examples/pvfs2-server.rc \\
cluster\\${i}:/etc/rc.d/init.d/pvfs2-server
> ssh cluster\\${i} /sbin/chkconfig pvfs2-server on
> done
#Starting the servers
아래의 명령어로 모든 metadata server 와 I/O 노드들을 구동시킬수 있습니다.
그러면 하나의 저장 공간이 생기게 됩니다. (/pvfs-meta)
저장공간이 만들어지지 않고 처음 구동하실때 사용하는 명령어입니다.
[root@test1 pvfs-meta]# /usr/local/pvfs/sbin/pvfs2-server /etc/pvfs2-fs.conf /etc/pvfs2-server.conf-`hostname` -f
해당 저장공간이 이미 만들어져 있다면 아래의 명령어만 실행하시면됩니다.
[root@test1 pvfs-meta]# /usr/local/pvfs/sbin/pvfs2-server /etc/pvfs2-fs.conf /etc/pvfs2-server.conf-`hostname`
[root@test1 pvfs-meta]# ls
5d8a54bb collections.db storage_attributes.db
#Client configuration
두가지 방법으로 pvfs2 파일 시스템에 접근가능하며, 첫번째 방법은 리눅스 파일시스템과 호환가능한 kernel module 를 생성하여 접근하는것이고
다른 하나는 MPI-IO 인터페이스를 통하여 접근하는 방법입니다.
여기서는 첫번째 방법을 사용하겠습니다.
/etc/pvfs2tab 파일안에 아래와 같이 fstab 에 사용하는 유사한 옵션을 사용하여 클라이언트들은 서버에 접근하여 마운트 할수 있습니다..
tcp://test1.com:3334/pvfs-meta /mnt/pvfs2 pvfs2 default,noauto 0 0
위의 설정 내용을 보면 tcp://test1.com:3334/pvfs-meta = pvfs2 server 를 뜻하고,
/mnt/pvfs2 은 클라이언트의 mount point 이다.
fstab 맨페이지(5) 를 참조하면 해당 라인의 정보를 볼수가 있다.
[root@test1.com /root]# mkdir /mnt/pvfs2 <– 마운트할 디렉토리를 만들고
[root@test1.com /root]# touch /etc/pvfs2tab <– 파일을 만들어서 이파일에 위의 내용을 넣습니다.
tcp://test1.com:3334/pvfs2-fs /mnt/pvfs2 pvfs2 default,noauto 0 0
[root@test1.com /root]# chmod a+r /etc/pvfs2tab <– 퍼미션을 수정합니다.
모든 클라이언트들은 pvfs2 파일시스템을 찾고 접근하여 사용할수 있으려면 /etc/pvfs2tab file or an /etc/fstab 에 등록되어져 있어야 합니다.
4. pvfs2 테스트
[root@test1 down]# /usr/local/pvfs/bin/pvfs2-ping -m /mnt/pvfs2
(1) Parsing tab file…
(2) Initializing system interface…
(3) Initializing each file system found in tab file: /etc/pvfs2tab…
/mnt/pvfs2: Ok
(4) Searching for /mnt/pvfs2 in pvfstab…
PVFS2 servers: tcp://test1.com:3334
Storage name: pvfs2-fs
Local mount point: /mnt/pvfs2
meta servers:
tcp://test1.com:3334
data servers:
tcp://client1.krb.com:3334
tcp://client2.krb.com:3334
tcp://krb.com:3334
(5) Verifying that all servers are responding…
meta servers:
tcp://test1.com:3334 Ok
data servers:
tcp://client1.krb.com:3334 Ok
tcp://client2.krb.com:3334 Ok
tcp://krb.com:3334 Ok
(6) Verifying that fsid 1569346747 is acceptable to all servers…
Ok; all servers understand fs_id 1569346747
(7) Verifying that root handle is owned by one server…
Root handle: 1048576
Ok; root handle is owned by exactly one server.
=============================================================
The PVFS filesystem at /mnt/pvfs2 appears to be correctly configured.
[root@test1 down]# /usr/local/pvfs/bin/pvfs2-ls /mnt/pvfs2
lost+found
[root@test1 down]# /usr/local/pvfs/bin/pvfs2-cp /용량큰파일 /mnt/pvfs2 <<– pvfs2-cp 명령어를 사용하여 용량이 큰파일을 복사해봅니다.
눈으로 확인하시고 싶으시다면 설치하신 디렉토리에 Karma 를 실행하시면 gui 툴이 뜨면서 각각의 I/O 서버에 파일이 써지는 것이 그래프로 보이실 겁니다.
지금까지 간단 pvfs2 (병렬 파일시스템) 을 구축하고 테스트 해보았습니다.
더많은 정보를 원하신다면 http://www.pvfs.org/pvfs2/ 이곳을 찹조하세요..
저도 이곳에 있는 내용을 바탕으로 문서를 만들었습니다.
############ Automatic server startup and shutdown ##################
rc 스크립트를 사용하여 부팅할때 자동으로 사작되게 할수 있습니다.
bash-2.05b# cp /usr/src/pvfs2/examples/pvfs2-server.rc \\
/etc/rc.d/init.d/pvfs2-server
bash-2.05b# chmod a+x /etc/rc.d/init.d/pvfs2-server
bash-2.05b# chkconfig pvfs2-server on
bash-2.05b# ls -al /etc/rc.d/rc3.d/S35pvfs2-server
lrwxrwxrwx 1 root root 22 Sep 21 13:11 /etc/rc.d/rc3.d/S35pvfs2-server \\
-> ../init.d/pvfs2-server
bash-2.05b# /etc/rc.d/init.d/pvfs2-server start
Starting PVFS2 server: [ OK ]
To manually stop the server:
bash-2.05b# /etc/rc.d/init.d/pvfs2-server stop
Stopping PVFS2 server: [ OK ]
GLAY | Linux