Chúng tôi sử dụng Nginx làm bộ cân bằng tải cho ứng dụng websocket của chúng tôi. Mỗi máy chủ phụ trợ giữ thông tin phiên vì vậy mọi yêu cầu từ khách hàng phải được chuyển tiếp trên cùng một máy chủ. Vì vậy, chúng tôi sử dụng ip_hash
chỉ thị để đạt được điều này:Nginx, cân bằng tải bằng cách sử dụng các thuật toán dính và ít nhất kết nối đồng thời
upstream app {
ip_hash;
server 1;
}
Vấn đề xuất hiện khi chúng ta muốn thêm một máy chủ backend:
upstream app {
ip_hash;
server 1;
server 2;
}
kết nối mới đi đến máy chủ 1 và máy chủ 2 - nhưng điều này không phải những gì là chúng tôi cần trong tình huống này khi tải trên máy chủ 1 tiếp tục tăng - chúng tôi vẫn cần các phiên cố định nhưng cũng bật thuật toán least_conn
- vì vậy hai máy chủ của chúng tôi nhận được khoảng tải bằng nhau.
Chúng tôi cũng xem xét sử dụng Nginx-sticky-module
nhưng documentaton nói rằng nếu không có cookie dính nào thì nó sẽ quay trở lại thuật toán Nginx mặc định của vòng tròn - vì vậy nó cũng không giải quyết được vấn đề.
Vì vậy, câu hỏi đặt ra là chúng ta có thể kết hợp logic kết nối ít nhất và ít nhất bằng cách sử dụng Nginx không? Bạn có biết các cân bằng tải khác giải quyết vấn đề này không?
Có lẽ điều này sẽ được chuyển đến serverfault để nhận câu trả lời? – Collector
Câu hỏi thú vị là tại sao "tải trên máy chủ 1 tiếp tục tăng" - có thể là do đa số người dùng của bạn ngồi sau cùng một hoặc một vài NAT? Trong trường hợp này băm trên nguồn IP là không hiệu quả và bạn có thể xem xét sử dụng khóa phức tạp hơn thông qua chỉ thị 'băm' trái với' ip_hash '. Ví dụ: bạn có thể muốn thêm một số phần hoặc tham số URI cụ thể của người dùng vào khóa ... – wick
Câu trả lời hữu ích, nhưng tôi không chắc họ đã trả lời câu hỏi ban đầu. Alex? –