Como instalar un Clúster de Raspberry Pi con Apache

Tras montar con éxito mi propio servidor web, accesible desde alteageek.homelinux.org , sirviéndome de una Raspberry 3, Raspbian, Mysql, Apache, Php y WordPress , y a la vista del número de visitas que esta recibiendo, hace unos días decidí ponerme como reto mejorar el servidor web, dotándolo de mayor potencia, de manera que pudiera atender un mayor número de peticiones simultáneas, y de un sistema que le aportara redundancia ante fallos.

La solución debía seguir estando basada íntegramente en la utilización de Raspberrys Pi, del sistema operativo Raspbian, de software libre, y ser fácilmente escalable, de manera que fuera fácilmente ampliable en cualquier momento.

Después de valorar distintas opciones decidí montar un sistema consistente en 3 Raspberry Pi, en la que una hiciera la función de balanceador/repartidor de carga, y las otras dos actuaran como servidores web en cluster.

Para ello hice uso de los siguientes componentes:

  • 1 Raspberry 3 funcionando como balanceador/repartidor de carga/peticiones.
  • 2 Rasberry 3  con copias idénticas de mi servidor web, pero con distintas direcciones IP.
  • Un hub Usb D-Link DUB-H4 con el que alimentar las 3 Raspberry.
  • 3 Cables 0.15m Micro USB a USB como de cables de alimentación.
  • Tarjetas SD Sandisk Extreme de 16 GBs.

El coste aproximado de todos los componentes unos 170 euros.

img_0946s

Pasos a seguir:

Configuración del balanceador de tráfico/carga:

El paso más importante en este proyecto es configurar el equipo que gestionará el reparto de la carga/visitas, algo que permitirá distribuir las visitas entre los equipos sobre los que actúe (en este ejemplo 2), además de aportar redundancia a fallos, ya que si uno de los servidores cae directamente redireccionará el tráfico al equipo restante.

Las Raspberry Pi tienen tan solo 1GB de memoria por lo que es importante hacer buen uso de ella. Dado que nuestra configuración no hará uso de entorno gráfico de ningún tipo, reduciremos la cantidad de memoria disponible por la tarjeta gráfica al mínimo (16mb), lo que permitirá a nuestro sistema contar con mayor memoria disponible. Para ello:

sudo raspi-config

en el menú que se abrirá iremos a la opción Advanced Options -> Split Memory

En esa opción reduciremos la memoria dedicada a la tarjeta gráfica al mínimo (16mb)

Al salir daremos el OK a guardar los cambios y reiniciar el sistema.

Al reiniciarse el sistema actualizaremos el software con:

sudo apt-get update
sudo apt-get upgrade

Asignaremos como IP por ejemplo 192.168.2.30 (explico como hacerlo en otro post).

E instalaremos Apache, que es el software que en este caso nos servirá para repartir el tráfico web entre nuestros dos servidores web:

sudo apt-get install apache2

Activando posteriormente los módulos que necesitamos:

sudo a2enmod lbmethod_byrequests slotmem_shm
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer

Para la configuración de este equipo como gestor del tráfico web necesitaremos editar el fichero de configuración:

sudo nano /etc/apache2/sites-available/000-default.conf

Cuyo contenido ha de ser el siguiente para un ejemplo de red en la que tanto el repartidor como los servidores web forman parte de la red 192.168.2.0 , y para un sistema en el que los servidores web tienen las direcciones 192.68.2.22 y 192.168.2.23:


# The ServerName directive sets the request scheme, hostname and port that
 # the server uses to identify itself. This is used when creating
 # redirection URLs. In the context of virtual hosts, the ServerName
 # specifies what hostname must appear in the request's Host: header to
 # match this virtual host. For the default virtual host (this file) this
 # value is not decisive as it is used as a last resort host regardless.
 # However, you must set it for any further virtual host explicitly.
 #ServerName www.example.com

 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html

 # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
 # error, crit, alert, emerg.
 # It is also possible to configure the loglevel for particular
 # modules, e.g.
 #LogLevel info ssl:warn

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

 # For most configuration files from conf-available/, which are
 # enabled or disabled at a global level, it is possible to
 # include a line for only one particular virtual host. For example the
 # following line enables the CGI configuration for this host only
 # after it has been globally disabled with "a2disconf".
 #Include conf-available/serve-cgi-bin.conf

ProxyRequests Off

<Proxy balancer://rpicluster>
        
    BalancerMember http://192.168.2.22:80
    BalancerMember http://192.168.2.23:80

    AllowOverride None
    Order allow,deny
    allow from all
    ProxySet lbmethod=byrequests

 </Proxy>


<Location /balancer-manager> 

   SetHandler balancer-manager
   Order allow,deny
   allow from 192.168.2
                
</Location>                
        
ProxyPass /balancer-manager !
ProxyPass / balancer://rpicluster/

 ErrorLog ${APACHE_LOG_DIR}/error.log
        

        # Possible values include: debug, info, notice, warn, error, crit,

        # alert, emerg.

        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

 


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Una vez terminada la configuración, saldremos guardando los cambios pulsando Ctrl + X, y confirmando con Y.

Configuración de los servidores web:

No voy a explicar como instalar los servidores web porque ya lo hago en otro post.

Continuando con la configuración del cluster, y dando por hecho que los servidores web son copias idénticas con la única salvedad de sus direcciones IP, que siguiendo nuestro ejemplo serán 192.168.2.22 y 192.168.2.23, aumentaremos la memoria disponible en ambas de la misma manera que hemos hecho antes con la otra Raspberry:

sudo raspi-config

en el menú que se abrirá iremos a la opción Advanced Options -> Split Memory

En esa opción reduciremos la memoria dedicada a la tarjeta gráfica al mínimo (16mb)

Al salir daremos el OK a guardar los cambios y reiniciar el sistema.

Monitorización del gestor de carga:

Hay una herramienta web integrada en el propio servidor Apache que nos permite ver el estado del gestor de carga. Podemos acceder a ella tecleando en nuestro navegador la dirección del equipo que hace las funciones de gestor de carga seguida de /balancer-manager:

captura-de-pantalla-2016-11-30-a-las-20-36-58

En este panel de control, se nos muestra la disponibilidad de los dos servidores e incluso el tráfico que han tenido. Si hacemos click sobre la dirección de uno de los servidores podremos cambiar su configuración asignándole por ejemplo más tráfico, aunque conviene tener en cuenta que los cambios se perderán en el momento en que se reinicie el equipo.

Para que el cambio sea permanente y que por ejemplo al servidor 192.168.2.23 se le asigne el doble de visitas(carga), bastará con entrar en el servidor de carga,  editar el fichero de configuración con:

sudo nano /etc/apache2/sites-available/000-default.conf

y en la línea

 BalancerMember http://192.168.2.23:80

añadir

loadfactor=2

quedando de la siguiente manera:

BalancerMember http://192.168.2.23:80 loadfactor=2

Una vez terminada la configuración, saldremos guardando los cambios pulsando Ctrl + X, y confirmando con Y

Reiniciando a continuación el sistema para asegurarnos que los cambios surten efecto con:

reboot

Intentaré pulir este tutorial durante los próximos días, si mientras tanto necesitáis ayuda no dudéis en contactarme.

Salu2

Santi

Esta entrada fue publicada en Herramientas de Administración, Raspberry Pi y etiquetada , , , , , , , , , , . Guarda el enlace permanente.

7 Respuestas a Como instalar un Clúster de Raspberry Pi con Apache

  1. Cortés dijo:

    Buenos días,
    He seguido tu tutorial paso por paso y al configurador la PI que se usa como balanceador el servicio apache2 no se inicia. El error que indica es:
    «BalancerMember must define remote proxy server»
    Es como si en la linea donde se indican las ip’s del resto de PI’s faltara alguna indicación del proxy.
    Si te sirve de ayuda para aclarar el error, uso un router en vez de un switch pero las IP’s de la PI’s son fijas, todas están en la misma red local y se ven unas a otras a través del gateway.
    Un saludo.

    • elalbir28 dijo:

      Tienes toda la razón, gracias por el comentario y disculpa, sin él hubiera tardado en darme cuenta del error.

      Acabo de ver que en la configuración del balanceador Apache faltaban las líneas que delimitan la configuración del proxy, así como las que delimitan la sección Location, y lo he corregido.

      Salu2

      Santi

  2. Cortés dijo:

    Buenas de nuevo, buscando por algún que otro foro encontré la estructura que necesita el fichero de configuración. Eran necesarias las 4 frases entre símbolos para definir el proxy balancer y la localización.
    Ya tengo mi cluster corriendo y haciendo pruebas de estrés y rendimiento. Tiene buena pinta pero va a ser necesario eliminar mucha carga de programas superfluos.
    Gracias por el tuto.

    • elalbir28 dijo:

      Te recomiendo empezar aumentando la memoria disponible reduciendo la memoria de video a 16mb. Puedes hacerlo desde raspi-config.

      Otra cosa que vas a necesitar para mantener tu web a salvo de ataques de fuerza bruta es instalar el Fail2ban, una maravilla, e impresionante al ayudar a darte cuenta de la cantidad de intentos ilegales de acceso que llegan a producirse a lo largo de un día.

      Explico como instalar y configurar el Faul2ban en otro post de este mismo blog.

      Y ya para acabar, si quieres aumentar prestaciones invierte en una Sd de calidad, las mejores (el cambio es tremendo) las Sandisk Extreme (las de color dorado).

      Salu2

      Santi

  3. Ricardo dijo:

    Buenas tardes y felicidades tanto por el proyecto, las guías y la web.

    Buscando como montar un cluster he llegado a tu web. Aunque tengo todo lo necesario ( más o menos ) me gustaría preguntarte una cosa.

    El cluster lo montare con 4 raspberry pi zero e que tienen wifi
    Las 4 iran conectadas a un router, hará de switch, ya que tendrán las IPs estáticas las 4.
    Montare un servidor web con 2 o 3 dominios diferentes, y aquí viene la pregunta.

    Yo publicare un artículo en el dominio1.com
    Otro artículo en el dominio2.com

    Estos cambios se hacen por ejemplo en la raspberry01. Como haces para replicar ambos artículos en los otros servidores web de las raspberry02 y raspberry03?

    Un saludo y gracias por estos artículos que has hecho. Me serán muyutiles

    • elalbir28 dijo:

      Hola, muchas gracias, cualquier comentario o sugerencia serán siempre bienvenidos.

      En mi caso utilizo WordPress el cual como sabes funciona con Mysql. Después de probar varios tipos de configuración finalmente opté por la que demostró ser la más rápida y fiable:

      1 balanceador de carga apache que reparte el tráfico entre los servidores web (WordPress)
      3 Servidores web WordPress sobre Apache
      1 servidor Mysql que sirve a los 3 servidores web WordPress

      Los datos coinciden en todos los servidores al leer todos de un mismo servidor Mysql, las fotos y otro contenido multimedia se encuentra en cada servidor web, para mantenerlos replicados uso rsync (programando la sincronización desde cron).

      Lo mejor de todo es su estabilidad y rapidez, así como su resistencia a ataques de fuerza bruta (al repartirse la carga), aunque también hay que agradecerle el mérito al buen funcionamiento de Fail2ban. También me encanta su escalabilidad, pudiendo añadir más servidores en cuestión de minutos.

      Ya me contaras que tal te ha ido.

      Salu2

      Santi

  4. Ricardo dijo:

    Buongiorno.

    En primer lugar siento responder tan tarde. Muchas gracias por la respuesta que me diste, ya que me sirvio de mucha ayuda.

    Decirte, que ya configure todo con ayuda de tus manuales, o al menos una parte de lo que quiero realizar, lo basico ( balanceador + apache + php + mysql + wordpress ) funciona.

    Ahora estoy liado con la segunda parte del asunto que es para lo que queria las raspberry y el cluster.
    Tener 3 subdominios, con 3 webs distintas. Y aqui es donde aun ando con problemas, ya que aun no he dado con la configuracion adecuada. Si cargo una configuracion y accedo a los 2 dominios me muestra las web del subdominio1. Y si por el contrario cargo otra configuracion y accedo a los dos dominion me carga la web del subdominio2.

    Asi que aqui ando liado aun.

    Saludos.

Deja un comentario