Wie repliziere ich Nginx-Daten auf zwei Server?

14

Ich versuche, den Datenverkehr , den ein bestimmter Nginx-Server empfängt, auf zwei Server zu replizieren . Das Ziel ist nicht der Lastausgleich, sondern die Wiedergabe derselben Eingabe auf allen Nginx-Servern.

Ein Beispiel: Nginx empfängt einen HTTP-POST. Ich möchte denselben POST an andere Server senden.

** UPDATE **

Die Situation ist einfach und nicht komplex. Ich muss nur die POST-Daten (oder GET oder andere Anforderungsdaten) erneut an eine andere Server-IP senden (auf der auch eine Nginx-Instanz ausgeführt wird). Nur das.

USER -> POST DATA -> NGINX INSTANCE ---- REDIRECT ---> SERVER 1 UND SERVER 2

Bernard Bay
quelle
1
Können Sie Ihre Architektur erweitern? Was sind die beiden anderen Server? Gibt es eine gemeinsam genutzte Datenbank, ein freigegebenes Dateisystem usw.? Schreibt der POST in die Datenbank, in das Dateisystem, was? Was möchten Sie eigentlich erreichen, was mit gruppierten Dateisystemen und Datenbankinstanzen nicht möglich ist?
cjc
Ich habe Ihre Frage umformuliert, um genauer zu reflektieren, was Sie zu fragen scheinen.
GWaldo
1
Diese Art von Verhalten wird manchmal in A / B-Tests verwendet
gWaldo
2
Das ist nicht der richtige
Daniel Prata Almeida
Ich habe solche Dinge schon einmal gesehen. Ich denke, dass das, was Sie untersuchen möchten, als "http-Wiedergabe" gesucht werden kann.
GWaldo

Antworten:

10

Ich konnte mit dem Status post_action replizieren.

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;
}

Jetzt sendet es Daten zwei Server.

Wenn Ihr Upstream Fastcgi nicht unterstützt (in meinem Fall passiert), ersetzen Sie ihn durch proxy_pass.

Spannfutter
quelle
4

Ich glaube nicht, dass Sie dies mit Nginx alleine tun können. Eine schnelle Durchsicht der relevanten Teile der Nginx-Dokumentation (Upstream- und Proxy-Direktiven) bedeutet nicht, dass Sie dies können. Wie in den Kommentaren erwähnt, wird dadurch auch HTTP unterbrochen, da nicht klar ist, auf welchen der beiden hinteren Server reagiert wird.

Eine Alternative besteht darin, etwas wie Lack zu verwenden und mit varnishreplay eine Wiederholung auf dem zweiten hinteren Server durchzuführen:

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

Ich habe es nicht verwendet, daher weiß ich nicht, ob Sie den Datenverkehr fast gleichzeitig mit dem ersten hinteren Server wiedergeben können.

cjc
quelle
3

Was Sie verwenden möchten, ist so etwas wie EM-Proxy [1]. Die Aufteilung von http-Anforderungen auf eine beliebige Anzahl von Servern ist problemlos möglich. Außerdem werden Daten nur vom Live-Server korrekt zurückgegeben und die anderen blockiert, sodass der Benutzer nicht mehrere Antworten erhält.

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

Chris Johnston
quelle
2

Verwenden Sie einen zentralen Speicher wie einen NFS-Server, und jeder Nginx-Webknoten stellt die NFS-Freigabe (Dateiebene) bereit. Oder verwenden Sie ein Cluster-Dateisystem wie OCFS2, und jeder Webknoten stellt die LUN / Partition (Blockebene) bereit.

HTTP500
quelle
Die POST-Anforderung schreibt nicht unbedingt Dinge in das Dateisystem. Wir müssen die Architektur des OP klären.
cjc
@cjc, stimmt, ich habe zwischen den Zeilen
gelesen