– 클러스터 이해하기
생물정보학 분야에서 연구를 하다보면 가장 많이 필요한 장비가 자료를 저장할 좋은 Database 서버와 자료를 만드는대 사용되는 클러스터 같습니다. 슈퍼컴퓨터가 있으면 제일 좋겠지만, 그게 어디 한두푼 하나요. 국내에 있는 수퍼컴퓨터 센터를 이용하려고 해도 일게 석사한테 빌려주지도 않을 것 같고, 요즘은 개인용 데스크탑 CPU 도 정말 잘 나와서 이것들을 잘 묶으면 멋진 성능을 발위해주니 클러스터를 직접 구성해서 사용하는게 가장 속편하고 좋은것 같습니다.
최근에 회사의 리눅스 클러스터를 다시 구성했습니다. 원래 클러스터를 구성해주시던 분이 영국으로 유학을 가셔서 그냥 사용하고 있다가 문제가 생겨서 다시 구성을 하게 되었는데요. 자료를 찾다보니 딱히 잘 정리되 있는게 없더군요. 거기다 회사 클러스터가 서버는 64비트고 노드는 32비트여서 설치하는데 그나마 있는 자료들도 별로 소용이 없더군요. 그래서 클러스터 구성하는 글을 하나 써봅니다. 이기종간의 클러스터 설정을 성공을 했는데, 무지막지한 삽질이 들어가야 해서, 그냥 동일한 배포본을 이용하라고 권해드리지만, 제가 삽질하면서 얻은 이기종간의 클러스터 구성시의 주의할 점도 명시하겠습니다.
첫번째 글로 클러스터를 구성에 대한 대략적이야기와 OS, Queueing 프로그램에 대한 개념과 앞으로 어떤 것들을 선택해서 설치할 지를 정하겠습니다.
먼저 용어 몇가지를 정의 하고 넘어가겠습니다.(이 용어는 제가 이글에서 사용할 용어지 표준 용어는 아닙니다.)
Job : 사용자가 클러스터에서 돌리기원하는 계산프로그램.
Queue : 클러스터가 계산하을 하기 위한 Job이 쌓이는 저장소.
Queueing System : Queue 를 관리하는 프로그램. Mosix, OpenPBS, SunGridEngine 등 다양한 방법이 있습니다.
Cluster Master : 클러스터의 중심이 되는 컴퓨터 입니다. 사용자는 이 컴퓨터에 접속해서 Queue 에 Job 을 추가합니다.
Cluster Node : 클러스터에서 계산을 하는 컴퓨터 입니다. Master 는 대부분 하나겠지만, Node 는 여러대겠죠?
클러스터를 구성한다고 하면 크게 2가지 일을 해야 합니다. Master 와 Node 에 OS를 설치&설정하는게 첫번재고, 계산 프로그램을 각 Node 에 분산시켜줄 Queueing 시스템 구성이 두번째 입니다. 결론을 부터 이야기 하자면
OS : CentOS (RedHat Enterprise Linux Clone)
Node 구성
Package : Perceus
Diskless :
Queueing System : Sun Microsystems N1 Grid Engine
MPI Library : OpenMPI
입니다.
OS 와 시스템 구성 방법의 선택은 당연히 “편리성” 입니다. 생물정보학의 대부분의 프로그램은 Linux 기반으로 작동이 되고, Cluster 로 가장 안정적으로 돌아가는 운영체제가 Linux 이니 당연히 Linux 를 선택해야 합니다. 전체 Cluster 를 구성하는 방법은 Diskless 방식 입니다. 이것은 Master 에만 하드디스크를 두고 Node 들은 하드디스크 없이 Network File System (NFS) 를 이용해서 Master 의 특정 디렉토리를 자신의 하드디스크 처럼 이용하는 방식입니다. 이 방식은 Node 를 관리할때 Master 에 있는 이미지만 수정하면 된다는 장점이 있습니다.
이제 수 많은 Linux 배포판 중에 어떤 것을 선택할 것인가가 문제입니다. GentooLinux, UbuntuLinux, SuSE Linux, RedHat Enterprise Linux(RHEL) , Fedora Core 등 정말 많은 배포본이 있습니다. 여기서는 RHEL 을 사용하기로 합니다. 하지만 RHEL 을 구입할 필요 없이 RHEL 의 clone 인 CentOS 를 이용합니다. RHEL 을 선택한 이유는 Diskless 시스템을 구성하는데 사용할 패키지인 Warewulf 가 CentOS 를 기준으로 만들어졋기 때문입니다.
Queueing System 으로는 Mosix, OpenPBS, SunGrid Engine 등이 있는데, 이 중에서 Sun Microsystems Grid Engine 을 사용하겠습니다.
2008. 4. 14일 현재 CentOS 는 5.1 이, Perceus 1.2.7이 , SunGridEngine 은 6 update 10 이 최신버져입니다.
리눅스 클러스터를 만드는 방법은 정말 많습니다. 이 중에서 제가 주변 살마들에게 배우고 판단하기기에 가장 편리하고 빠르게 구축할 수 있는 방법을 선택했습니다. 실제 구축 이야기는 다음 글에 계속 됩니다.
– 시스템 구성과 CentOS 설치하기
이번에는 클러스터를 작동시키는 기본이되는 CentOS 설치를 하겠습니다. Diskless 시스템을 구축할 예정이므로 Master Node 에만 설치하면 됩니다.
우리가 만들 클러스터는 Master 만 외부와 연결되어 있고, Master 와 Node 는 내부네트웍으로 구성되어 있습니다. 그래서 Master 에는 2개의 Lan card 가 필요합니다. 다음과 같은 형식 입니다.
<Internet> — ( eth0 : Master : eth1 ) — ( eth0 : Nodes )
여기서 master 의 eth0 는 실제 master 가 인터넷에 접근할때 사용되는 IP를 할당해 주시면 됩니다. 그리고 master 의 eth1 과 node 의 eth0 는 10.0.0.XXX 형식의 사설 IP를 사용하도록 하겠습니다. 사설 IP 할당은
master eth1 : 10.0.0.1
node : 10.0.0.101 ~ 254
으로 하시면 됩니다.
사실 CentOS 설치는 설명할 것이 없습니다. CentOS 홈페이지에 가서 CD 를 받고, 설치하시면 됩니다.
설치할 배포본은 가장 최신 버젼인 CentOS 5.1 입니다. (updated 2008. 4. 12)
CentOS 설치는 아주 간단합니다. ISO 로 배포되는 파일을 받아서 DVD 나 CD를 구워서 설치를 하시면됩니다. 설치과정에서 특별히 설치해야 될 부분은 없습니다. 단지, 차후에 Update 시에 쓸모없는 프로그램이 설치되어 있으면 오래 걸리니 “사무용 패키지, 출판, 배포, DNS서버, 메일서버, FTP서버 등”은 설치하지 않기를 바랍니다. 그리고 개발관련 패키지 는 설치를 해주시는 것이 좋습니다. 그리고 잊지 말고 eth0 와 eth1 에 적절한 IP 를 할당해 주시기 바랍니다.
만약 CentOS 를 설치하지 못한다면, 리눅스 클러스터 구축보다 리눅스 기본 사용법 부터 익히는 기를 추천합니다.
설치를 다 하고 재부팅되면 방화벽과 SELinux 설정이 나오게 됩니다. 이 옵션을 모두 비활성화 시키시기 바랍니다. SELinux 를 사용하면 안되고, 방화벽은 클러스터를 모두 구축하고 난뒤에 정상작동 되는 것을 확인하고 활성화시키는 것이 좋습니다.
CentOS 설치를 끝내고 부팅후 터미널로 들어가서 yum 을 이용해서 시스템을 최신버젼으로 update 합니다.
# yum -y update
그리고 필요없이 서비스들을 모두 중단시킵니다(bluetooth, ISDN, pcmcia, gpm 등등..). 터미널에서 “setup” 명령어 실행후 System Service 항목으로 들어가면 선택할 수 있습니다. 그리고 재부팅합니다.
– Perceus 설치하기
Perceus 는 Infiscale 에서 만든 Diskless 클러스터 구축용 프로그램 패키지 입니다. 이런 프로그램이 나오기 전에는 복잡하고 어려운 과정을 거쳐야 했지만, 이제는 쉽게 구축할 수 있습니다. Diskless Cluster 를 구축하는데 사용되는 tftp, dhcp 서버를 별도로 설치할 필요도 없고, node 구성부터 등록까지 자동으로 처리해 줍니다.
CentOS 의 설치에 대한 내용은 별도로 언급하지 않겠습니다. 여기서 사용한 시스템은 CentOS 5.1 이며, 2008년 4월 10일자로 “# yum update” 명령을 통해서 갱신된 버젼입니다. CentOS 설치시에 SELinux 와 방화벽 설정을 끄시길 바랍니다. SELinux는 사용하지 않으셔야 하며, 방화벽은 Perceus 설치 끝내고 정상적으로 작동이 되는 것을 확인하고 다시 활성 시키는게 정신건강에 좋습니다.^^
Perceus 를 설치를 위한 Host 설정
Perceus 설치하기 전에 몇 가지 설정을 먼저 합니다. 우리가 구성하는 시스템은 랜카드를 2개 가지고 있습니다. 외부 인터넷과 연결되는 eth0 와 내부 클러스터 노드들과 연결되는 eth1 카드 입니다. 이중 eth1 카드를 설정해야 합니다.
CentOS 에서 eth1 카드에 대한 환경 설정 파일은 /etc/sysconfig/network-scripts/ifcfg-eth1 에 존재합니다. 이 파일을 열어서 다음과 같은 내용으로 바꿔 줍니다. 이때 HWADDR= 로 시작하는 라인이 있으면 그 라인을 다음 내용 뒤에 추가합니다.
DEVICE=eth1
BOOTPROTO=static
BROADCAST=10.0.255.255
IPADDR=10.0.0.1
NETMASK=255.255.0.0
NETWORK=10.0.0.0
ONBOOT=yes
TYPE=Ethernet
그리고 네트워크를 재시작 합니다.
# /etc/init.d/network restart
Perceus 설치를 위한 관련 라이브러리 설치
Perceus 가 동작하기 위한 관련 라이브러리들이 먼저 설치되어 있어야 합니다(너무 당연하가요?^^;). 먼저 yum 에서 제공되는 것들을 설치 합니다.
# yum -y groupinstall “Development Tools”
# yum -y install nasm
# yum -y install perl-DBI
이제 source rpm 파일을 building 하기 전에 다음 명령을 실행합니다.
echo “%debug_package %{nil}” > /root/.rpmmacros
이제 추가 패키지로
bash-completion
perl-IO-Interface
perl-Net-ARP
perl-Unix-Syslog
를 설치해야 합니다. 이 패키지는 Perceus 에서 제공되는 버젼을 설치 해야 합니다.
# wget http://www.perceus.org/downloads/perceus/v1.x/dependencies/bash-completion-20060301-1.caos.src.rpm
# wget http://www.perceus.org/downloads/perceus/v1.x/dependencies/perl-IO-Interface-0.98-1.caos.src.rpm
# wget http://www.perceus.org/downloads/perceus/v1.x/dependencies/perl-Net-ARP-1.0-2.caos.src.rpm
# wget http://www.perceus.org/downloads/perceus/v1.x/dependencies/perl-Unix-Syslog-0.99-1.caos.src.rpm
# rpmbuild –rebuild bash-completion*.src.rpm
# rpmbuild –rebuild perl-IO-Interface*.src.rpm
# rpmbuild –rebuild perl-Net-ARP*.src.rpm
# rpmbuild –rebuild perl-Unix-Syslog*.src.rpm
# cd /usr/src/redhat/RPMS/noarch/
# rpm -Uvh bash-completion*.src.rpm
# rpm -Uvh perl-IO-Interface*.src.rpm
# rpm -Uvh perl-Net-ARP*.src.rpm
# rpm -Uvh perl-Unix-Syslog*.src.rpm
Perceus 설치
Perceus 1.3.7 파일을 받습니다.
# cd /root/
# mkdir perceus/
# cd perceus/
# wget http://www.perceus.org/portal/files/perceus-1.3.7.tar.gz
# export TAR_OPTIONS=–wildcards
# rpmbuild -ta perceus-1.3.7.tar.gz
이 러면 이런 저런 메세지를 내뿜으면서 perceus 의 rpm 패키지가 만들어 집니다. 만들어진 패키지는 /usr/src/redhat/RPMS 의 어딘가(^^)에 존재합니다. 만들어진 rpm 파일은 총 2개 입니다. perceus-1.3.7.rpm 파일 입니다.
# rpm -Uvh /usr/src/redhat/RPMS/*/perceus-1.3.7.rpm
설치가 끝나게 됩니다.
– Perceus 설정하기
이제 perceus 설정을 하겠습니다. perceus 의 환경 설정파일들은 /etc/perceus/ 에 위치합니다. 이곳에 있는 파일중 perceus.conf 파일은 perceus 시스템을 설정하는 파일이고 defaults.conf 는 노드에 대한 설정을 하는 곳입니다.
perceus.conf 설정
/etc/perceus/perceus.conf 파일을 열어서 다음과 같이 수정합니다.
4 vnfs transfer master = 10.0.0.1
간단합니다. 이제 perceus 를 실행합니다.
처음 실행하면 환경 설정을 초기화 할 것인지를 묻습니다. 당연히 yes 입니다.
# perceus
Do you wish to have Perceus do a complete system initialization (yes/no)? yes
다음은 간단한 정보 입력부분입니다. 특별한 목적은 없고 사용자들이 얼마나 되는지 정보를 수접하는 것같습니다. 입력을 다 하고 다음으로 넘어갑니다.
다음은 각 node 들과 연결되는 것이 어떤 랜카드인지를 선택합니다. eth1 으로 하면 됩니다.
What Ethernet device is connected directly and privately to the nodes?
eth0: 192.168.10.15/255.255.255.0
eth1: 10.0.0.1/255.255.0.0
(eth0)> eth1
node 들이 사용할 IP 주소를 선택하는 부분입니다. Node 들은 10.0.0.101 ~ 10.0.0.200 까지사용하겠습니다.
What IP address should the node boot address range start at?
(10.0.128.0)> 10.0.0.101
What IP address should the node boot address range end at?
(10.0.255.254)> 10.0.0.200
node 가 접속할 perceus daemon 이 있는 컴퓨터 설정입니다. 당연히 지금 사용하는 컴퓨터 이고, 10.0.0.1 로 설정 하시면 됩니다.
What IP address should the nodes (booting from this system) use to connect to
the perceus daemon? (most likely this server)
(10.0.0.1)> 10.0.0.1
각 node 들과 통신할때 hostname 에서 공통되는 부분을 제외 할 것인가 물어보는 것입니다. 제외하는게 편합니다. 그냥 enter 누르면 됩니다.
What domain name should be appended to the DNS records for each entry in DNS.
This won’t require you to specify the domain for DNS lookups, but it prevents
conflicts from other non-local hostnames.
(neosgen.net)>
여기까지 하셨으면, ssh key 를 만들고 등록되면서 초기 설정이 끝나게 됩니다.
– Perceus Node 설정하기
– Sun Grid Engine 설치하기
이번에는 Queueing System 을 설치할 차례입니다. Queueing System 은 사용자가 돌리려는 프로그램을 현재 아무런 일도 하고 있지 않는 Node를 찾아서 자동으로 실행시켜 주는 프로그램을 말합니다. Cluster 에 가장 중요한 프로그램이라고 할 수 있는데요. 다양한 Queueing System 이 존재합니다. OpenPBS, Torque, Sun Grid Engine 중 우리는 Sun Grid Engine 를 설치할 것입니다.
알림 : 앞으로 할 모든 내용은 root 권한에서 이루어 진다는 가정을 하고 있습니다.
SGE 의 구성
SGE 는 전체 시스템을 몇가지 host 로 나눠서 관리하고 있습니다. 기본적으로 알아야 할 몇 가지를 알아보면
Administrator Host : 전체 시스템을 구성하는 여러가지 설정들을 할 수 있는 Host. Cluster 를 구성하는 모든 컴퓨터들은 이 admin host 로 지정하게 된다.
Submit Host : Queueing 시스템에 Job 을 넣는데 사용되는 컴퓨터. 여기서는 Cluster Master 가 이 역할을 하므로 Cluster Master 를 Submit Host 로 지정한다.
Executive Host : Queue 에서 job 을 가져와서 실행하는 컴퓨터. Cluster Node 들이 이 것에 해당한다. Cluster Master 에서도 Job 을 실행하고 싶으면, Cluster master 도 이것으로 등록하면 된다.
SGE 를 실행하는데 사용할 계정 설정
SGE를 root 계정으로 작동시키는 것 보다 별도의 계정으로 동작시키는게 좋습니다. 여기서 SGE가 사용할 계정은 sge 로 정합니다. 그리고 sge 가 사용할 uid 는 20202 로 하겠습니다.
# useradd -u 20202 sge
파일 받기 및 압축 풀기
SGE 공식 홈페이지 에서 왼쪽 메뉴중 Get GE Binaries 에서 안정 버젼인 GE 6.2 Binaries 을 선택합니다. 6.2 버젼은 이전 버젼과는 달리 common 과 platform-specific binary 가 한 파일에 묶여 있습니다. 여기서는 62 Bit 를 기준으로 하므로 ge62_lx24-amd64.tar.gz 파일을 받습니다.
받은 파일의 압축을 풀면 다음의 2가지 파일이 나옵니다.
ge6.2/ge-6.2-bin-lx24-amd64.tar.gz
ge6.2/ge-6.2-common.tar.gz
이 파일은 특별한 과정 필요없이 압축만 풀면 사용할 수 있도록 되어있습니다. 받은 파일을 설치경로로 이동한 뒤에 압축을 풀도록 합니다. 여기서는 “/home/sge” 에 설치하도록 합니다.
# mkdir /home/sge
# cp /root/ge6.2/ge-6.2-bin-lx24-amd64.tar.gz /home/sge
# cp /root/ge6.2/ge-6.2-common.tar.gz /home/sge
# cd /home/sge
# tar xfz ge-6.2-bin-lx24-amd64.tar.gz
# tar xfz ge-6.2-common.tar.gz
/etc/service 수정
SGE 이 작동하기 위해서는 어떤 Port 를 이용해서 Daemon 들 사이에 통신을 할 것인가를 알려주어야 합니다. SGE 는 이 내용을 사용자가 /etc/service 파일에서 지정하게 되어있습니다.다음 내용을 /etc/service 파일에 넣어 줍니다.
sge_qmaster 536/tcp
sge_execd 537/tcp
/etc/hosts 수정
CentOS 를 설치하게 되면 hostname 이 127.0.0.1 과 같이 묶여 있습니다. 이 경우 SGE 설치과정에서 에러가 납니다. 그래서 /etc/hosts 파일을 열어서 이를 수정해 줍니다. hostname 을 127.0.0.1 이 아닌 다른 IP (eth0 의 IP 등)와 맞춰주면 됩니다. 저는 다음과 같이 설정했습니다.
127.0.0.1 localhost.localdomain localhost
10.0.0.1 master master.neosgen.net
SGE_ROOT 지정
환경설정 변수에 SGE_ROOT 를 지정해야 합니다. RedHat 계열의 시스템(RHEL, CentOS)의 경우 다음 내용을 가진 파일을 /etc/profile.d/sge.sh 에 추가합니다.
SGE_ROOT=/home/sge
export SGE_ROOT
환경 설정을 반영하기 위해서 다음 명령을 수행 합니다.
# source /root/.bashrc
SGE Que Master 설정
설치는 “/home/sge/install_qmaster” 를 실행하면 됩니다.
# cd /home/sge
# ./install_qmaster
첫 화면에서 License 가 나오고 이 내용에 동의하면, 다음부터 설정 창으로 넘어가게 됩니다. 설정과정은 특별한 이유가 없다면 기본 값을 따라 가면 됩니다. 입력 중에 Choosing a Grid Engine admin user name 항목 입력이 있습니다. 여기에는 앞에서 설정한 sge 계정을 지정해 줍니다.
Choosing a Grid Engine admin user name
————————————–
Please enter a valid user name >> sge
Installing Grid Engine as admin user >sge<
Hit <RETURN> to continue >>
그리고 중간에 잘못 입력한 것이 있으면 Ctrl+C 를 눌러서 중단시키고 ./install_qmaster 를 다시 실행시키면 됩니다.
Adding admin and submit hosts 항목에서 사용할 node 들의 정보를 추가해도 되고, 이후에 추가 하셔도 됩니다. 여기서는 나중에 하겠습니다. Queue Master 의 기본 설정이 끝난 것입니다.
설정파일 등록
기본 설정이 끝나면 생성된 설정파일이 사용자가 로그인 할때 항상 실행되게 해야 합니다. 여기서는 profile.d 에 sge 설정을 직접 등록하겠습니다.
# cp /home/sge/default/common/settings.sh /etc/profile.d/sge.sh
Queue Master 설정이 끝났습니다.
perceus vnfs image 에 sge 설정 추가 및 /etc/service 수정
이제 각 Node 를 sge의 queue 에 추가해야 합니다. 우선 해야 할 일은 앞서 설정한 파일의 결과로 나온 sgeexecd 파일을 node가 처음 켜질때 자동으로 실행하도록 하는 것입니다.
# perceus vnfs mount centos-5.2.x86_64
# cp /opt/sge/default/common/sgeexecd /mnt/centos-5.2.x86_64/etc/init.d/sgeexecd.p536
# ln -s ../init.d/sgeexecd.p536 /mnt/centos-5.2.x86_64/etc/rc3.d/S50sgeexecd.p536
# ln -s ../init.d/sgeexecd.p536 /mnt/centos-5.2.x86_64/etc/rc5.d/S50sgeexecd.p536
cp /opt/sge/default/common/settings.sh /mnt/centos-5.2.x86_64/etc/profile.d/sge.sh
그리고 Master 에서 했던 것과 똑같이 services 파일을 수정해야 합니다. 위의 내용을 참고해서 /mnt/centos-5.2.x86_64/etc/services 파일을 수정하시기 바랍니다.
이제 vnfs 이미지를 unmount 하고 변경값을 적용시키기 위해서 각 node 를 재부팅합니다.
Administrator host 추가
master 와 각 node 를 사용하기 위해서 queue 에 submit host 나 administrator host 로 등록을 해야 합니다. 방법은 다음과 같습니다.
# qconf -ah n0001
n0001 added to administrative host list
위와 같은 방법으로 모든 node 를 등록해 줍니다.
Submit Host 추가
Queue 에 Job 을 넣기 위해서는 사용하는 컴퓨터가 Submit Host 로 등록되어 있어야 합니다. 다음 명령어로 Master 를 submit host 에 추가합니다.
# qconf -as master
위에서 master 부분은 당연히 master 노드의 이름으로 바꾸셔야 합니다.
Queue 에 Node 추가
node 에서 프로그램을 실행하기 위해서 queue 에 executive host 로 각 node 들을 등록해야 합니다. executive host 를 등록하기 위해서는 다음 명령어를 실행합니다.
# cd /home/sge
# ./install_exec
master 설정 때 처럼 기본값으로 진행하시면 큰 문제 없습니다.
이제 설정이 마무리 되었습니다. SGE 의 자세한 사용법은 인터넷을 찾으시면 많이 나옵니다.^^
Reading your article has greatly helped me, and I agree with you. But I still have some questions. Can you help me? I will pay attention to your answer. thank you.