haproxy: bagaimana menyiapkan pemeliharaan server tanpa menendang sesi aplikasi?

13

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?

Christophe Drevet-Droguet
sumber
Apakah server Anda berjalan dalam mode HTTP atau mode TCP?
Australia
1
@ Australia; Kemungkinan mode http melihat bagaimana dia berbicara tentang keseimbangan dan ketahanan berdasarkan cookie (mode TCP tidak menawarkan fitur seperti itu).
GregL
@Christophe, sudahkah Anda benar-benar mencoba konfigurasi yang dijelaskan di bagian 'haproxy behaviour' Anda, karena seharusnya berhasil.
GregL
@RegL, benar, itulah yang saya pikirkan juga. Jika dia menggunakan mode HTTP dan hanya mengatur server ke mode pemeliharaan, maka itu akan berhenti menerima sesi baru tetapi tetap mempertahankan sesi yang valid sampai berakhir. Anda masih dapat memiliki cookie, dll. Dalam mode TCP, tetapi kemudian itu tidak akan berarti apa-apa untuk HAProxy.
austinian
@ Christophe, apakah Anda mencoba menggunakan "cara yang lebih pintar" untuk mempersingkat waktu perawatan Anda, atau hanya mencari cara untuk mengakhiri sesi dengan anggun sementara Anda menunggu untuk melakukan pemeliharaan?
austinian

Jawaban:

6

Masukkan server dalam mode tiriskan menggunakan antarmuka manajemen web. Itu memberikan fungsionalitas tepat yang Anda cari.

Australia
sumber
3
Jika Anda menetapkan ke Maint, itu akan menghentikan pengiriman setiap lalu lintas untuk itu, seperti diuraikan di sini . Alih-alih, ia ingin memasukkannya ke mode Pengurasan, dan menggunakan stick-tablekadaluwarsa untuk memberikan ketekunan.
GregL
@GregL, oops, perbaiki sekarang
austinianus
Terima kasih atas jawaban Anda, Australia dan @GredL. Saya akan mencobanya. Bagian yang sulit adalah dengan tongkat-meja, saya pikir. Saya harus menemukan cara untuk menyimpan setiap klien dengan cookie yang disetel ke server mode tiriskan di stick-table ini.
Christophe Drevet-Droguet
Yah, sepertinya mode tiriskan sudah cukup dalam kasus saya, sesi yang sudah memiliki set cookie masih menggunakan server yang dikuras, dan sesi baru diarahkan ke server lain.
Christophe Drevet-Droguet
1
Bagaimana Anda mengubah mode di antarmuka web? Tampaknya hanya informasi.
kagronick
9

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 :)

Jhonatan Alarcon
sumber
1

Cara lain

menyinkronkan file sesi antar server (perlu cara untuk menyinkronkan file antara beberapa server, atau titik mount tunggal yang umum)

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 :)

Kekacauan
sumber
Walaupun itu akan menjadi cara yang lebih baik, saya pikir itu membutuhkan perubahan kode. Jadi saya akan menggunakan jawaban Australia, dan GregL, untuk aplikasi kami saat ini yang tidak menyinkronkan sesi.
Christophe Drevet-Droguet
Jika kode Anda tidak menetapkan pengendali sesi khusus, maka Anda tidak perlu mengubah kode apa pun untuk PHP untuk menggunakan memcache untuk sesi. Semuanya dikonfigurasi dalam php.ini, bukan dalam kode.
Cha0s
OK, Cha0s, aku akan melihatnya.
Christophe Drevet-Droguet