haproxy: giữ lại các phiên hiện có dưới tải trọng cao, phục vụ '503' cho những người mới đến


12

Cố gắng thực hiện những gì nó nói trong tiêu đề: giữ lại các phiên hiện có dưới tải cao và phục vụ tin nhắn 503 cho khách truy cập mới đến.

Vấn đề: nó hoạt động, nhưng các phiên không kéo dài quá 90 giây.

Kết quả hiện tại khiến tôi băn khoăn không biết có cài đặt hết thời gian không.

Mục đích

Tôi đang cố gắng để có được haproxy để:

  • gửi yêu cầu cho các phiên mới đến phụ trợ-001 khi tổng số phiên trên giao diện dưới một ngưỡng nhất định.
  • phục vụ lỗi 503 cho các phiên mới khi tổng số phiên trên giao diện vượt quá ngưỡng đó
  • cho phép yêu cầu cho các phiên hiện tại ngay cả khi số phiên vượt quá ngưỡng

Bằng cách này, khách truy cập ở giữa điền vào biểu mẫu nhiều bước sẽ không bị bất ngờ bởi lỗi 503 và khách truy cập mới có thể được thông báo "vui lòng quay lại sau vì chúng tôi thực sự bận rộn ngay bây giờ".

Thiết lập

Các thiết lập như sau:

            {visitors}
                ↓ 
            [haproxy]
                ↓ 
[rails app on unicorn served by nginx]   (right now just one 
                                            backend: 'backend-001')

phương cách hiện hành

Để đạt được những điều trên, tôi đang sử dụng cấu hình bên dưới.

Cái này là để thử nghiệm, với giới hạn rất thấp (10 kết nối ở mặt trước (fe_conn gt 10)), để giúp thử nghiệm dễ dàng hơn.

Để đặt máy chủ dưới một số tải, tôi đang sử dụng omeperf như sau:

omeperf --oose --server staging.machine.tld --uri / do_some_things --wsess = 500,10,30 --rate 2

global
    daemon
    maxconn 10000

defaults
    mode        http
    timeout connect 6s
    timeout client  60s
    timeout server  60s
    balance roundrobin
    option http-server-close

frontend http-in
    bind [PUBLIC_IP]:80

    default_backend backend-001

    acl too_many fe_conn gt 10
    use_backend b_too_many if too_many

backend backend-001
    fullconn 10
    appsession _session_id len 128 timeout 7200s

    cookie SERVERID insert maxidle 7200s
    server Server1 127.0.10.1:80 cookie backend-001 check

backend b_too_many
    errorfile 503 /var/www/50x.html

vấn đề

Như đã đề cập ở trên, vấn đề là: nó gần như hoạt động, nhưng các phiên không kéo dài quá 90 giây.

Nếu bạn tiếp tục nhấp vào, bạn có thể giữ phiên của mình ngay cả khi có 10 phiên bận rộn.

Cố gắng mở một trang trên máy chủ với một phiên bản trình duyệt khác sẽ khiến bạn gặp phải lỗi 503.

Vì vậy, có vẻ như tôi gần như ở đó. Có ai có ý tưởng gì có thể gây ra thời gian phiên ngắn không?

Và đặc biệt là làm thế nào tôi có thể sửa nó :)

.


Có thể là một câu hỏi ngớ ngẩn - cài đặt keep_alive trong nginx là gì? Rõ ràng đó là 75s theo mặc định - đó có thể là vấn đề?
Aidan Kane

Câu trả lời:


4

Thật không may, bạn dường như hoàn toàn nhầm lẫn các kết nối với các phiên cấp ứng dụng. Một người dùng truy cập trang web có thể có một cookie khiến bạn nghĩ rằng anh ta sở hữu một kết nối trong khi đó không nhất thiết phải như vậy. Anh ta có thể mở nhiều kết nối khi cần để tìm nạp các đối tượng và điều hướng các trang.

90 giây bạn đang quan sát chắc chắn là trình duyệt sẽ hết thời gian chờ cho các kết nối nhàn rỗi.

Có thể đạt được những gì bạn muốn nhưng nó phức tạp hơn thế một chút, vì bạn cũng phải xem xét sự hiện diện của cookie kiên trì trong yêu cầu để tìm hiểu xem khách truy cập có phải là người mới hay không.

Ngoài ra, nói chung, hiệu quả hơn là dựa vào số lượng kết nối trung bình trên mỗi máy chủ so với số lượng kết nối giao diện. Lý do là khi một máy chủ chết, bạn cần điều chỉnh lại số này. Cách hiệu quả nhất là thiết lập giá trị maxconn của máy chủ để cho phép xếp hàng và sử dụng avg_queue để giới hạn áp dụng cho số lượng yêu cầu xếp hàng trung bình trên máy chủ. Điều này cho phép bạn xử lý chính xác các khách truy cập đã biết trong khi nhẹ nhàng di chuyển người dùng mới sang một phụ trợ khác khi tải tăng lên do khách truy cập hiện có.


1
Cảm ơn cảm ơn! Điều đó đã làm sáng tỏ rất nhiều. Bây giờ tôi có nó hoạt động bằng cách (trong số những thứ khác) kiểm tra cookie phụ trợ với hdr_sub (Vì vậy, "hdr_sub (cookie) SERVERID = backend-001"). Tôi sẽ đăng một cấu hình làm việc khi nó hoàn thành.
Apenootje
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.