En artículos anteriores demostré cómo implementar una caché de paquetes con Nginx, pero al mismo tiempo balanceando carga entre diferentes mirrors. Tal como mencioné en dicho artículo, el balanceo de carga tiene como beneficio secundario mejorar la disponibilidad. Fue por esta razón que me incliné a balancear carga entre varios mirrors. Sin embargo, esto puede traer algunos inconvenientes que es posible evitar de forma sencilla.



El problema puede presentarse si se descargan paquetes desde diferentes mirrors al mismo tiempo. Por ejemplo cuando, al momento de actualizar un servidor, algunos paquetes se descargan desde un mirror y otros desde uno diferente. Esto podría generar inconsistencias si los mirrors no están perfectamente sincronizados (por ejemplo uno de ellos está desactualizado, créanme que no es una situación poco común).

Lo ideal es que, durante una actualización, cada cliente obtenga sus paquetes desde un mismo mirror. Afortunadamente, el módulo ngx_http_upstream_module permite lograr ésto a través de la directiva ip_hash.

Cuando dentro de un grupo de balanceo de carga (definido por una directiva upstream) se incluye la directiva ip_hash, todas las solicitudes son distribuidas entre los servidores basándose en la dirección IP de los clientes. Esta característica utiliza los tres primeros octetos de la dirección IPv4 como clave, y asegura que todas las solicitudes provenientes desde un mismo cliente sean pasadas al mismo servidor (a menos que no se encuentre disponible).

Para utilizar esta característica, sólo basta con agregar la directiva ip_hash dentro del bloque upstream:

    upstream debiancache {
        ip_hash;
        
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
        server 127.0.0.1:8084;
    }

Finalmente, es importante aclarar que al utilizar balance de carga entre mirrors no se mejora la eficiencia ni tiempo de respuesta, sino que apunta justamente a mejorar la disponibilidad. Al contrario, balanceando la carga entre mirrors se perjudica en una medida la eficiencia, pues un mismo paquete estará almacenado en caché por cada mirror desde el que fue obtenido. Esto se debe a que la caché no guarda simplemente recursos, sino solicitudes completas (incluyendo la URL y cabeceras de la respuesta). Por ende, un mismo paquete podrá aparecer para la caché como un recurso diferente al ser obtenido desde un mirror diferente.

En el caso de un mirror defectuoso, es posible deshabilitarlo temporalmente agregando el parámetro down. Por ejemplo:

    upstream debiancache {
        ip_hash;
        
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083 down;
        server 127.0.0.1:8084;
    }

En todos estos casos será necesario recargar Nginx para aplicar los cambios en la configuración.

Referencias


Tal vez pueda interesarte


Compartí este artículo