Netweb

Networks configurations

My GitHub

Equilibrio de carga de red es una técnica usada entre servidores que consiste básicamente en compartir cargas de trabajo de procesos que tengan entre varios equipos que estén configurados, lo podemos ver también como un equipo que “controla el tráfico” ya que si un equipo recibe las peticiones, y este ve uno disponible o no tan cargado, lo envía ahí a ese equipo. Incluso también se puede llegar a compartir discos u otros recursos físicos. Con esto logramos que los ordenadores/servidores tengan mejores tiempos de respuesta respecto a las peticiones de los clientes y también que optimiza la infraestructura dando mejor rendimiento y capacidad.

Para hacer un balanceo de carga debemos tener en cuenta 2 puntos importantes:

  1. Los servidores que usemos deben estar en la misma red y tener comunicación
  2. Saber que forma de balanceo se usará, debemos informarnos y saber cual es el más conveniente de acuerdo a nuestras necesidades

Tipos de balanceo de carga

Tenemos 2 tipos de balanceo de carga, quen son Basado en capas y Basado en configuraciones:

Basado en capas

  • Balanceo de carga de red: este toma en cuenta parámetros de red como la IP y puertos de servicio de destino, esta forma de balanceo es por TCP y no toma en cuenta ningún parámetro de a nivel de aplicación, únicamente se ‘preocupa’ por los datos de la capa de red y está es su base, en otras palabras solo actúa en la capa 4 del modelo OSI.

  • Balanceo de carga de aplicaciones: este se encarga de distribuir las solicitudes tomando en cuenta varios parámetros a nivel de la capa 7 del modelo OSI aplicación, entre los datos que evalúa están incluidos los encabezados HTTP (HTTP Headers) y sesiones SSL, con este tipo de balanceadores controlan el tráfico del servidor en función del uso.

Basado en configuraciones

  • Balanceo de carga en Hardware: como indica su nombre y se encarga de distribuir el tráfico en varios servidores y son capaces de manejar grandes cantidades de tráfico pero esto incluye precios bastante altos.

  • Balanceo de carga en Software: son aplicaciones o programas instalados en los equipos que hacen prácticamente lo mismo a los de hardware, pero el precio de estos es menor.

  • Balanceo de carga Virtual: este es una combinación de hardware y software con el punto de que este trabaja sobre una máquina virtual y necesitamos tener en cuenta algunos aspectos que la escalabilidad puede ser limitada.

Cálculos de balanceo de carga

Existen varios métodos para hacer un balanceo de carga, se presentan los estándar de la industria:

  1. Round Robin: basado en un sistema de rotación que va ordenando el tráfico conforme va llegando y va distribuyendo las peticiones conforme a la disponibilidad de los equipos y cuando ese equipo atiende la petición se coloca por decirlo así al final de la fila para que nuevamente atienda las peticiones.

  2. Round Robin poderado: este cálculo balancea cargas de tráfico dependiendo de las características de los servidores.

  3. Menor conexiones: como lo indica su nombre con este cálculo las cargas de tráfico se dirigen al servidor con menos tráfico.

  4. Menor tiempo de respuesta: este al igual que con menor conexión toma en cuenta al servidor con menor tráfico y también toma en cuenta el tiempo de respuesta menor para tomarlo como prioridad.

  5. IP Hash: esta técnica es de la más usadas ya que asigna la IP del equipo que hace la petición a un servidor fijo para que el cliente tenga un rendimiento óptimo.

  6. Hash de IP de origen: con este forma la dirección IP del cliente y servidor se mezclan para generar una clave de hash única que luego la asigna a un servidor en particular.

  7. URL Hash: este se encarga de distribuir de manera uniforme en varios sitios y dirige el resultado al sitio web en particular.

Si implementamos Load Balancer en AWS debemos tener en cuenta algunos aspectos:

  • Para servicios como LB de red y aplicaciones no se puede tener más de 5 grupos de destino a un servicio, es decir no podemos tener más de 5 instancias a un solo servicio

  • La configuración de la red debe ser igual para cada instancia

  • Si implementamos servicios para varios puertos como 80 HTTP y 443 HTTPS podemos configurar agentes de escucha que reenvía solicitudes al agente adecuado

Configuración con AWS

Primero trabajaremos un load balancer con AWS con el servicio de EC2 (Equilibrio de carga), en este caso usaremos 3 instancias de Linux, las 3 están en la misma red y creamos los grupos de seguridad con las reglas de HTTP:80, SSH:22 para que tengamos conexión remota con nuestra instancia y poder administrarla de mejor forma, en caso que necesitemos más servicios como Base de datos, DNS, FTP, etc. Deberemos activar más puertos.

Creamos las 3 instancias Linux:

b1

Ahora en el panel izquierdo buscamos la sección de Equilibrio de carga (Load Balancing) y seleccionamos Balanceadores de carga (Load Balancers):

b2

Buscamos la opción de Classic Load Balancer, AWS maneja 3 tipos de balanceo de carga actualmente que son:

  • Application Load Balancer: actúa en capa 7, admite el enrutamiento basado en rutas y puede enrutar solicitudes a uno o más puertos en cada instancia de contenedor en su clúster también permite la asignación dinámica de puertos al host.

  • Network Load Balancer: actúa en capa 4, es capaz de manejar millones de solicitudes por segundo, media vez el balanceador de carga recibe una conexión, selecciona un grupo de destino para la regla predeterminada mediante un algoritmo de enrutamiento hash de flujo. Intenta abrir una conexión TCP con el destino seleccionado en el puerto especificado en la configuración de escucha.

  • Classic Load Balancer: es una “combinación” entre los dos anteriores.

b3

Como primer paso en nuetra configuración debemos poner un nombre a nuestro LB (este nombre aparecerá con la URL que nos dará AWS del sitio web), luego debemos poner el mismo grupo de red que usan las instancias recién creadas se deja por defecto, el puerto que usaremos es 80:HTTP, si tenemos un certificado público ponemos 443:HTTPS, en caso de haber seleccionado otro tipo de Load Balancer de AWS como Application Load Balancer aquí debemos poner el puerto en el que trabaja nuestra aplicación

b4

Ahora asignamos los grupos de seguridad para nuestro balanceador de cargas, en este caso al crear las 3 instancias cree un grupo de seguridad el cual incluía las reglas necesarias, pero si no tenemos un grupo de seguridad podemos crearlos en la opción que dice “Crear un *nuevo grupo de seguridad” al cual le tendremos que poner un nombre y poner las reglas de tráfico de puertos que por lo regular son las mismas que están dentro del LB

b5

La Fase 3 la pasamos (Siguiente o Next)

Configuramos las comprobaciones de estado o respuesta para que el Load Balancer haga a los servidores, si un servidor no responde en el tiempo dado, se da de baja del balanceo de cargas y si hay una alerta sobre esto se notificará a los administradores, elejimos el protocolo que estemos usando HTTP o HTTPS, la ruta del ping se deja a la raíz / para que consulte todo

b6

En la fase 5 agregamos las instancias que creamos para este ejercicio, las instancias deben estar activas y en la misma subred como se mencionó antes.

b7

Luego de dar clic en “Revisar y Lanzar”, tendremos que esperar unos minutos para que el balanceo de cargas junto con las instancias estén listos, mientras el Load Balancer converge vamos a instalar un servicio web en los servidores, puede ser apache o nginx, y vamos a modificar el index o bien creamos uno nuevo para ver funcionar el balanceo de cargas y poder distinguir cada servidor, la parte enmarcada en rojo es la URL con la que podemos acceder para el sitio web y funcionando el balance de cargas.

sudo apt update -y
sudo apt install nginx -y ó sudo apt install apache2 -y

Este es nuestro index para cada instancia:

<!DOCTYPE html>
<html>
    <head>
        <title>Servidor A</title>
    </head>
    <body>
        <marquee><h1>Load Balancer, servidor A</h1></marquee>
    </body>
</html>
<!DOCTYPE html>
<hmtl>
    <head>
        <title>Servidor 1</title>
    </head>
    <body>
        <marquee><h1>Load Balancer, servidor 1</h1></marquee>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <title>Servidor 2</title>
    </head>
    <body>
        <marquee direction="up"><h1>Load Balancer, sevidor 2</h1></marquee>
    </body>
</html>

En caso de tener la plantilla de nuestra página web, podemos subirla a la instancia por WinSCP, Filezilla o FTP y pornerla en la ruta del servicio apache o nginx según corresponda: /var/www/html

Dar permisos necesarios sobre la carpeta

b8

Ahora toca comprobar si nuestro balanceo funciona correctamente, podemos acceder a la URL que se indica en la imagen anterior enmarcada en rojo, y vemos que funciona, si recargamos varias veces podemos notar el cambio que hacen las instancias para atender la solicitud.

b9

Los intervalos de tiempo los podemos modificar para cambiar la respuesta de los servidores o número de peticiones que tengan.

Configuración de forma manual en cada servidor

Para esta demostración se usarán de igual forma que en AWS tres servidores Ubuntu, pueden ser también otras distribuciones de Linux, primero comprobamos que los tres servidores tengan comunicación entre sí, nuestro equipo local será el equipo cliente:

b10

b11

b12

Primero hacemos la configuración básica de nginx para el balanceador de carga, debemos instalar nginx, modificar el archivo index para diferenciar los servidores al atender la solicitud y crear un archivo de configuración

sudo apt install -y update
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl status nginx

Con el último comando comprobamos si el servicio está activo y corriendo, luego de eso podemos probar en un navegador ver cada servidor actuando independientemente

b13

b14

b15

Ahora empezamos la configuración de nuestro load balancer, iniciamos creando un archivo de configuración dentro del PATH de nginx:

cd /etc/nginx/conf.d
vi lb.conf

El contenido del archivo es:

upstream test {
 server 192.168.40.161;
 server 192.168.40.162;
 server 192.168.40.163;
}

server {
    listen 80;
    server_name www.lbalancing.com;
    location / {
        proxy_pass http://test;
    }
}

Guardamos y salimos y reiniciamos el sercivio de nginx

sudo systemctl restart nginx

Ahora podemos comprobar si lo tenemos funcionando, pero si nos dimos cuenta en el contenido del archivo en la parte server_name pusimos una dirección de dominio, y con esta dirección debemos tratar de acceder en nuestro equipo cliente, pero para esto debemos tener la herramientas de bind9 para tener un servicio de DNS que pueda resolver esta dirección www.lbalancing.com

sudo apt install -y bind9 bind9utils bind9-doc dnsutils
sudo nano /etc/bind/named.conf.local

Y ahí configurar la zona directa e inversa para el servidor, también podemos solo modificar en el equipo cliente el archivo hosts que está en la ruta: system32 y colocar la ip de cualquier servidor e indicar dominio debe resolver esa IP, está es una solución para ambiente de pruebas, pero no es nada escalable si tenemos una red grande

b16

Si recargamos varias veces siempre será lo mismo, los servidores irán atendiendo cada solicitud conforme vayan llegando, ahora podemos usar otros algoritmos para hacer nuestro balanceador de cargas

Round Robin poderado

Con este método o forma de balanceo de cargas, podemos especificar en los archivos de configuración para los servidores que cierto equipo (IP) atienda un número de peticiones que nosotros le asignemos, esto es porque depende de las capacidades del servidor. Si ahora comprobamos en el navegador veremos que el servidor A (192.168.40.161) solo atiende una vez, mientras que los otros servidores atienden dos veces cada uno.

upstream test {
 server 192.168.40.161 weight=1;
 server 192.168.40.162 weight=2;
 server 192.168.40.163 weight=2;
}

server {
    listen 80;
    server_name www.lbalancing.com;
    location / {
        proxy_pass http://test;
    }
}

Menor conexiones (Least connected)

Como lo indica su nombre, en esta forma se envía la petición al servidor que tenga menos conexiones

upstream test {
 least_conn;
 server 192.168.40.161;
 server 192.168.40.162;
 server 192.168.40.163;
}

server {
    listen 80;
    server_name www.lbalancing.com;
    location / {
        proxy_pass http://test;
    }
IP Hash

Con esta forma hacemos que la ip de un equipo cliente se asigne a un servidor fijo dentro del grupo de balanceo y así este cliente tenga un mejor rendimiento al hacer su solicitud.

upstream test {    
 ip_hash;
 server 192.168.40.161;
 server 192.168.40.162;
 server 192.168.40.163;
}

server {
    listen 80;
    server_name www.lbalancing.com;
    location / {
        proxy_pass http://test;
    }

Y si comprobamos con esta configuración veremos que un solo servidor nos estará atendiendo hasta que falle.

Esta configuración también es posible hacerla usando instancias de AWS, se harían los mismos pasos, solo que debemos tener en cuenta antes que las instancias no deben estar asociadas a algún Load Balancer y deben estar en la misma red para que puedan comunicarse, las direcciones IP que irían dentro de nuestro archivo de configuración son las direcciones internas que tiene cada instancia (No deben ser las direcciones IP públicas con las que accedemos a ellas).

b19

b17

b18

Atrás