Làm thế nào để sao chép dữ liệu nginx vào hai máy chủ?


14

Tôi đang cố gắng tái tạo lưu lượng mà một máy chủ nginx cụ thể nhận được cho hai máy chủ. Mục tiêu không phải là cân bằng tải, mà là phát lại cùng một đầu vào trên tất cả các máy chủ nginx.

Một ví dụ: Nginx nhận được HTTP POST. Tôi muốn gửi POST này cho các máy chủ khác.

** CẬP NHẬT **

Tình hình là dễ dàng và không phức tạp. Tôi chỉ cần gửi lại dữ liệu POST (hoặc GET hoặc bất kỳ dữ liệu yêu cầu nào) đến một IP máy chủ khác (nó cũng đang chạy một ví dụ nginx). Chỉ nó thôi.

NGƯỜI DÙNG -> POST DATA -> NGINX INSTANCE ---- GIẢM GIÁ ---> SERVER 1 VÀ SERVER 2


1
Bạn có thể mở rộng về kiến ​​trúc của bạn? Hai máy chủ khác là gì? Có DB chung, hệ thống tập tin chia sẻ, vv? POST có ghi vào DB, vào hệ thống tập tin không? Trên thực tế, những gì bạn đang cố gắng thực hiện mà không thể được thực hiện với các hệ thống tập tin và cơ sở dữ liệu cụm?
cjc

Tôi hỏi lại bạn câu hỏi để phản ánh chính xác hơn những gì bạn dường như đang hỏi.
gWaldo

1
Loại hành vi này đôi khi được sử dụng trong thử nghiệm A / B
gWaldo

2
Đó không phải là con đường để đi, bạn đang phá vỡ HTTP, w3.org/Prot Protocol / rfc2616 / rfc2616.html
Daniel Prata Almeida

Tôi đã thấy loại điều này được hỏi về trước đây. Tôi nghĩ rằng những gì bạn muốn xem xét có thể được tìm kiếm là "http phát lại".
gWaldo

Câu trả lời:


10

Tôi đã có thể sao chép bằng trạng thái 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;
}

Bây giờ nó gửi dữ liệu hai máy chủ.

Nếu ngược dòng của bạn không hỗ trợ fastcgi (xảy ra trong trường hợp của tôi), hãy thay thế bằng proxy_pass.


4

Tôi không tin rằng bạn có thể làm điều này với nginx; một sự bổ sung nhanh chóng về các bit có liên quan của tài liệu nginx (chỉ thị ngược dòng và proxy) không gợi ý bạn có thể. Như đã lưu ý trong các bình luận, điều này cũng phá vỡ HTTP, vì không có sự rõ ràng nào trong số hai máy chủ phía sau sẽ phản hồi.

Một cách khác là sử dụng một cái gì đó như véc ni và phát lại máy chủ phía sau thứ hai bằng cách sử dụng véc ni:

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

Tôi chưa sử dụng nó, vì vậy tôi không biết liệu bạn có thể làm cho nó phát lại lưu lượng truy cập gần như đồng thời với máy chủ phía sau đầu tiên không.


3

Những gì bạn muốn sử dụng là một cái gì đó như EM-Proxy [1]. Nó dễ dàng xử lý việc tách các yêu cầu http trên bất kỳ số lượng máy chủ nào. Nó cũng xử lý chính xác dữ liệu trả về từ máy chủ trực tiếp và chặn những người khác để người dùng không nhận được nhiều phản hồi.

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


2

Sử dụng bộ nhớ trung tâm như máy chủ NFS và mỗi nút web nginx gắn kết chia sẻ NFS (cấp độ tệp). Hoặc sử dụng một hệ thống tệp cụm như OCFS2 và mỗi nút web gắn kết LUN / phân vùng (cấp khối).


Yêu cầu POST không nhất thiết phải ghi mọi thứ vào hệ thống tập tin. Chúng tôi cần làm rõ về kiến ​​trúc của OP.
cjc

@cjc, Đúng, tôi đã đọc giữa các dòng ...
HTTP500
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.