Birden fazla web sunucusunda oturum yapışkanlığı nasıl sağlanır?


23

StackOverflow / ServerFault'da kaç tane web sunucusu var?

Cevap 'birden fazla' ise, DNS yoklaması yapılırken Session Stickiness'e ulaşır mı?


Gerçekten değil, ama farklı bir şekilde ifade edildiyse ilginç bir soru sorabilirdi.

Soruyu tekrar ifade etmelisin. Başlığı "Birden fazla web sunucusunda oturum yapışkanlığı nasıl elde edilir?" Olarak değiştirin. ya da onun gibi bir şey ...
William Brendel

Bana doğru cümleyi göstermek için bana bir iyilik yapar mısın?

1
Birden fazla sunucuya sahip olduğunun varsayımı, yapışkanlık gerektiren oturumlar anlamına geliyor - ki bu bir istismardır - bana acı veriyor.
womble

Yanıtlar:


42

Büyük web siteleri birden fazla makinede "yük dengeli" olabilir. Yüke duyarlı birçok kurulumda, kullanıcı oturum sırasında herhangi bir arka uç makinesinden birine basabilir. Bu nedenle, birçok makinenin kullanıcı oturumlarını paylaşmasına izin vermek için çeşitli yöntemler vardır.

Seçilen yöntem kullanılan yük dengeleme stiline ve ayrıca arka uç depolamanın kullanılabilirliğine / kapasitesine bağlı olacaktır:

Yalnızca çerezlerde depolanan oturum bilgileri : Oturum bilgileri (yalnızca bir oturum tanımlayıcısı değil) bir kullanıcının çerezinde saklanır. Örneğin, kullanıcının çerezi alışveriş sepetinin içeriğini içerebilir. Kullanıcıların oturum verilerini değiştirmesini önlemek için, çerezle birlikte bir HMAC sağlanabilir. Bu yöntem çoğu uygulama için muhtemelen en az uygundur:

  • Arka uç depolama gerekmez
  • Kullanıcının her seferinde aynı makineye vurması gerekmez, böylece DNS yük dengelemesi kullanılabilir
  • Bir veritabanı makinesinden oturum bilgisini almakla ilgili gecikme yoktur (HTTP isteğinde olduğu gibi). Siteniz farklı kıtalardaki makineler tarafından yük dengeli ise faydalıdır.
  • Oturumda saklanabilecek veri miktarı sınırlıdır (4K çerez boyutu sınırı ile)
  • Bir kullanıcının oturumunun içeriğini görmemesi gerekiyorsa şifreleme kullanılmalıdır.
  • Oturum verilerinin kullanıcının tahrifatını önlemek için HMAC (veya benzeri) kullanılmalıdır
  • Oturum verileri sunucu tarafında saklanmadığından, geliştiricilerin hata ayıklaması daha zor

Yük dengeleyici her zaman kullanıcıyı aynı makineye yönlendirir : Birçok yük dengeleyici, bir kullanıcının hangi arka uç makinesinden istek alacağını belirten kendi oturum çerezlerini ayarlayabilir ve gelecekte bu makineye yönlendirebilir. Kullanıcı her zaman aynı makineye yönlendirildiği için, birden fazla makine arasında oturum paylaşımı gerekli değildir. Bu, bazı durumlarda iyi olabilir:

  • Mevcut bir uygulamanın oturum işleme işleminin, birden çok makinenin farkında olması için değiştirilmesi gerekmeyebilir
  • Oturumları depolamak için ortak bir veritabanı sistemi (veya benzeri) gerekli değildir, muhtemelen güvenilirliği arttırır, ancak karmaşıklık pahasına
  • Aşağı giden bir arka uç makinesi, üzerinde başlatılmış olan kullanıcı oturumlarını indirecektir.
  • Makineleri hizmet dışı bırakmak daha zor. Bir makine üzerinde bakım nedeniyle kaldırılması gereken oturumları olan kullanıcıların, makine kapatılmadan önce görevlerini tamamlamalarına izin verilmelidir. Bunu desteklemek için, ağ yükü dengeleyicileri, belirli bir arka uç makinesine istekleri "boşaltma" özelliğine sahip olabilir.

Paylaşılan arka uç veritabanı veya anahtar / değer deposu : Oturum bilgileri, tüm web sunucularının sorgulama ve güncelleştirmeye erişimi olan bir arka uç veritabanında depolanır. Kullanıcının tarayıcısı, oturum bilgisine işaret eden bir tanımlayıcı (oturum kimliği gibi) içeren bir çerezi saklar. Bu muhtemelen üçünün en temiz yöntemi:

  • Kullanıcının asla depolanan oturum bilgisine maruz kalmasına gerek yoktur.
  • Kullanıcının her seferinde aynı makineye vurması gerekmez, böylece DNS yük dengelemesi kullanılabilir
  • Bir dezavantaj, hangi arka uç depolama sisteminin kullanıldığı üzerine yerleştirilebilecek darboğazdır.
  • Oturum bilgilerinin süresi dolmuş ve yedeklenmiş olabilir.

Genel olarak, dinamik web uygulamalarının çoğu, birkaç veritabanı sorgusu veya anahtar / değer deposu isteğinde bulunur; bu nedenle veritabanı veya anahtar / değer deposu, oturum verilerinin mantıksal depo yeridir.


2
+1 Oldukça kapsamlı cevaplar ve yazarken beni kurtarıyor. :) db depolama devam ederken, ilişkisel bir veritabanı muhtemelen yanlış bir şey. Kalıcı memcacted çatallardan biri gibi bir şey daha iyidir. memcachedb uygun olabilir. Sunucular arasında oturum bilgilerini çoğaltmayı da kaçırdınız. Bu en iyi yöntem değil ama Tomcat gibi şeyler bunu belgeliyor.
David Pashley

Hangi yaklaşım Google, Twitter veya Facebook tarafından kullanılıyor?
Dannyboy

1
Google, Twitter veya Facebook hakkında emin değilim, ancak Redis bir oturum mağazası için çok uygun. Temelde "ısrarlı memcached" David Pashley 2009'da Redis'in embriyonik olduğu zamanları önerdi.
Ben R

4

Sorunuz birden fazla ön uç web sunucusunda oturumları nasıl koruyacağınızsa, yanıt genellikle merkezi bir veritabanı kullanmaktır. Yerel dosya sistemlerinde oturum dosyalarını izlemek için web sunucusu örneklerine güvenmek yerine, oturum kimliklerini ve verilerini merkezi bir DB'ye yazarsınız ve tüm web sunucuları bunun yerine verileri alır.


Centalized veritabanı bahsettiğim için +1. Sadece bu fikri biraz genişletmek / basitleştirmek için. Bir kullanıcının PC'sine bir genel kullanıcı kimliği gibi benzersiz bir şey içeren bir çerez ayarlarsanız, bu GUID'i bir veritabanında saklayabilirsiniz. Bir istemcinin hangi sunucuya bağlanacağı önemli değildir, GUID / çerezleri olduğu sürece, bunları veritabanında arayabilir ve oturumu buna göre takip edebilirsiniz.
KPWINC

2
Oturumları ilişkisel bir veritabanında saklamak her zaman kötü bir fikirdir. Geçici verileri depolamak için veritabanlarını kullanmamalısınız.
David Pashley

2

Nemcached kullanımı @David Pashley tarafından bahsedildiği gibi değil iyi bir çözüm gibi görünüyor

Tüm sunucular tarafından paylaşılan uzak bir memcached örneğinin olması ve kendi oturum işleyicisini sağlayan memcache PECL uzantısının kullanılması anlamına gelir.

Sadece php yapılandırmasında iki parametre değiştirmek gerekiyor!

İşte güzel bir ders http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/


Fakat çoklu veri merkezi nedir?
Dannyboy


0

Bir çerez ayarlayabilirsiniz.

Uzak IP'nin bir karmasını hesaplayabilirsiniz (en basitinde, tek sayılı uzaktaki ana bilgisayarlar A sunucusuna, numaralandırılmış ana bilgisayarlar bile B sunucusuna gider).

Bir ssl tüneli kullanıyorsanız, kaynak sistemde kalan bazı değerler aracılığıyla da yapabilirsiniz.

Tipik olarak yukarıdaki mekanizmaların her biri bir "ters proxy" sunucusu veya bir çeşit yük dengeleyici gerektirir. Bu yük dengeleyici trafiği kabul eder ve daha sonra yukarıdaki kriterlerden birine dayanarak ilk olarak oturumu gerçekleştiren sunucuyu yönlendirir.

"DNS yoklama" derken neyi kastettiğinizden emin değilim.


0

a) Oturum bilgilerini kullanıcı çerezinde saklayabilirsiniz. Depolayan yok sunucu tarafında veri, ancak korur Oturum durumu vatansız sertleştirilmiş çerezleri Bakınız http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . b) Oturum arka uç depolamasını veritabanına veya memcached olarak değiştirebilirsiniz. Tek bir başarısızlık noktasını ortadan kaldırmak için, veritabanı çoğaltmasını veya birden çok memcached düğümü ayarlayabilirsiniz. Unutmayın, memcached, oturum sırasında kullanıcı durumunu kaybetmenin büyük bir hata olmadığı ve onu çok mutsuz etmediği kurulumlarda önerilmektedir. Koruma halinin hayati olduğu durumlarda, veritabanlarını kullanın. Hem PHP, Django hem de Rails geliştiricinin özel oturum arka ucu yazmasına izin verir.

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.