Bagaimana kekakuan sesi dicapai di beberapa server web?

23

Berapa banyak server web yang dimiliki StackOverflow / ServerFault?

Jika jawabannya adalah 'lebih dari satu', apakah itu mencapai Session Stickiness saat pemungutan suara DNS?

p.campbell
sumber
Tidak juga, tetapi jika diucapkan secara berbeda itu bisa membuat pertanyaan yang menarik.
Anda harus mengulangi pertanyaannya. Ubah judul menjadi "Bagaimana kekakuan sesi dicapai di beberapa server web?" atau sesuatu seperti itu ...
William Brendel
bisakah Anda membantu saya untuk menunjukkan kepada saya frasa yang tepat?
1
Asumsi bahwa memiliki banyak server menyiratkan sesi lengket - yang merupakan kekejian - menyakitkan saya.
womble

Jawaban:

42

Situs web besar mungkin "memuat keseimbangan" di beberapa mesin. Dalam banyak pengaturan yang seimbang, pengguna dapat menekan salah satu mesin backend selama sesi. Karena itu, sejumlah metode ada untuk memungkinkan banyak mesin berbagi sesi pengguna.

Metode yang dipilih akan tergantung pada gaya penyeimbangan beban yang digunakan, serta ketersediaan / kapasitas penyimpanan backend:

Informasi sesi disimpan hanya dalam cookie : Informasi sesi (bukan hanya pengidentifikasi sesi) disimpan dalam cookie pengguna. Misalnya, cookie pengguna mungkin berisi isi keranjang belanja mereka. Untuk mencegah pengguna merusak data sesi, HMAC dapat diberikan bersama dengan cookie. Metode ini mungkin paling tidak cocok untuk sebagian besar aplikasi:

  • Tidak diperlukan penyimpanan backend
  • Pengguna tidak perlu menekan mesin yang sama setiap kali, sehingga penyeimbangan beban DNS dapat digunakan
  • Tidak ada latensi yang terkait dengan pengambilan informasi sesi dari mesin basis data (seperti yang disediakan dengan permintaan HTTP). Berguna jika situs Anda dimuat dengan seimbang oleh mesin di berbagai benua.
  • Jumlah data yang dapat disimpan dalam sesi terbatas (berdasarkan batas ukuran cookie 4K)
  • Enkripsi harus digunakan jika pengguna tidak dapat melihat konten sesi mereka
  • HMAC (atau yang serupa) harus digunakan untuk mencegah pengguna merusak data sesi
  • Karena data sesi tidak disimpan di sisi server, lebih sulit bagi pengembang untuk melakukan debug

Load balancer selalu mengarahkan pengguna ke mesin yang sama : Banyak penyeimbang muatan dapat mengatur cookie sesi mereka sendiri, yang menunjukkan mesin backend mana yang membuat permintaan dari pengguna, dan mengarahkan mereka ke mesin itu di masa mendatang. Karena pengguna selalu diarahkan ke mesin yang sama, sesi berbagi antara beberapa mesin tidak diperlukan. Ini mungkin baik dalam beberapa situasi:

  • Penanganan sesi aplikasi yang sudah ada mungkin tidak perlu diubah untuk menjadi beberapa mesin yang sadar
  • Tidak diperlukan sistem database bersama (atau serupa) untuk menyimpan sesi, mungkin meningkatkan keandalan, tetapi dengan biaya kompleksitas
  • Mesin backend yang turun akan mencatat semua sesi pengguna yang dimulai dengannya.
  • Mengeluarkan mesin dari servis lebih sulit. Pengguna dengan sesi pada mesin yang akan dihapus untuk pemeliharaan harus diizinkan untuk menyelesaikan tugas mereka, sebelum mesin dimatikan. Untuk mendukung ini, penyeimbang beban web mungkin memiliki fitur untuk "mengalirkan" permintaan ke mesin backend tertentu.

Basis data backend bersama atau penyimpanan kunci / nilai : Informasi sesi disimpan dalam basis data backend, yang semua akses weber memiliki akses ke permintaan dan pembaruan. Browser pengguna menyimpan cookie yang berisi pengidentifikasi (seperti ID sesi), menunjuk ke informasi sesi. Ini mungkin metode paling bersih dari ketiganya:

  • Pengguna tidak perlu terpapar dengan informasi sesi yang disimpan.
  • Pengguna tidak perlu menekan mesin yang sama setiap kali, sehingga penyeimbangan beban DNS dapat digunakan
  • Salah satu kelemahannya adalah bottleneck yang dapat ditempatkan pada sistem penyimpanan backend mana pun yang digunakan.
  • Informasi sesi dapat kedaluwarsa dan didukung secara konsisten.

Secara keseluruhan, sebagian besar aplikasi web yang dinamis melakukan sejumlah permintaan basis data atau permintaan toko kunci / nilai, sehingga basis data atau penyimpanan kunci / nilai adalah lokasi penyimpanan logis dari data sesi.

Tommeh
sumber
2
+1 Jawaban yang cukup komprehensif dan menyelamatkan saya menulisnya. :) Sejauh penyimpanan db, database relasional mungkin adalah hal yang salah. Sesuatu seperti salah satu garpu memcached yang persisten lebih baik. memcachedb mungkin cocok. Anda juga melewatkan replikasi informasi sesi antar server. Ini bukan metode terbaik, tetapi hal-hal seperti kucing jago melakukannya, jadi layak untuk didokumentasikan.
David Pashley
Pendekatan apa yang digunakan oleh Google, Twitter atau Facebook?
Dannyboy
1
Tidak yakin tentang Google, Twitter atau Facebook, tetapi Redis sangat cocok untuk sesi toko. Pada dasarnya David Pashley "memcached gigih" merekomendasikan pada tahun 2009, ketika Redis adalah embrio.
Ben R
4

Jika pertanyaan Anda adalah bagaimana mempertahankan sesi di beberapa server web front-end, maka jawabannya biasanya menggunakan database terpusat. Alih-alih mengandalkan contoh server web untuk melacak file sesi pada sistem file lokal, Anda akan menulis id sesi dan data ke dalam DB pusat, dan semua server web akan mengambil data dari sana sebagai gantinya.

zombat
sumber
+1 untuk menyebutkan basis data terpusat. Hanya untuk memperluas / menyederhanakan ide itu sedikit. Jika Anda menetapkan cookie pada PC pengguna dengan sesuatu yang unik seperti ID pengguna global, Anda kemudian dapat menyimpan GUID itu dalam database. Server apa pun yang disambungkan klien, asalkan mereka memiliki GUID / cookie, Anda dapat melihatnya dengan basis data dan melacak sesi sesuai dengan itu.
KPWINC
2
Menyimpan sesi dalam basis data relasional selalu merupakan ide yang buruk. Anda seharusnya tidak menggunakan database untuk menyimpan data sementara.
David Pashley
2

Menggunakan nemcached tampaknya menjadi solusi yang baik tidak seperti yang disebutkan oleh @ David Pashley

Ini berarti memiliki instance memcached jarak jauh yang dibagikan oleh semua server dan menggunakan ekstensi PECL memcache yang menyediakan pengendali sesi sendiri.

Hanya perlu mengubah dua parameter dalam konfigurasi php!

Berikut ini adalah tutorial yang bagus http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

Tristan
sumber
Tetapi apakah ada beberapa pusat data?
Dannyboy
0

IIRC, di DotNetRocks # 440 mereka mengatakan satu periode server. Tidak tahu apakah itu masih terjadi.

Sunting: Sebenarnya itu adalah Hanselmin # 134 . Maaf.

ongle
sumber
0

Anda dapat mengatur cookie.

Anda dapat menghitung hash IP jarak jauh (pada host jarak jauh yang paling sederhana dan ganjil pergi ke server A, bahkan host bernomor pergi ke server B).

Sepertinya Anda juga dapat melakukannya melalui beberapa nilai yang tetap dengan sistem sumber jika Anda menggunakan terowongan ssl.

Biasanya masing-masing mekanisme di atas memerlukan server "reverse proxy" atau semacam penyeimbang beban. Penyeimbang beban menerima lalu lintas dan kemudian mengarahkannya ke server mana saja yang awalnya memiliki sesi, berdasarkan pada salah satu kriteria di atas.

Namun, saya tidak yakin apa yang Anda maksud dengan "polling DNS"

chris
sumber
0

a) Anda dapat menyimpan informasi sesi dalam cookie pengguna. Lihat cookie yang diperkeras tanpa kewarganegaraan, yang tidak menyimpan data di sisi server, tetapi mempertahankan status sesi http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . b) Anda dapat mengubah penyimpanan backend sesi ke database atau memcached. Untuk menghilangkan satu titik kegagalan, Anda dapat mengatur replikasi basis data atau beberapa simpul yang telah di-cache. Perhatikan, memcached direkomendasikan dalam pengaturan seperti itu di mana kehilangan status pengguna dalam sesi bukanlah kesalahan besar dan tidak membuatnya sangat tidak senang. Untuk kasus-kasus di mana kondisi pengawetan sangat penting, gunakan basis data. Baik PHP, Django dan Rails memungkinkan pengembang untuk menulis backend sesi kustom.

Kristaps
sumber