Masalah
Saya menggunakan haproxy untuk memuat server web keseimbangan. Saya menggunakan kegigihan sesi dengan cookie tambahan karena beberapa aplikasi menggunakan file sesi dan ini tidak disinkronkan antara server.
Saya ingin menonaktifkan server untuk pemeliharaan, tetapi tanpa merusak sesi. Jadi saya ingin mengizinkan klien yang sudah ada untuk melanjutkan sesi aplikasi mereka, tetapi tidak menerima klien baru.
perilaku haproxy
- Saya mengatur server untuk "pergi ke pemeliharaan"
- jika klien memiliki set cookie, gunakan server bahkan jika ditandai sebagai "pergi ke pemeliharaan"
- jika klien baru (tanpa cookie) datang, diarahkan ke server lain
- setelah semua klien mengakhiri sesi aplikasi mereka, tidak ada lagi klien yang akan mengatur cookie ke server khusus ini, dan saya akan baik untuk mematikannya tanpa gangguan pengguna.
Apakah Anda pikir ini dapat dicapai dengan beberapa konfigurasi haproxy? Atau adakah cara cerdas untuk melakukannya?
Cara lain
Daftar lengkap cara lain untuk mencapai kebutuhan ini:
- menyinkronkan file sesi antar server (perlu cara untuk menyinkronkan file antara beberapa server, atau titik mount tunggal yang umum)
- menggunakan database untuk menyimpan informasi sesi (perlu mengubah perilaku aplikasi)
Keterangan lebih lanjut
Saya menggunakan konfigurasi seperti ini:
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
Jika saya menonaktifkan SRV1 (dengan perintah haproxy cli), saya pikir semua sesi aplikasi yang dibuka pada SRV1 akan rusak setelah akhir "sesi" HTTP saat ini. Apakah itu benar?
sumber
Jawaban:
Masukkan server dalam mode tiriskan menggunakan antarmuka manajemen web. Itu memberikan fungsionalitas tepat yang Anda cari.
sumber
stick-table
kadaluwarsa untuk memberikan ketekunan.Jika Anda menggunakan socat untuk berkomunikasi dengan konfigurasi haproxy Anda, Anda dapat membuat server dalam keadaan terkuras dengan cara berikut:
echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock
Lebih banyak perintah di sini ! Untuk menginstal socat di Ubuntu buka jawaban ini
Saya mengujinya dengan versi haproxy 1.6.3 :)
sumber
Jika server backend Anda menggunakan PHP untuk aplikasi, Anda dapat menggunakan Memcache untuk menyinkronkan sesi di antara mereka.
Juga Couchbase-Server dapat melakukan replikasi memcache keluar dari kotak.
Tentu saja itu agak berlebihan untuk menggunakan couchbase-server hanya untuk replikasi sesi :)
sumber