Hola a todos!
En este artículo explicaré como configurar un clúster de ordenadores Raspberry. Los no iniciados se preguntarán lo siguiente ¿Que es un clúster? Según la Wikipedia, un cluster es:
El término clúster (del inglés cluster, «grupo» o «raíz») se aplica a los conjuntos o conglomerados de ordenadores unidos entre sí normalmente por una red de alta velocidad y que se comportan como si fuesen una única computadora.
Una Raspberry es un ordenador de precio reducido. Yo en concreto usaré el modelo Raspberry PI 2 modelo B
En este artículo voy hacer un resumen y añadir las pegas que he encontrado en la puesta en marcha de dicho cluster de estos ordenadores tan interesantes para este uso.
En la imagen que sigue, se muestra el cluster que yo he montado.

Consta de cinco unidades, siendo una de ellas el nodo maestro. Esta montado con piezas de «Lego» como chasis (es muy habitual usar estas piezas de juguete para montar los cluster de este ordenador).
Se puede observar a la derecha el concentrador (Hub) con cinco conectores Ethernet. Bueno, manos a la obra. 🙂
Instalamos la última versión de la distribución Raspbian Jessie (la que ocupa mas espacio). Cuando la bajemos, comprobaremos que está bien con el SHA1 que se indica en la página (ver anteriores artículos de este blog). Tostamos tantas tarjetas micro-sd como nodos tenga nuestro cluster (en mi caso cinco). Una vez hecho esto, empezamos con la configuración del mismo.
NODO MAESTRO
Vamos a trabajar con IP estáticas para la red ethernet. La inalámbrica será exclusivamente para conectarnos a Internet desde cualquier nodo, como veremos después.
Editamos el fichero «/etc/network/interfaces» del nodo número cero (10.0.2.200), donde iría lo siguiente:
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
address 10.0.2.200
netmask 255.255.255.0
network 10.0.2.0
###
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid NOMBREDEMIREDWIFI
wpa-psk MicLavEwifiqueEsunEjemPLO
Ojo! Las dos últimas líneas dependen de vuestra WIFI. Tenéis que tener en cuenta que yo uso un router de Apple, así que vuestras direcciones IP podrían ser de la forma siguiente (en el nodo cero):
address 192.168.2.200
netmask 255.255.255.0
network 192.168.2.0
Con respecto al resto de nodos, por ejemplo en el nodo esclavo uno (10.0.2.201); el contenido de dicho archivo sería el siguiente (para que funcione con mi router Apple):
auto eth0
iface eth0 inet static
address 10.0.2.201
netmask 255.255.255.0
network 10.0.2.0
broadcast 10.0.2.255
gateway 10.0.2.200
dns-nameservers 8.8.8.8 8.8.4.4
Se puede apreciar que el tercer campo (desde la izquierda) es un 2 (Ejemplo: 10.0.2.201). Tiene que ser así ya que el cluster usa una serie de IPs internas (la externa inalámbrica seria de este estilo: 10.0.1.7).
Para permitir el trafico a internet desde los esclavos, tendremos que realizar una serie de cambios.
Vamos a editar el fichero:
sudo nano /etc/sysctl.conf
Descomentamos la linea (borramos el primer carácter de esta, que es una almohadilla, # para que deje de ser un comentario)
net.ipv4.ip_forward=1
A continuación hay que hacer una excepción en el cortafuegos. Editamos el fichero:
sudo nano /etc/rc.local
Añadimos la siguiente linea (es una excepción del cortafuegos):
sudo /sbin/iptables --table nat -A POSTROUTING -o wlan0 -j MASQUERADE
A continuación otro fichero mas que hay que editar:
sudo nano /etc/hosts
El contenido de este archivo sería el siguiente:
10.0.2.201 rpi1
10.0.2.202 rpi2
10.0.2.203 rpi3
10.0.2.204 rpi4
Tenemos cuatro RBP esclavas mas una maestra (en total cinco). En este fichero NO se incluye el nodo maestro (10.0.2.200).
Volviendo al tema en el que estábamos, reiniciamos la máquina.
sudo reboot
NODOS ESCLAVOS
Editamos el fichero siguiente:
sudo nano /etc/hostname
Cambiamos el nombre por el que le corresponde a ese nodo (rpi1 por ejemplo):
Editamos el fichero siguiente:
sudo nano /etc/hosts
Lo mismo, el nombre que le corresponde (rpi1 también por ejemplo).
Editamos también el fichero que sigue:
sudo nano /etc/network/interfaces
Y aquí tenéis que incluir lo que yo después de muchas pruebas logré que funcionara:
auto eth0
iface eth0 inet static
address 10.0.2.201
netmask 255.255.255.0
network 10.0.2.0
broadcast 10.0.2.255
gateway 10.0.2.200
dns-nameservers 8.8.8.8 8.8.4.4
En las dos últimas lineas tuve algún problema. En gateway debe de ir la ruta del nodo maestro (no la de nuestro router). La última linea hace referencia a dos servidores DNS de Google. Podríais poner los de vuestro proveedor si así lo queréis.
Y ya por último creamos un directorio oculto en el raiz:
mkdir ~/.ssh
Hacemos lo mismo con el resto de nodos y los reiniciamos. No nos olvidemos de modificar también en el nodo maestro los archivos /etc/hosts y /etc/hostname y poner el nombre correspondiente: rpi0
HACIENDO PRUEBAS DE RED
Si hacemos un ping desde el nodo maestro a cualquiera de los nodos esclavos, estos tendrían que responder:

En la ventana de arriba el ping funciona. De momento todo bien.
Vamos a probar a hacer una conexión SSH. Hacemos desde el nodo 0 (rpi0) lo siguiente:

Ya solo no queda hacer que todos los nodos se puedan conectar por SSH pero sin que nos soliciten la contraseña.
CONFIGURAR EL ACCESO MEDIANTE SSH DESDE EL NODO MAESTRO A EL RESTO DE NODOS
Ejecutamos en el nodo maestro el comando siguiente:
ssh-keygen
Pulsamos intro las veces necesarias hasta que se generen la clave publica y privada, que se alojarán en el directorio oculto .ssh.
A continuación copiamos la llave pública en el resto de nodos. Le cambiamos el nombre al copiarla y lo copiamos al directorio antes mencionado. Usaremos el comando SCP (secure copy) para copiar la llave en cuestión.
Primero nos cambiamos de directorio:
cd
cd .ssh
Y copiamos la llave pública a los nodos esclavos:
scp -p id_rsa.pub rpi1:/home/pi/.ssh/authorized_keys
scp -p id_rsa.pub rpi2:/home/pi/.ssh/authorized_keys
scp -p id_rsa.pub rpi3:/home/pi/.ssh/authorized_keys
scp -p id_rsa.pub rpi4:/home/pi/.ssh/authorized_keys
El autor del artículo original (en el que me he basado para este mini-tutorial) menciona que podría haber un problema con los permisos. Yo no lo he tenido, así que no lo voy a mencionar.
Ahora voy a explicar como ejecutar comandos en los nodos esclavos, mediante un script en bash. Voy en el siguiente comando a apagar el primer nodo esclavo:
ssh pi@rpi1 sudo shutdown -h now
No soy un experto en la programación en bash. En el manual del autor se indica la forma de hacerlo mediante un script en dicho lenguaje de macros. Aquí os pongo uno facilito, sin bucles ni parámetros:
#!/bin/sh
ssh pi@rpi1 sudo shutdown -h now
ssh pi@rpi2 sudo shutdown -h now
ssh pi@rpi3 sudo shutdown -h now
ssh pi@rpi4 sudo shutdown -h now
sudo shutdown -h now
Lo que hace este script es apagarlo todo. Lo guardáis en un archivo y le dais permiso de ejecución.
Por ejemplo: apagatodo.sh
Le dais permisos de ejecución así:
sudo chmod +x apagatodo.sh
En el resto del tutorial (COMPUTACIÓN PARALELO) del autor no lo he utilizado. Me he pasado a otro diferente: uso de Python en un cluster de ordenadores Raspberry que explica como hacer la computación multiprocesador mediante el lenguaje Python.
He conseguido instalar desde las fuentes y después compilar mpi4py (mpi para Python), y lograr que funcionara.
Fijaos en la imagen siguiente (estoy desde mi ordenador haciendo una conexión SSH con el nodo maestro, y después ejecuto un programa en Python que se ejecuta en todos los nodos):

Y esto es todo por ahora. Hasta el próximo artículo.
REFERENCIAS BIBLIOGRÁFICAS:
- Lenguaje Python – Wikipedia
- Installing MPI for Python on a Raspberry Pi Cluster – The New Stack
- Raspberry PI, 200 ejercicios – Simon Monk. Anaya Multimedia