Grupo Linuxero del Bajío

Contenido

Linux Clusters 3/3 - El clúster Ubuntu - 1ra. parte

Juan Caballero

Lo 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)