Comment répliquer des données nginx sur deux serveurs?

14

J'essaie de répliquer le trafic qu'un serveur nginx spécifique reçoit sur deux serveurs. Le but n'est pas d'équilibrer la charge, mais de rejouer la même entrée sur tous les serveurs nginx.

Un exemple: Nginx reçoit un HTTP POST. Je veux envoyer ce même POST à ​​d'autres serveurs.

** METTRE À JOUR **

La situation est facile et non complexe. J'ai juste besoin de renvoyer les données POST (ou GET ou toutes les données de demande) à une autre IP de serveur (il exécute également une instance nginx). Juste ça.

UTILISATEUR -> POST DATA -> NGINX INSTANCE ---- REDIRECT ---> SERVER 1 AND SERVER 2

Bernard Bay
la source
1
Pouvez-vous développer votre architecture? Quels sont les deux autres serveurs? Existe-t-il une base de données partagée, un système de fichiers partagé, etc.? Le POST écrit-il dans la base de données, dans le système de fichiers, quoi? En fait, qu'essayez-vous d'accomplir qui ne peut pas être fait avec des systèmes de fichiers en cluster et des instances de base de données?
cjc
Je vous ai reformulé votre question pour mieux refléter ce que vous semblez demander.
gWaldo
1
Ce type de comportement est parfois utilisé dans les tests A / B
gWaldo
2
Ce n'est pas la voie à suivre, vous cassez
Daniel Prata Almeida
J'ai déjà vu ce genre de choses. Je pense que ce que vous voulez regarder peut être recherché comme "http replay".
gWaldo

Réponses:

10

J'ai pu répliquer en utilisant l'état 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;
}

Maintenant, il envoie des données à deux serveurs.

Si votre amont ne prend pas en charge fastcgi (arrivé dans mon cas), remplacez par proxy_pass.

Mandrins
la source
4

Je ne crois pas que vous puissiez faire cela avec nginx seul; une lecture rapide des bits pertinents de la documentation nginx (directives amont et proxy) ne suggère pas que vous le pouvez. Comme indiqué dans les commentaires, cela rompt également HTTP, car il n'y a aucune clarté sur lequel des deux serveurs arrière répondra.

Une alternative est d'utiliser quelque chose comme du vernis et de faire une relecture sur le deuxième serveur arrière en utilisant varnishreplay:

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

Je ne l'ai pas utilisé, donc je ne sais pas si vous pouvez le faire rejouer le trafic presque simultanément avec le premier serveur arrière.

cjc
la source
3

Ce que vous voulez utiliser est quelque chose comme EM-Proxy [1]. Il gère facilement la répartition des requêtes http sur un nombre quelconque de serveurs. Il gère également correctement le retour des données du seul serveur en direct et le blocage des autres afin que l'utilisateur n'obtienne pas de réponses multiples.

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

Chris Johnston
la source
2

Utilisez le stockage central comme un serveur NFS et chaque nœud Web nginx monte le partage NFS (au niveau du fichier). Ou utilisez un système de fichiers en cluster comme OCFS2 et chaque nœud Web monte la LUN / partition (au niveau du bloc).

HTTP500
la source
La requête POST n'écrit pas nécessairement des choses dans le système de fichiers. Nous avons besoin de clarifications sur l'architecture du PO.
cjc
@cjc, c'est vrai, je lisais entre les lignes ...
HTTP500