Vấn đề
Tôi đang sử dụng haproxy để tải các máy chủ web cân bằng. Tôi sử dụng tính bền vững của phiên với các cookie bổ sung vì một số ứng dụng sử dụng tệp phiên và chúng không được đồng bộ hóa giữa các máy chủ.
Tôi muốn vô hiệu hóa một máy chủ để bảo trì, nhưng không phá vỡ các phiên. Vì vậy, tôi muốn cho phép các khách hàng hiện tại tiếp tục phiên ứng dụng của họ, nhưng không chấp nhận các khách hàng mới.
hành vi haproxy
- Tôi đặt một máy chủ để "bảo trì"
- nếu khách hàng có bộ cookie, hãy sử dụng máy chủ ngay cả khi được đánh dấu là "đang bảo trì"
- nếu một máy khách mới (không có cookie) đến, nó sẽ được chuyển đến một máy chủ khác
- sau khi tất cả khách hàng kết thúc phiên ứng dụng của họ, sẽ không có khách hàng nào đặt cookie vào máy chủ cụ thể này nữa và tôi sẽ tắt nó đi mà không bị gián đoạn người dùng.
Bạn có nghĩ rằng điều này là có thể đạt được với một số cấu hình haproxy? Hoặc có một cách thông minh để làm điều đó?
Những cách khác
Danh sách không đầy đủ các cách khác để đạt được nhu cầu này:
- đồng bộ hóa các tệp phiên giữa các máy chủ (cần một cách để đồng bộ hóa các tệp giữa một số máy chủ hoặc một điểm gắn kết chung)
- sử dụng cơ sở dữ liệu để lưu trữ thông tin phiên (cần thay đổi hành vi ứng dụng)
Thêm chi tiết
Tôi sử dụng loại cấu hình này:
frontend https-in
bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
reqadd X-Forwarded-Proto:\ https
acl APP1 hdr(host) -i APP1.atac.local
use_backend APP1 if APP1
default_backend _default
backend APP1
redirect scheme https if !{ ssl_fc }
mode http
balance roundrobin
cookie HAPROXY_SESSION insert indirect
option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
server SRV1 SRV1_IP:PORT cookie SRV1 check
server SRV2 SRV2_IP:PORT cookie SRV2 check
Nếu tôi chỉ tắt SRV1 (bằng lệnh haproxy cli), tôi nghĩ tất cả các phiên ứng dụng được mở trên SRV1 sẽ bị hỏng sau khi kết thúc "phiên" HTTP hiện tại. Có đúng không?