haproxy: uygulama oturumlarını tekmelemeden sunucu bakımı nasıl hazırlanır?


13

Sorun

Denge web sunucularını yüklemek için haproxy kullanıyorum. Bazı uygulamalar oturum dosyalarını kullandığından ve bunlar sunucular arasında senkronize edilmediğinden oturum çerezlerini ek çerezlerle birlikte kullanıyorum.

Sunucuyu bakım için, ancak oturumları kesmeden devre dışı bırakmak istiyorum. Bu nedenle mevcut istemcilerin uygulama oturumlarına devam etmelerine izin vermek istiyorum, ancak yeni istemcileri kabul etmiyorum.

alkoksi davranışı

  • Bir sunucuyu "bakıma" ayarladım
  • bir istemcinin çerez seti varsa, "bakıma gidiyor" olarak işaretlenmiş olsa bile sunucuyu kullanın
  • yeni bir istemci (çerez olmadan) gelirse, başka bir sunucuya yönlendirilir
  • tüm istemciler uygulama oturumlarını bitirdikten sonra, artık hiçbir istemci bu özel sunucuya çerez ayarlayamazdı ve ben kullanıcı kesintisi olmadan kapatmak iyi olurdu.

Bunun bazı haproksi yapılandırmalarıyla gerçekleştirilebileceğini düşünüyor musunuz? Yoksa bunu yapmanın akıllıca bir yolu var mı?

Diğer yollar

Bu ihtiyacı karşılamanın diğer yollarının kapsamlı olmayan listesi:

  • oturum dosyalarını sunucular arasında senkronize etme (dosyaları birkaç sunucu arasında senkronize etmenin bir yolu veya ortak bir tek bağlama noktası gerekir)
  • oturum bilgilerini depolamak için veritabanını kullan (uygulama davranışını değiştirmesi gerekir)

Daha fazla detay

Bu tür bir yapılandırma kullanıyorum:

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

SRV1'i (haproxy cli komutuyla) devre dışı bırakırsam, SRV1'de açılan tüm uygulama oturumlarının geçerli HTTP "oturumu" nun bitmesinden sonra kesileceğini düşünüyorum. Bu doğru mu?


Sunucunuz HTTP modunda mı yoksa TCP modunda mı çalışıyor?
austinian

1
@austinian; Muhtemelen http modu, çerezlere dayalı dengeleme ve kalıcılıktan nasıl bahsettiğini görüyor (TCP modu bu özellikleri sunmuyor).
GregL

@Christophe, 'haproxy davranışı' bölümünde açıklanan yapılandırmayı gerçekten denediniz mi, çünkü çalışması gerekir.
GregL

@GregL, doğru, ben de öyle düşünüyorum. HTTP modunu kullanıyorsa ve sunucuyu bakım moduna geçirirse, yeni oturumları kabul etmeyi durdurur ancak süresi dolana kadar geçerli oturumları canlı tutar. TCP modunda hala çerezler vb. Olabilir, ancak bu HAProxy için bir şey ifade etmez.
austinian

@Christophe, bakım sürenizi kısaltmak için "daha akıllıca bir yol" mu kullanmaya çalışıyorsunuz, yoksa yalnızca bakım yapmak için beklerken oturumların zarif bir şekilde bitmesini sağlayacak bir yol mu arıyorsunuz?
austinian

Yanıtlar:


6

Web yönetimi arayüzünü kullanarak sunucuyu boşaltma moduna alın. Bu, tam olarak aradığınız işlevselliği sağlar.


3
Eğer Maint olarak ayarlayın, göndermeyi durduracak herhangi belirtildiği gibi, buna trafiği burada . Aksine, Boşaltma moduna sokmak ve stick-tablekalıcılık sağlamak için bir son kullanma tarihi olan bir kullanmak istiyordu.
GregL

@GregL, ayy, şimdi sabitleme
avusturya

Cevabınız için teşekkürler, Avustralyalı ve @GredL. Bunu deneyeceğim. Zor kısım sopa masasında olacak sanırım. Her müşteriyi bu sopa tablosundaki boşaltma modu sunucusuna çerez ayarlanmış olarak saklamanın bir yolunu bulmam gerekecek.
Christophe Drevet-Droguet

Benim durumumda drenaj modunun yeterli olduğu anlaşılıyor, zaten çerez seti olan oturumlar hala boşaltılmış sunucuyu kullanıyor ve yeni oturumlar diğer sunuculara yönlendiriliyor.
Christophe Drevet-Droguet

1
Web arayüzündeki modları nasıl değiştirirsiniz? Sadece bilgi amaçlı görünüyor.
kagronick

9

Eğer kullanırsanız SoCat sizin HAProxy yapılandırmaları ile iletişim için, aşağıdaki şekilde tahliye durumunda bir sunucu koyabilirsiniz:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

Burada daha fazla komut ! Ubuntu'da socat yüklemek için bu cevaba gidin

Bunu haproxy 1.6.3 sürümü ile test ediyorum :)


1

Diğer yollar

oturum dosyalarını sunucular arasında senkronize etme (dosyaları birkaç sunucu arasında senkronize etmenin bir yolu veya ortak bir tek bağlama noktası gerekir)

Arka uç sunucularınız uygulamalar için PHP kullanıyorsa, oturumlar arasında senkronize etmek için Memcache kullanabilirsiniz.

Ayrıca Couchbase-Server kutunun dışında memcache çoğaltma yapabilir.
Tabii ki sadece oturum çoğaltması için couchbase-server kullanmak biraz aşırıya kaçıyor :)


Daha iyi bir yol olsa da, kod değişikliklerine ihtiyaç duyduğunu düşünüyorum. Bu yüzden, oturumları senkronize etmeyen mevcut uygulamalarımız için Avustralyalı ve GregL'yi yanıtlayacağım.
Christophe Drevet-Droguet

Kodunuz özel bir oturum işleyicisi ayarlamazsa, PHP'nin oturumlar için memcache kullanması için herhangi bir kodu değiştirmeniz gerekmez. Her şey kodda değil, php.ini içinde yapılandırılmıştır.
Cha0s

Tamam, Cha0s, buna bakacağım.
Christophe Drevet-Droguet
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.