Como replicar dados nginx para dois servidores?

14

Estou tentando replicar o tráfego que um servidor nginx específico recebe para dois servidores. O objetivo não é balancear a carga, mas reproduzir a mesma entrada em todos os servidores nginx.

Um exemplo: o Nginx recebe um HTTP POST. Quero enviar esse mesmo POST para outros servidores.

** ATUALIZAÇÃO **

A situação é fácil e não complexa. Eu só preciso reenviar os dados do POST (ou GET ou qualquer dado de solicitação) para outro IP do servidor (também executando uma instância do nginx). Só isso.

USUÁRIO -> DADOS POST -> INSTÂNCIA NGINX ---- REDIRECIONAR ---> SERVIDOR 1 E SERVIDOR 2

Bernard Bay
fonte
1
Você pode expandir sua arquitetura? Quais são os outros dois servidores? Existe um banco de dados compartilhado, um sistema de arquivos compartilhado etc.? O POST grava no banco de dados, no sistema de arquivos, o que? Na verdade, o que você está tentando realizar que não pode ser feito com sistemas de arquivos em cluster e instâncias de banco de dados?
CJC
Eu reformulei sua pergunta para refletir com mais precisão o que você parece estar se perguntando.
precisa saber é
1
Este tipo de comportamento é por vezes utilizado em testes A / B
gWaldo
2
Esse não é o caminho a percorrer, você está quebrando HTTP, w3.org/Protocols/rfc2616/rfc2616.html
Daniel Prata Almeida
Já vi esse tipo de coisa perguntada antes. Eu acho que o que você deseja pesquisar pode ser pesquisado como "repetição http".
precisa saber é o seguinte

Respostas:

10

Consegui replicar usando o 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;
}

Agora ele envia dados para dois servidores.

Se o seu upstream não suportar fastcgi (aconteceu no meu caso), substitua por proxy_pass.

Mandris
fonte
4

Não acredito que você possa fazer isso com o nginx por si só; uma rápida leitura dos bits relevantes da documentação do nginx (diretivas upstream e proxy) não sugere que você possa. Conforme observado nos comentários, isso também quebra o HTTP, pois não há clareza sobre qual dos dois servidores traseiros responderá.

Uma alternativa é usar algo como verniz e fazer uma repetição para o segundo servidor traseiro usando varnishreplay:

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

Eu não o usei, então não sei se é possível reproduzir o tráfego quase simultaneamente com o primeiro servidor traseiro.

cjc
fonte
3

O que você deseja usar é algo como EM-Proxy [1]. Ele lida facilmente com a divisão de solicitações HTTP em qualquer número de servidores. Ele também lida corretamente com o retorno de dados apenas do servidor ativo e o bloqueio dos outros, para que o usuário não obtenha várias respostas.

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

Chris Johnston
fonte
2

Use o armazenamento central como um servidor NFS e cada nó da web nginx monta o compartilhamento NFS (no nível do arquivo). Ou use um sistema de arquivos em cluster como OCFS2 e cada nó da Web monta a partição LUN / (nível de bloco).

HTTP500
fonte
A solicitação POST não necessariamente grava coisas no sistema de arquivos. Precisamos de esclarecimentos sobre a arquitetura do OP.
Cjc
@cjc, True, eu estava lendo nas entrelinhas ...
HTTP500