Jak replikować dane Nginx na dwa serwery?

14

Próbuję replikować ruch, który otrzymuje jeden konkretny serwer Nginx na dwa serwery. Celem nie jest zrównoważenie obciążenia, ale odtworzenie tego samego wejścia na wszystkich serwerach nginx.

Przykład: Nginx otrzymuje HTTP POST. Chcę wysłać ten sam test POST na inne serwery.

** AKTUALIZACJA **

Sytuacja jest łatwa i niezłożona. Muszę tylko ponownie wysłać dane POST (lub GET lub dowolne dane żądania) na inny adres IP serwera (to także działa instancja nginx). Po prostu to.

UŻYTKOWNIK -> DANE POST -> INSTANCJA NGINX ---- REDIRECT ---> SERWER 1 I SERWER 2

Bernard Bay
źródło
1
Czy możesz rozwinąć swoją architekturę? Jakie są pozostałe dwa serwery? Czy istnieje wspólna baza danych, wspólny system plików itp.? Czy POST zapisuje do DB, do systemu plików, co? W rzeczywistości, co próbujesz osiągnąć, czego nie można zrobić z klastrowymi systemami plików i instancjami baz danych?
cjc
Przeformułowałem twoje pytanie, aby dokładniej odzwierciedlić to, o co pytasz.
gWaldo
1
Ten typ zachowania jest czasem wykorzystywany w testach A / B
gWaldo
2
To nie jest droga, łamiesz
Daniel Prata Almeida
Widziałem już tego rodzaju pytania. Myślę, że to, na co chcesz spojrzeć, można wyszukać jako „powtórkę http”.
gWaldo

Odpowiedzi:

10

Byłem w stanie powielać się przy użyciu stanu aktywności.

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

Teraz wysyła dane do dwóch serwerów.

Jeśli twój upstream nie obsługuje fastcgi (zdarzyło się w moim przypadku), zamień na proxy_pass.

Uchwyty
źródło
4

Nie wierzę, że możesz to zrobić sam z nginx; szybkie przejrzenie odpowiednich fragmentów dokumentacji nginx (dyrektywy upstream i proxy) nie sugeruje, że możesz. Jak zauważono w komentarzach, psuje to również HTTP, ponieważ nie ma jasności co do tego, który z dwóch tylnych serwerów zareaguje.

Jedną z możliwości jest użycie czegoś takiego jak lakier i powtórzenie na drugim tylnym serwerze za pomocą varnishreplay:

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

Nie korzystałem z niego, więc nie wiem, czy możesz sprawić, by odtwarzał ruch prawie jednocześnie z pierwszym serwerem tylnym.

cjc
źródło
3

To, czego chcesz użyć, to coś w rodzaju EM-Proxy [1]. Z łatwością obsługuje dzielenie żądań HTTP na dowolną liczbę serwerów. Prawidłowo obsługuje również zwracanie danych tylko z serwera na żywo i blokowanie innych, aby użytkownik nie otrzymał wielu odpowiedzi.

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

Chris Johnston
źródło
2

Używaj pamięci centralnej jak serwera NFS, a każdy węzeł sieciowy Nginx montuje udział NFS (na poziomie pliku). Lub użyj systemu plików klastra, takiego jak OCFS2, a każdy węzeł sieciowy instaluje jednostkę LUN / partycję (na poziomie bloku).

HTTP500
źródło
Żądanie POST niekoniecznie zapisuje rzeczy w systemie plików. Potrzebujemy wyjaśnienia na temat architektury PO.
cjc
@cjc, Prawda, czytałem między wierszami ...
HTTP500