Linux Clusters 3/3 - El clúster Ubuntu - 1ra. parte
Juan CaballeroLo prometido es deuda y le traigo la tercera entrega de mi serie de artículos sobre clustering en Linux, es específico un clúster que acabo de armar ahora usando Ubuntu como sistema base. Por la extensión de este tema lo voy a tener que partir en 2, primero les traigo la instalación y configuración del nodo maestro y en la segunda parte veremos la de los nodos esclavos.
En el pasado artículo comenté que este iba a tratar sobre el uso general de la cola de trabajo y un poco de programación en MPI con “hola mundo” pero en paralelo, pero se me hace más interesante narrar esta experiencia dado que lo otro fácilmente lo pueden hacer leyendo los manuales y guías.
Muchas gracias a las personas interesadas en esta serie de artículos por su comentarios.
English version here: http://linxe-eye.blogspot.com/2008/04/ubuntu-cluster-master-node.html
Antecedentes
En esta ocasión mi Instituto (Cinvestav - <www.ira.cinvestav.mx>) me pidió una solución fija y similar a la anterior montada con ROCKS, esta serviria como un pequeño clúster general y como laboratorio de enseñanza para bioinformática. Este clúster fue bautizado como Beagle, el Instituto puso los equipos y con ayuda de mi buen amigo LuisD pusimos la mano de obra. El diseño incluye un nodo maestro que sirve de acceso, monitoreo y envió de trabajos, y 10 nodos esclavos que hará la parte de cómputo mediante exportación de /home por NFS, una cola de trabajos con SGE (Sun Grid Engine), Ganglia como monitor de los sistemas y soporte para MPI.
El sistema base de inicio fue el mismo ROCKS, pero lamentablemente tuvimos problemas de compatibilidad y no nos fue posible usarlo, y aunque no me gusta mucho Ubuntu, pues ese fue la elección ya que era totalmente compatible y disponíamos de algunos tutoriales y guías para clústers con Debian.
Hardware*
Nodo Maestro: AMD Athlon 64 X2 4200+, 2 Gb RAM, 1 dd IDE 80 Gb (hda), 1 dd SATA 320 Gb (sda), 1 dd externo USB 1 Tb (sdb), tarjeta de red nForce 10/100/1000 (eth1), tarjeta de red PCI Realtek 10/100 (eth2).
Nodos Esclavos X10: AMD Athlon 64 X2 4200+, 2 Gb RAM, 1 dd IDE 80 Gb, tarjeta de red nForce 10/100/1000 (eth0).
Switch: 24 puertos 10/100/1000.
Muchos metros de cable de red.
Instalación del Nodo Maestro
Tenemos una arquitectura amd64, por lo que usamos Ubuntu Desktop para amd64, descargamos la ISO, la quemamos e instalamos con las siguientes particularidades:
Sistema de archivos: ext3.
Particiones (partición:tamaño:punto_montaje):
hda1 : 180 Mb : /boot
hda2 : 2.0 Gb : swap
hda4 : 24 Gb : /
hda5 : 4.6 Gb : /tftpboot
hda6 : 22 Gb : /var
hda7 : 22 Gb : /usr
sda1 : 2.0 Gb : swap
sda2 : 292 Gb : /home
Cuenta general: beagle.
La red es configurada así: eth1 197.1.1.1 (comunicación con los nodos), eth2 10.0.0.114 (comunicación hacia el exterior a través de nuestra intranet).
Terminamos la instalación, reiniciamos, accesamos y con una terminal nos pasamos a ser root y dar una contraseña:
sudo su -passwd
DHCP
Un servidor DHCP se monto para comunicar con los nodos:
apt-get install dhcp3-server
Editamos /etc/dhcp3/dhcpd.conf para dar de alta la red 197.1.1.0/24 y agregar las MACs de cada nodo, incluyendo el nombre de host y el cargador de arranque por red (PXE). Nuestro archivo quedo:
# dhcp.conf # Network for the Beagle Cluster # Juan Caballero @ Cinvestav 2008
ddns-update-style none; subnet 197.0.0.0 netmask 255.0.0.0 { default-lease-time 1200; max-lease-time 1200; option routers 197.1.1.1; option subnet-mask 255.0.0.0; option domain-name “local”; option domain-name-servers 197.1.1.1; option nis-domain “beagle”; option broadcast-address 197.255.255.255; deny unknown-clients; allow booting; allow bootp;
if (substring (option vendor-class-identifier, 0, 20)
= "PXEClient:Arch:00002") {
# ia64
filename "elilo.efi";
next-server 197.1.1.1;
} elsif ((substring (option vendor-class-identifier, 0, 9)
= "PXEClient") or
(substring (option vendor-class-identifier, 0, 9)
= "Etherboot")) {
# i386 and x86_64
filename "pxelinux.0";
next-server 197.1.1.1;
} else {
filename "/install/sbin/kickstart.cgi";
next-server 197.1.1.1;
}
host beagle.local {
hardware ethernet 00:e0:7d:b4:e1:13;
option host-name "beagle.local";
fixed-address 197.1.1.1;
}
host node00.local {
hardware ethernet 00:1b:b9:e2:0d:18;
option host-name "node00.local";
fixed-address 197.1.1.100;
}
host node01.local {
hardware ethernet 00:1b:b9:e1:cf:6a;
option host-name "node01.local";
fixed-address 197.1.1.101;
}
host node02.local {
hardware ethernet 00:1b:b9:e1:be:6e;
option host-name "node02.local";
fixed-address 197.1.1.102;
}
host node03.local {
hardware ethernet 00:1b:b9:cf:f3:55;
option host-name "node03.local";
fixed-address 197.1.1.103;
}
host node04.local {
hardware ethernet 00:1b:b9:e2:14:06;
option host-name "node04.local";
fixed-address 197.1.1.104;
}
host node05.local {
hardware ethernet 00:1b:b9:ce:85:9a;
option host-name "node05.local";
fixed-address 197.1.1.105;
}
host node06.local {
hardware ethernet 00:1b:b9:e2:0c:5f;
option host-name "node06.local";
fixed-address 197.1.1.106;
}
host node07.local {
hardware ethernet 00:1b:b9:cf:f7:29;
option host-name "node07.local";
fixed-address 197.1.1.107;
}
host node08.local {
hardware ethernet 00:1b:b9:cf:f3:25;
option host-name "node08.local";
fixed-address 197.1.1.108;
}
host node09.local {
hardware ethernet 00:1b:b9:e2:14:9f;
option host-name "node09.local";
fixed-address 197.1.1.109;
}
}
En el archivo /etc/defaults/dhcp3-server especificamos la tarjeta por la cual se activa DHCP
Interfaces="eth1"
Y reiniciamos el servicio:
/etc/init.d/dhcp3-server restart
Más ajustes de red
Editamos /etc/hosts para incluir todos los nodos, así:
127.0.0.1 localhost
197.1.1.1 beagle.local beagle
197.1.1.100 node00.local node00
197.1.1.101 node01.local node01
197.1.1.102 node02.local node02
197.1.1.103 node03.local node03
197.1.1.104 node04.local node04
197.1.1.105 node05.local node05
197.1.1.106 node06.local node06
197.1.1.107 node07.local node07
197.1.1.108 node08.local node08
197.1.1.109 node09.local node09
También se creo un archivo de texto en /etc/machines con los nombres de todos los esclavos para usarse posteriormente en scripts:
node00
node01
node02
node03
node04
node05
node06
node07
node08
node09
NFS
Instalamos los paquetes:
apt-get nfs-common nfs-kernel-server
Editamos /etc/exports para exportar /home y /tftpboot:
/home 197.1.1.0/24(rw,no_root_squash,sync,no_subtree_check)
/tftpboot 197.1.1.0/24(rw,no_root_squash,sync,no_subtree_check)
E iniciamos el servicio:
exportfs -av
Arranque con PXE
Instalamos tftpd-hpa:
apt-get install tfptd-hpa
Editamos /etc/defaults/tfptd-hpa:
#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS="-l -s /tftpboot"
Descargamos el netboot para Ubuntu amd64:
cd /tftpbootwget
http://tezcatl.fciencias.unam.mx/ubuntu/dists/gutsy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar zxvf netboot.tar.gz
Reiniciamos el servicio:
/etc/init.d/tftpd-hpa restart
SGE
Para SGE agregamos un usuario sgeadmin, descargamos los archivos y corremos el script de instalación, muchas opciones se toman por defecto:
adduser sgemaster
wget http://gridengine.sunsource.net/download/SGE61/ge-6.1u3-common.tar.gz
wget http://gridengine.sunsource.net/download/SGE61/ge-6.1u3-bin-lx24-amd64.tar.gz
tar zxvf ge-6.1u3-common.tar.gz
tar zxvf ge-6.1u3-bin-lx24-amd64.tar.gz
./install-qmaster
Servidor Web
Instalamos Apache:
apt-get install apache2
Ganglia monitor
Primero instalamos las dependencias, descargamos las fuentes y compilamos para tener la versión web:
apt-get install rrdtool librrds-perl librrd2-dev php5-gd
wget http://downloads.sourceforge.net/ganglia/ganglia-3.0.7.tar.gz?modtime=1204128965&big_mirror=0
tar zxvf ganglia*
cd ganglia*
./configure --with-gmetadmake
mkdir /var/www/ganglia
cp web/* /var/www/ganglia
Editamos la configuración de Apache para acceso a ganglia en /etc/apache2/sites-enabled/000-default
Ahora instalamos lo paquetes ya compilados (cuidado con las versiones que se instaló desde fuente y estas):
apt-get install ganglia-monitor gmetad
Se puede editar los archivos /etc/gmond.conf y /etc/gmetad.conf para personalizar la configuración.
Otros programas
Usamos apt-get o paquetes compilados, en nuestro caso por ejemplo agregamos un servidor SSH, los compiladores básicos y soporte para MPI:
apt-get install openssh-server gcc g++ g77 mpich-bin openmpi-bin lam-runtime
En la siguiente parte instalaremos y configuraremos los nodos esclavos.
Enlaces:
Ubuntu http://www.ubuntu.com/
Debian Clusters http://debianclusters.cs.uni.edu/index.php/Main_Page
SGE http://gridengine.sunsource.net/
Ganglia http://ganglia.info/
NFS http://nfs.sourceforge.net/
TFTP-HPA http://freshmeat.net/projects/tftp-hpa/
DHCP http://www.dhcp.org/
MPICH http://www-unix.mcs.anl.gov/mpi/mpich1/
OpenMPI http://www.open-mpi.org/
LAM/MPI http://www.lam-mpi.org/
Autor: Juan Caballero (linxe (arroba) glib . org . mx)