haproxy: mevcut oturumları yüksek yük altında tut, yeni gelenlere '503'


12

Başlıkta söylediklerini yapmaya çalışmak: mevcut oturumları yüksek yük altında tutmak ve yeni gelen ziyaretçilere 503 mesaj sunmak.

Sorun: işe yarıyor, ancak oturumlar yaklaşık 90 saniyeden fazla sürmüyor.

Mevcut sonuçlar beni kaçırdığım bir zaman aşımı ayarı olup olmadığını merak ediyor.

amaç

Aşağıdakilere haproxy almaya çalışıyorum:

  • ön uçtaki toplam oturum sayısı belirli bir eşiğin altında olduğunda, yeni oturum isteklerini arka uç-001'e gönderin.
  • kullanıcı arabirimindeki toplam oturum sayısı bu eşiğin üstünde olduğunda yeni oturumlara 503 hatası verir
  • oturum sayısı eşiği aşsa bile mevcut oturumlar için isteklere izin ver

Bu şekilde, çok adımlı bir form doldurmanın ortasında olan ziyaretçiler 503 hatasıyla şaşırmayacak ve yeni ziyaretçilere "lütfen daha sonra geri dönün çünkü şu anda gerçekten meşgulüz" diyebilir.

Kurmak

Kurulum aşağıdaki gibidir:

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

mevcut yaklaşım

Yukarıdakilere ulaşmak için, aşağıdaki yapılandırmayı kullanıyorum.

Bu, testi kolaylaştırmak için çok düşük bir limite sahip (ön uçta 10 bağlantı (fe_conn gt 10)) test içindir.

Sunucuyu biraz yük altına almak için httperf'i aşağıdaki gibi kullanıyorum:

httperf --hog --server staging.machine.tld --uri / do_some_things --wsess = 500,10,30 - oran 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

sorun

Yukarıda belirtildiği gibi, sorun: neredeyse işe yarıyor, ancak oturumlar yaklaşık 90 saniyenin ötesinde sürmüyor.

Tıklamaya devam ederseniz, 10 oturum meşgul olduğunda bile oturumunuzu sürdürürsünüz.

Sunucuda farklı bir tarayıcı örneğiyle bir sayfa açmaya çalışmak size 503 hatası verir.

Yani, neredeyse oradaymışım gibi görünüyor. Kısa oturum sürelerine neyin sebep olabileceği hakkında bir fikri olan var mı?

Ve özellikle nasıl düzeltebilirim :)

(değiştir: 'ağırlık 1 maks. bağlantı 10'u' sunucu 'satırından kaldırıldı, alakalı değil ve kafa karıştırıcı olabilir) (2.: ön uçtaki' 10 oturumu düzeltildi 'ile ön uçtaki '10 bağlantıyı düzenleyin')


Aptalca bir soru olabilir - nginx'teki keep_alive ayarı nedir? Görünüşe göre varsayılan olarak 75'ler - sorun bu olabilir mi?
Aidan Kane

Yanıtlar:


4

Ne yazık ki, bağlantıları uygulama düzeyindeki oturumlarla tamamen karıştırıyorsunuz. Siteyi ziyaret eden bir kullanıcı, mutlaka bir bağlantıya sahip olduğunu düşündüren bir çerez içerebilir. Nesneleri almak ve sayfalarda gezinmek için gerektiği kadar bağlantı açabilir.

Kesinlikle gözlemlediğiniz 90 saniye, tarayıcının boş bağlantılar için canlı tutma zaman aşımı süresidir.

İstediğiniz şeyi elde etmek mümkündür, ancak ziyaretçinin yeni olup olmadığını anlama isteğinde kalıcılık çerezinin varlığını da göz önünde bulundurmanız gerektiğinden, bundan biraz daha karmaşıktır.

Ayrıca, genel olarak sunucu başına ortalama bağlantı sayısına güvenmek, ön uç bağlantı sayısına göre daha verimlidir. Bunun nedeni, bir sunucu öldüğünde bu sayıyı yeniden ayarlamanız gerektiğidir. Bunu yapmanın en etkili yolu, kuyruğa almayı etkinleştirmek için bir sunucu maxconn değeri ayarlamak ve sınırın sunuculardaki ortalama kuyruğa alınan istek sayısı için geçerli olması için avg_queue kullanmaktır. Bu, mevcut ziyaretçiler nedeniyle yük arttığında yeni kullanıcıları başka bir arka uca yumuşak bir şekilde taşırken bilinen ziyaretçileri doğru bir şekilde ele almanızı sağlar.


1
Teşekkür ederim teşekkür ederim! Bu çok şey temizledi. Şimdi (diğer şeylerin yanı sıra) hdr_sub (yani, "hdr_sub (çerez) SERVERID = arka uç-001") ile arka uç-çerez kontrol tarafından çalışma var. İşiniz bittiğinde çalışan bir yapılandırma göndereceğim.
Apenootje
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.