저번 문서까지는 고가용성 부하분산 클러스터를 직접 구축했었다. 이번에는 클러스터의 또 다른 분야인 과학 계산 클러스터를 만들어 볼 것이다.
과학 계산 클러스터를 구축하는 방법에는 여러가지가 있겠지만, 필자는 디스크-리스(disk-less) 클러스터를 구축할 것이다.
우선 준비물을 알아보자!
필자는 총 3대의 컴퓨터를 묶어서 만들 것이다. 1대의 Master node 와 2대의 real node 이다.
| cpu | 펜티엄 3 500MHZ |
| ram | 256MB |
| hdd | 8.5G (참고로 파티션은 /boot 와 / 로만 잡아주었다) |
| etc | lan card(realtek 8139) 1장 |
| cpu | 셀러론 533MHZ |
| ram | 128MB |
| etc | lan card(realtek 8139) 1장 |
| cpu | 펜티엄 2 233MHZ |
| ram | 64MB |
| etc | lan card(realtek 8139) 1장 |
그외 허브 1개(참고로 필자는 5port 였다)
위에서 하드웨어 사양을 봐도 알겠지만, 어떻게 저 사양을 가지고 클러스터를 만들겠다는 건지 의문이 들 정도이다. 암튼 우리는 저 사양을 가지고 클러스터를 만들어 볼 것이다.
참고로 read node들은 하드가 필요없다. 하지만 반드시 플로피 드라이브가 있어야 한다.
왜냐하면, 하드가 없는 대신 플로피로 부팅을 해야 하기 때문이다.
자~아 이제 본격적인 설정에 들어가보자!!
참고로, 우리가 만들어 볼 클러스터의 모습은 아래와 같다.
우선 마스터 노드에 레드햇 8.0을 설치했다. 참고로 설치할때 X윈도우 관련 패키지는 설치하지 않았고, lam, pvm, dhcp 패키지를 추가로 선택하여 설치했다. 필자의 경우 용량은 총 1G 남짓되었다.
우선 master node에 필요한 프로그램들을 다운 받아서 설치해야 한다.
다음과 같다.
☞ 만일 나중에 아래와 같은 에러가 난다면, 아래 패키지를 설치한다.
$mpicc my_mpi.c /usr/bin/ld: cannot find -laio Colletct2: ld returned 1 exit status
우선 tftp 부터 알아보자!
/etc/xinetd.d/tftp 파일을 아래와 같이 편집해야 한다.
service tftp
{
disable = no -> 활성화 시켜준다.
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -> 나중에 커널 이미지가 있을 경로
per_source = 11
cps = 100 2
}
그리고 나서,
#/etc/init.d/xinetd restart
제대로 설정이 되었는 지 확인해보자!!
#netstat -lnu
결과 udp 포트 69번이 열려 있어야 한다.
우선 부팅용 커널 이미지를 만들기 전에 우리는 여기서 커널 컴파일을 해야 한다. 기본적으로 Redhat8.0에 기본적으로 탑재되어 있는 바닐라 커널로는 우리가 원하는 disk-less를 구현할 수 없다. 그래서 여기서 우리는 따로 kernel-2.4.18 커널을 받아서 컴파일할 것이다.
다음은 컴파일시 반드시 지정해주어야 하는 커널 옵션이다!! 주의 깊게 보기 바란다!!
Block divices <*> loopback block device support <*> Network block device support <*> RAM disk support (4096) efault RAM disk size [*] initial RAM disk(initrd) support Networking options <*> Network packet filtering(replaces ipchains) <*> Socket Filtering <*> Unix domain sockets <*> TCP/IP networking <*> IP:kernel level autoconfiguration <*> IP:DHCP support <*> IP:BOOTP support <*> IP:RARP support Network device support <*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support ReadTek Lan Card 관련 모두 체크한다. Character devices <*> Enhanced Read Time Clock Support File systems <*> Ext3 journalling file system support Ext3 관련 모두 체크한다. master node의 파일시스템을 확인한다. <*> NFS file system support <*> Provide NFSv3 client support <*> Root file system on NFS <*> NFS server support <*> Provide NFSv3 server support <*> Provide NFS server over TCP support
위에서 언급한 것은 반드시 해주어야 한다. 만일 커널 패닉이 난다면, 위의 옵션을 다시 한번 확인하자!! 성공적으로 컴파일을 했다면, 커널 이미지를 /boot 파티션으로 복사하고 부트로더에 등록해서 다음부터는 새로 만든 커널 이미지로 부팅하도록 한다.
여기서 새로운 커널 이미지로 할 것이 있다. 바로 부팅용 커널 이미지를 만드는 것이다.
바로 위에서 설치했던 mknbi를 사용할 것이다.
#mknbi-linux --ip=dhcp --output=/tftpboot/vmlinuz bzImage
위에서 보면 알겠지만 새로 만들어진 커널 이미지(bzImage)를 /tftpboot/ 아래에 부팅 커널 이미지(vmlinuz)으로 만들었다.
이제 부터 다른 read node들은 모두 이 부팅 커널 이미지를 사용해서 부팅하게 될 것이다.
새로운 커널로 부팅했다면, 이제 네트워크 설정을 해주어야 한다. 우선 /etc/hosts 파일을 다음과 같이 수정하자!!
127.0.0.1 localhost.localdomain localhost 210.119.108.172 cluster 210.119.108.173 node1 210.119.108.174 node2
그리고 나서 이제 real node들이 사용할 부팅 영역을 만들어 주어야 한다.
우리는 앞에서 /tftpboot 아래에 영역을 만들어 줄 것임을 암시했었다.
#cd /tftpboot #mkdir node1 node2 #cd node1 #cp -a /bin /boot /dev /etc /lib /root /sbin /usr /var /home ./ #mkdir proc #ln -s var/tmp tmp #chroot /tftpboot/node1 /bin/bash #vi /etc/fstab --------------------------------------------------------------------------------------- 210.119.108.172:/tftpboot/node1 / nfs defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /dev/shm tmpfs defautls 0 0 ---------------------------------------------------------------------------------------
node2 의 경우도 위와 마찬가지로 설정해준다.
어떻게 보면 가장 중요한 부분일지도 모르겠다. 왠만한 정보를 dhcp가 부팅할 때 정보를 주기 때문에 만일 real node에서 부팅이 안된다면, dhcp문제일 가능성이 가장 높다.
--------------------------------------------------------------------------
ddns-update-style none;
default-lease-time 21500;
max-lease-time 43200;
authoritative;
option subnet-mask 255.255.255.0;
option broadcast-address 210.119.108.255;
option routers 210.119.108.254;
option domain-name-servers 210.119.108.178;
option domain-name "cluster";
shared-network WORKSTATIONS
{
subnet 210.119.108.0 netmask 255.255.255.0
{
option routers 210.119.108.254;
option subnet-mask 255.255.255.0;
range dynamic-bootp 210.119.108.150 210.119.108.170;
default-lease-time 21600;
max-lease-time 43200;
}
}
group
{
use-host-decl-names on;
option log-servers 210.119.108.172;
host node1
{
hardware ethernet 00:E0:4C:6D:54:B7;
fixed-address 210.119.108.173;
option root-path "/tftpboot/node1";
filename "vmlinuz";
}
host node2
{
hardware ethernet 00:50:FC:A5:E9:53;
fixed-address 210.119.108.174;
option root-path "/tftpboot/node2";
filename "vmlinuz";
}
}
--------------------------------------------------------------------------
/etc/exports 파일을 아래와 같이 수정해준다.
-------------------------------------------------------------------------- /tftpboot/node1 210.119.108.173(rw,no_root_squash,no_subtree_check,sync) /tftpboot/node2 210.119.108.174(rw,no_root_squash,no_subtree_check,sync) -------------------------------------------------------------------------- #exportfs -ar
적용시킨다.
#/etc/init.d/portmap restart #/etc/init.d/nfs restart
real node는 하드 디스크가 없기때문에 네트워크 부팅 디스켓으로 부팅해서 램 디스크를 사용해야 한다. 그래서 부팅 디스켓을 만들어야 한다.
우선 www.rom-o-matic.org 에 접속한다. 그리고 자신에 맞는 랜카드를 선택한 후에 'Get ROM' 버튼을 눌러 이미지를 다운 받는다. 그리고 빈 플로피 디스켓을 한장 준비한다.
#cat eb-5.2.0-rtl8139.zdsk > /dev/fd0
필자의 경우는 2대의 real node가 같은 랜카드를 사용했으므로 같은 것으로 디스켓 2장을 준비했다.
이제는 각각의 real node를 부팅시켜보자!!
각 노드로 부팅하고 로그인 했다면, 수정해주어야 할 것들이 있다.
왜냐하면, master node의 파일 시스템을 그대로 복사했기 때문에 설정이 같을 수 있기 때문이다. 예를 들면, ip address 같은 것들이다.
이 사이트(http://people.kldp.org/~eunjea/ssh/x87.html)를 참조하기 바란다.
설정해주는 이유는 전에는 rsh를 이용해서 각 노드간에 통신을 했지만, 보안적인 문제때문에 ssh로 바뀌고 있는 추세이기 때문이다.
이제 테스트 할 시간이다.
우선 master node에 일반 사용자(여기에서는 fat81 이라는 계정)을 만들어야 한다. 참고로 real node에서도 같은 'fat81' 이라는 계정이 있어야 한다. 이 것은 앞의 ssh를 설정할 때의 필요한 조건이다.
master node에 'fat81' 로 로그인하고서,
$vi /home/fat81/lamhosts -------------------------------------------------------------------- cluster node1 node2 -------------------------------------------------------------------- $recon -v lamhosts . --------------------------------- Woo hoo!! .. .. .. --------------------------------- $lamboot -v -d lamhost topology done
☞ 위의 명령을 내렸을 때 크게 두가지 반응이 있을 수 있다.
필자의 경우 위의 두경우에 모두 무시하고 다시 시도해본 결과 잘 되었다.
이제는 작동 여부를 판단 할 프로그램을 구해야 한다.
이것은 lam source파일로 구할 수 있다. 압축을 풀면 example 디렉토리가 있다. 거기에 ring 이라는 프로그램이 있을 것이다.
$mpicc -o ring ring.c $mpirun -np 3 ring