Como instalar un Cluster de servidores Apache con Raspberry Pi

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.

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