Bienvenido(a) a Grupo Linuxero del Bajío martes, julio 23 2019 @ 10:07 CEST

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

  • Autor:
  • Lecturas 7,710
Artículos

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 /tftpboot
    wget 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-gmetad
    make
    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)