Sesi lengket dan NON-Lengket

255

Saya ingin tahu perbedaan antara sesi sticky dan non-sticky. Apa yang saya pahami setelah membaca dari internet:

Sticky : hanya objek sesi tunggal yang ada di sana.

Sesi tidak lengket : objek sesi untuk setiap node server

Sunny Gupta
sumber

Jawaban:

612

Ketika situs web Anda dilayani oleh hanya satu server web, untuk setiap pasangan klien-server, objek sesi dibuat dan tetap berada dalam memori server web. Semua permintaan dari klien pergi ke server web ini dan memperbarui objek sesi ini. Jika beberapa data perlu disimpan dalam objek sesi selama periode interaksi, itu disimpan dalam objek sesi ini dan tetap di sana selama sesi ada.

Namun, jika situs web Anda dilayani oleh beberapa server web yang berada di belakang load balancer, load balancer memutuskan server web aktual (fisik) mana yang harus dimintai masing-masing. Misalnya, jika ada 3 server web A, B dan C di belakang load balancer, ada kemungkinan www.mywebsite.com/index.jsp dilayani dari server A, www.mywebsite.com/login.jsp dilayani dari server B dan www.mywebsite.com/accoutdetails.php dilayani dari server C.

Sekarang, jika permintaan dilayani dari (secara fisik) 3 server yang berbeda, masing-masing server telah membuat objek sesi untuk Anda dan karena objek sesi ini duduk di tiga kotak independen, tidak ada cara langsung untuk mengetahui apa yang ada di objek sesi dari yang lain. Untuk menyinkronkan antara sesi server ini, Anda mungkin harus menulis / membaca data sesi ke dalam lapisan yang umum untuk semua - seperti DB. Sekarang menulis dan membaca data ke / dari db untuk kasus penggunaan ini mungkin bukan ide yang baik. Sekarang, inilah peran sesi-lengket .

Jika penyeimbang beban diinstruksikan untuk menggunakan sesi tempel, semua interaksi Anda akan terjadi dengan server fisik yang sama, meskipun ada server lain. Dengan demikian, objek sesi Anda akan sama sepanjang seluruh interaksi Anda dengan situs web ini.

Untuk meringkas, Dalam kasus Sesi Sticky, semua permintaan Anda akan diarahkan ke server web fisik yang sama sementara dalam kasus loadbalancer non-lengket dapat memilih server web apa pun untuk melayani permintaan Anda.

Sebagai contoh, Anda dapat membaca tentang Elastic Load Balancer dan sesi tempel di sini: http://aws.typepad.com/aws/2010/04/new-elastic-load-balancing-feature-sticky-sessions.html

TJ-
sumber
4
@ TJ- apa yang akan terjadi jika satu simpul tidak tersedia?
gstackoverflow
20
Dalam sebagian besar kasus, sesi akan hilang. Dalam hal AWS ESB Jika instance gagal atau menjadi tidak sehat, penyeimbang beban menghentikan permintaan routing ke instance tersebut, sebagai gantinya memilih instance sehat baru berdasarkan pada algoritma balancing beban yang ada. Load balancer memperlakukan sesi seperti sekarang "macet" ke instance sehat baru, dan terus merutekan permintaan ke instance tersebut bahkan jika instance gagal kembali.
TJ-
8
Menurut informasi apa yang membuat LoadBalancer sesi HTTP lengket? Terutama pada koneksi HTTPS masalah ini menjadi menarik. Apakah Anda memberi makan LB dengan kunci pribadi server web, sehingga dapat memutuskan koneksi SSL dan mengambil sesi HTTP? Atau apakah LB hanya memanfaatkan alamat IP klien? Dalam hal ini, bagaimana dengan server proxy di mana banyak klien menggunakan alamat IP yang sama? Atau bahkan lebih buruk, klien seluler, di mana alamat IP sering berubah? Atau adakah teknik yang lebih baik untuk itu? Terima kasih
g000ze
6
Ya, Anda benar sekali. Untuk menggunakan header "x-forwarded-for" atau cookie lengket dalam konteks ini, Pemutusan SSL perlu digunakan dan karenanya, permintaan harus didekripsi di LB.
TJ-
4
@ g000ze Ketika berhadapan dengan aplikasi yang tidak dilayani langsung ke internet, saya percaya itu umum untuk mengaktifkan TLS hanya pada server proxy terluar. (Sebuah penyeimbang beban dapat dianggap, mungkin secara sederhana, sebagai jenis khusus dari server proxy, yang dapat meneruskan permintaan ke salah satu dari beberapa server.) Lalu lintas antara penyeimbang beban dan server lain akan terjadi pada jaringan aman lokal , dan karena itu sering kali tidak perlu mengenkripsi, atau jika perlu dienkripsi, sertifikat yang ditandatangani sendiri dapat mencukupi (karena proxy dapat dikonfigurasi untuk mempercayainya).
jpmc26
106

Saya telah membuat jawaban dengan beberapa perincian lebih lanjut di sini: https://stackoverflow.com/a/11045462/592477

Atau Anda bisa membacanya di sana ==>

Ketika Anda menggunakan loadbalancing, itu artinya Anda memiliki beberapa instance kucing jantan dan Anda perlu membagi beban.

  • Jika Anda menggunakan replikasi sesi tanpa sesi lengket: Bayangkan Anda hanya memiliki satu pengguna menggunakan aplikasi web Anda, dan Anda memiliki 3 contoh kucing jantan. Pengguna ini mengirimkan beberapa permintaan ke aplikasi Anda, kemudian loadbalancer akan mengirimkan beberapa permintaan ini ke instance kucing jantan pertama, dan mengirim beberapa permintaan lainnya ke instance kedua, dan lainnya ke yang ketiga.
  • Jika Anda menggunakan sesi lengket tanpa replikasi:Bayangkan Anda hanya memiliki satu pengguna menggunakan aplikasi web Anda, dan Anda memiliki 3 instance kucing jantan. Pengguna ini mengirimkan beberapa permintaan ke aplikasi Anda, kemudian loadbalancer akan mengirimkan permintaan pengguna pertama ke salah satu dari tiga instance kucing jantan, dan semua permintaan lain yang dikirim oleh pengguna ini selama sesi akan dikirim ke instance kucing jantan yang sama. Selama permintaan ini, jika Anda mematikan atau memulai kembali instance tomcat ini (instance tomcat yang digunakan) loadbalancer mengirimkan permintaan yang tersisa ke satu instance tomcat lain yang masih berjalan, TAPI karena Anda tidak menggunakan replikasi sesi, instance tomcat yang menerima permintaan yang tersisa tidak memiliki salinan sesi pengguna kemudian untuk kucing jantan ini pengguna memulai sesi: pengguna kehilangan sesi dan terputus dari aplikasi web meskipun aplikasi web masih berjalan.
  • Jika Anda menggunakan sesi lengket DENGAN replikasi sesi:Bayangkan Anda hanya memiliki satu pengguna menggunakan aplikasi web Anda, dan Anda memiliki 3 instance kucing jantan. Pengguna ini mengirimkan beberapa permintaan ke aplikasi Anda, kemudian loadbalancer akan mengirimkan permintaan pengguna pertama ke salah satu dari tiga instance kucing jantan, dan semua permintaan lain yang dikirim oleh pengguna ini selama sesi akan dikirim ke instance kucing jantan yang sama. Selama permintaan ini, jika Anda mematikan atau memulai kembali instance tomcat ini (instance tomcat yang digunakan) loadbalancer mengirimkan permintaan yang tersisa ke satu instance tomcat lain yang masih berjalan, saat Anda menggunakan replikasi sesi, instance tomcat yang menerima permintaan yang tersisa memiliki salinan sesi pengguna kemudian pengguna melanjutkan sesi: pengguna terus menelusuri aplikasi web Anda tanpa terputus, shutdown instance tomcat tidak memengaruhi navigasi pengguna.
Nico
sumber
8
Hmm .. membaca ini saya bertanya-tanya: tidakkah masuk akal memiliki pilihan keempat: Non-Sticky WITH replikasi sesi? Atau dengan kata lain: apa untungnya memiliki sesi lengket jika seseorang mereplikasi sesi ke instance yang berbeda pula? Maksud saya, jika Anda mereplikasi sesi di seluruh instance, Anda bisa meneruskan permintaan ke server mana pun juga, bukan? Apa yang saya lewatkan?
dingalapadum
@dingalapadum Anda benar, secara teori Anda dapat memiliki replikasi sesi tanpa lengket-sesi. Tetapi dalam kasus cluster besar itu buruk untuk kinerja jaringan. Lalu ada beberapa strategi dalam menggunakan replikasi sesi dengan sesi lengket seperti ini di tomcat ( tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html ) adalah dengan meletakkan sesi sticky dan hanya satu replika (satu simpul di sini) disebut manajer cadangan yang menyimpan semua replikasi sesi simpul).
Nico
Kemudian sesi sticky memungkinkan Anda untuk hanya memiliki satu replika sesi, yang terbaik di cluster besar.
Nico
2
Ah saya mengerti - Jika saya mengerti dengan benar, maksud Anda mereplikasi semua sesi di seluruh cluster akan membanjiri cluster secara internal - Saya melihat masalahnya. Oh, dan sekarang melihat jawaban Anda lebih dekat, saya hanya melihat, bahwa ini sebenarnya adalah kasus pertama yang Anda jelaskan ... 'duh aku' ..
dingalapadum
@dingalapadum pertanyaan Anda dipersilahkan, ini memungkinkan untuk meningkatkan jawabannya
Nico