A final del año 2019 necesitaba buscar un medio que me permitiera validar una nueva arquitectura de una plataforma productiva. Las pruebas sintéticas habían sido de valor, pero era necesario probarla con carga real generada por el uso diario del API original, pero sin afectar el tráfico productivo.

Luego de investigar diversos mecanismos, decidí hacer uso del módulo http_mirror_module que es parte de NGINX desde la versión 1.13.4. Un punto a favor era que -en ese momento- todo el tráfico entrante era canalizado precisamente por un grupo de servidores NGINX.

Este módulo lo que permite es copiar los request que recibe hacia otro backend, ignorando las respuestas que este último pueda dar. Y eso era precisamente lo que necesitaba para poder observar como el nuevo sistema manejaba el tráfico real.

El proceso fue realmente sencillo, primero debemos ajustar el location de interés en nuestro archivo de configuración y agregar el mirror.

location / {
    mirror /mirror;
    mirror_request_body on;
   .....

 }

Posteriormente y como deseaba tener un registro de todo lo que enviaba, cree un location /mirror de la siguiente manera:

location /mirror {
  internal;
  proxy_pass http://127.0.0.1:55555$request_uri;

   proxy_pass_request_body on;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection 'upgrade';
   proxy_cache_bypass $http_upgrade;
   ....
 }

Observen que envio el tráfico al mismo servidor en el puerto 55555. La razón es que necesitaba guardar los logs y me parecio la ruta más simple. Noten que en el proxy_pass indicó el url de la plataforma nueva que deseo poner a prueba.

server {
    listen 127.0.0.1:55555;
    location / {
     proxy_pass https://nuevaURL;

    .....

    # whatever you want to log
     access_log /var/opt/rh/rh-nginx114/log/nginx/accessMirror.log upstreamlog;
     error_log /var/opt/rh/rh-nginx114/log/nginx/errorMirror.log warn;
    }
}

Luego de esto reiniciamos el nginx y comenzamos a tener el mismo tráfico de producción en nuestra nueva plataforma. En los logs del sitio original podemos ver tanto el access_log como el error_log si se nos hace necesario profundizar en el comportamiento que tengamos.

Algo que si debemos tener en cuenta es que estamos literalmente duplicando el tráfico que llega y en consecuencia nuestra enlace de salida de Internet debe ser capaz de poder soportarlo o podríamos tener problemas en la plataforma productiva.

Conclusión


El uso de nginx y mirroring nos puede brincar un mecanismo simple pero efectivo para probar una nueva plataforma con carga real.