¿Cómo replicar datos nginx a dos servidores?

14

Estoy tratando de replicar el tráfico que recibe un servidor nginx específico en dos servidores. El objetivo no es equilibrar la carga, sino reproducir la misma entrada en todos los servidores nginx.

Un ejemplo: Nginx recibe una POST HTTP. Quiero enviar esta misma POST a otros servidores.

** ACTUALIZACIÓN **

La situación es fácil y no compleja. Solo necesito reenviar los datos POST (o GET o cualquier solicitud de datos) a otro IP del servidor (también ejecuta una instancia nginx). Solo esto.

USUARIO -> DATOS POSTALES -> NGINX INSTANCE ---- REDIRECT ---> SERVIDOR 1 Y SERVIDOR 2

Bernard Bay
fuente
1
¿Puedes ampliar tu arquitectura? ¿Cuáles son los otros dos servidores? ¿Hay una base de datos compartida, un sistema de archivos compartido, etc.? ¿La POST escribe en la base de datos, en el sistema de archivos, qué? En realidad, ¿qué estás tratando de lograr que no se puede hacer con sistemas de archivos en clúster e instancias de bases de datos?
cjc
Reformé su pregunta para reflejar con mayor precisión lo que parece estar preguntando.
gWaldo
1
Este tipo de comportamiento a veces se usa en las pruebas A / B
gWaldo
2
Ese no es el camino a seguir, estás rompiendo HTTP, w3.org/Protocols/rfc2616/rfc2616.html
Daniel Prata Almeida
He visto este tipo de cosas antes preguntadas. Creo que lo que quieres buscar puede buscarse como "reproducción http".
gWaldo

Respuestas:

10

Pude replicar usando el estado post_action.

upstream main_upstream {
least_conn;
server 192.168.9.10:80;
keepalive 1024;
}

server {
listen 80;
server_name _;
client_body_buffer_size 1512k;
client_max_body_size 10m;

location /1/ {
fastcgi_pass main_upstream;
post_action @replayevent ;

}
# Send the post_action request to a FastCGI backend for logging.
location @replayevent {
fastcgi_pass 192.168.9.14:80;
}

Ahora envía datos a dos servidores.

Si su upstream no admite fastcgi (sucedió en mi caso), reemplace con proxy_pass.

Chucks
fuente
4

No creo que puedas hacer esto con nginx solo; una lectura rápida de los bits relevantes de la documentación de nginx (directivas ascendentes y proxy) no sugiere que pueda hacerlo. Como se señaló en los comentarios, esto también rompe HTTP, ya que no hay claridad sobre cuál de los dos servidores posteriores responderá.

Una alternativa es usar algo como barniz y hacer una repetición en el segundo servidor posterior usando varnishreplay:

https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html

No lo he usado, así que no sé si puede hacer que reproduzca el tráfico casi simultáneamente con el primer servidor posterior.

cjc
fuente
3

Lo que quiere usar es algo así como EM-Proxy [1]. Maneja fácilmente la división de solicitudes http en cualquier número de servidores. También maneja correctamente los datos devueltos solo desde el servidor en vivo y bloquea los demás para que el usuario no obtenga múltiples respuestas.

[1] https://github.com/igrigorik/em-proxy/

Chris Johnston
fuente
2

Utilice el almacenamiento central como un servidor NFS y cada nodo web nginx monta el recurso compartido NFS (nivel de archivo). O use un sistema de archivos de clúster como OCFS2 y cada nodo web monta el LUN / partición (nivel de bloque).

HTTP500
fuente
La solicitud POST no necesariamente escribe cosas en el sistema de archivos. Necesitamos aclaraciones sobre la arquitectura del OP.
cjc
@cjc, es cierto, estaba leyendo entre líneas ...
HTTP500