Tôi đã cài đặt HAProxy phiên bản 2.0.14 và tôi đang tìm kiếm một trường hợp sử dụng đặc biệt mà tôi chưa quản lý để định cấu hình chính xác.
Về cơ bản, tôi có một giao diện người dùng lắng nghe trên một cổng và hai máy chủ phụ trợ. Khi một phiên được bắt đầu, cookie sẽ được sử dụng, do đó, một phiên được liên kết với một máy chủ phụ trợ cụ thể và không thể chia sẻ với một máy chủ khác. Để đạt được điều này tôi đang sử dụng cái bàn
và dính vào
từ khóa và tập lệnh LUA để nhận giá trị bắt buộc từ các yêu cầu.
Tuy nhiên, khi yêu cầu đầu tiên đến, nếu máy chủ phụ trợ đã chọn không phản hồi kịp thời, chúng ta nên chuyển đổi dự phòng sang máy chủ khác, vì tại thời điểm đó, cookie vẫn chưa được đặt.
Cho đến nay tôi có cấu hình sau:
toàn cầu
log 127.0.0.1 len 10000 local2 gỡ lỗi
chroot /var/lib/haproxy
người dùng haproxy
nhóm haproxy
yêu tinh
tải lua /opt/LUA/myparser.lua
ổ cắm thống kê/etc/haproxy/haproxysock cấp quản trị viên
mặc định
đăng nhập toàn cầu
tùy chọn httplog
tùy chọn donlognull
chế độ http
hết thời gian kết nối 5000
khách hàng hết thời gian chờ 50000
máy chủ hết thời gian chờ 50000
định dạng nhật ký "IP máy khách: cổng = [%ci:%cp], Thời gian bắt đầu = [%tr], Tên giao diện người dùng = [%ft], Tên phụ trợ = [%b], Máy chủ phụ trợ = [%s], Thời gian để nhận đầy đủ yêu cầu = [%TR ms], Thời gian phản hồi = [%Tr ms], Mã trạng thái = [%ST], Số byte đã đọc = [%B]"
giao diện người dùng chatgw_front
ràng buộc *:8776
tùy chọn http-buffer-request
khai báo yêu cầu chụp len 40000
chụp yêu cầu http req.body id 0
yêu cầu chụp http req.hdrs len 2048
http-request track-sc0 bảng src my_back
use_backend my_back
phụ trợ my_back
thăng bằng vòng tròn
bảng dính loại dây len 32 size 30k hạn sử dụng 30m
dán vào bảng "lua.parseId" my_back
máy chủ server1 x.x.x.1:8080 kiểm tra
máy chủ server2 x.x.x.2.8080 kiểm tra
Điều này thực hiện là nếu máy chủ phụ trợ đã chọn không phản hồi sau 50 giây, nó sẽ đưa ra Thời gian chờ cổng HTTP 504 cho máy khách. Thay vào đó, điều tôi cần là, nếu đây là yêu cầu đầu tiên trong một phiên, thì (và chỉ sau đó) chuyển đổi dự phòng sang máy chủ phụ trợ khác. Chúng tôi có thể nói đây là yêu cầu đầu tiên dựa trên URL.
Tôi đã cố gắng thay đổi phụ trợ như thế này:
phụ trợ my_back
thăng bằng vòng tròn
bảng dính loại dây len 32 size 30k hạn sử dụng 30m
dán vào bảng "lua.parseId" my_back
# Kiểm tra xem đây có phải là yêu cầu "init" không: trong trường hợp này, URL chứa "/init"
acl is_init path_sub /init
# Trong trường hợp yêu cầu "init", hãy bật gửi lại tới máy chủ phụ trợ khác trong trường hợp không thành công
tùy chọn gửi lại nếu is_init
# Trong trường hợp có các yêu cầu khác (không phải "init"), chúng tôi đã được liên kết với máy chủ phụ trợ đã chọn do cookie phiên, vì vậy hãy tắt tính năng gửi lại
không có tùy chọn gửi lại nếu !is_init
máy chủ server1 x.x.x.1:8080 kiểm tra
máy chủ server2 x.x.x.2.8080 kiểm tra
Tuy nhiên tôi có cùng một hành vi. Vì vậy, tôi đã cố gắng thêm "thử lại":
phụ trợ my_back
thăng bằng vòng tròn
bảng dính loại dây len 32 size 30k hạn sử dụng 30m
dán vào bảng "lua.parseId" my_back
acl is_init path_sub /init
tùy chọn gửi lại nếu is_init
không có tùy chọn gửi lại nếu !is_init
thử lại kết nối thất bại phản hồi trống thời gian chờ phản hồi
máy chủ server1 x.x.x.1:8080 kiểm tra
máy chủ server2 x.x.x.2.8080 kiểm tra
Bây giờ thì khác: nó đã thử yêu cầu ban đầu 4 lần trên cùng một máy chủ và sau đó nó trả về HTTP 504. Sau đó, nó nhận được yêu cầu tiếp theo (không phải là "init", vì vậy không nên dính vào máy chủ phụ trợ đã chọn ) và thay vào đó, tệp này được gửi đến máy chủ khác.
Về cơ bản, vấn đề của tôi là: cách triển khai chuyển đổi dự phòng chỉ theo yêu cầu đầu tiên? Bất kỳ yêu cầu nào khác phải luôn gắn với máy chủ phụ trợ đã chọn.