Oturumları daha verimli bir şekilde paylaşmak için bir havuz memcache kuyuları kullanılabilir mi?


25

1 web sunucusu kurulumundan iki web sunucusu kurulumuna geçiyoruz ve PHP oturumlarını yük dengeli iki makine arasında paylaşmaya başlamalıyım. Zaten yüklü memcached ( ve başladı ) ve bu yüzden php.inidosyadaki sadece 3 satırı değiştirerek yeni sunucular arasında oturumları paylaşmayı başarabildiğim için şaşırdım. ( Session.save_handler ve session.save_path ):

Ben değiştirdim:

session.save_handler = files

ile:

session.save_handler = memcache

Sonra ana web sunucusu üzerinde session.save_pathlocalhost'a işaret ettim :

session.save_path="tcp://localhost:11211"

ve köle web sunucusu üzerinde session.save_pathana noktaya işaret ettim :

session.save_path="tcp://192.168.0.1:11211"

İş bitti, test ettim ve çalışıyor. Fakat...

Açıkçası memcache kullanmak, oturumların RAM'da olduğu ve bir makine yeniden başlatıldığında veya memcache arka planının çökmesi durumunda kaybolacağı anlamına geliyor - bu konuda biraz endişeliyim ancak iki web sunucusu arasındaki ağ trafiği hakkında biraz daha endişeliyim (özellikle ölçekleniriz) çünkü ne zaman bir kimse köle web sunucusuna yükü dengeli olursa, oturumları ağ üzerinden ana web sunucusundan alınacaktır. save_pathsŞebekeyi kullanmadan önce makinelerin kendi oturum depolarına bakmaları için iki tanesini tanımlayabiliyor muydum diye merak ediyordum . Örneğin:

usta:

session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"

Köle:

session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"

Bu, başarılı bir şekilde sunuculardaki oturumları paylaşır VE performansa yardımcı olur mu? yani, ağ trafiğinden% 50 oranında tasarruf edin. Yoksa bu teknik sadece başarısız olanlar için mi? (Örneğin, bir memcache arka planının erişilemediğinde)?

Not : Gerçekten de özellikle memcache replikasyonuyla ilgili bir soru sormuyorum - PHP memcache istemcisinin bir havuzdaki her memcache arka planının içinde zirve yapıp yapamayacağı, bir tane bulursa bir seans döndürüp bir tane bulamazsa sadece yeni bir oturum oluşturabileceği hakkında daha fazla bilgi tüm mağazalarda. Bunu yazarken PHP'den biraz şey sorduğumu düşünüyorum, lol ...

Varsayın : Yapışkan oturum yok, yuvarlak robin yük dengeleme, LAMP sunucuları.


1
Memcache dokümantasyonu, oturum depolaması için Memcache kullanılmasını önermez. Bkz code.google.com/p/memcached/wiki/... !

Yanıtlar:


37

Feragatname: Tonlarca test yapmadan ve kalifiye birinden ikinci bir fikir edinmeden beni dinlemek çok kızardı - Bu oyunda yeniyim .

Bu soruda önerilen verimlilik geliştirme fikri işe yaramayacak. Yaptığım en büyük hata memcached depolarının havuzda tanımlanma sırasının bir tür öncelik belirlediğini düşünmekti. Bu böyle değil . Ezilmiş bir zindan havuzu (örneğin, kullanma session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211") tanımladığınızda, hangi mağazanın kullanılacağını bilemezsiniz. Veriler eşit olarak dağıtılır, yani bir öğenin ilk önce depolanabileceği veya sonuncusu olabileceği anlamına gelir (veya memcache istemcisi çoğaltılacak şekilde yapılandırılmışsa her ikisi de olabilir - notu çoğaltmayı işleyen istemci olduğunu unutmayın, memcached sunucusu kendisi yapmayın). Her iki durumda da localhost'u havuzda ilk kullanmanın performansı artırmayacağı anlamına gelecektir - her iki mağazada da% 50 şansa sahip olma şansı var.

Biraz test ve araştırma yaptıktan sonra memcache kullanarak sunucular arasında oturumları paylaşabileceğinizi düşündüm, ancak muhtemelen istemeyeceksiniz - bu bir popüler gibi görünmüyor çünkü paylaşılan bir kullanmanın yanı sıra ölçeklemiyor Bu veritabanında sağlam değil. Daha fazla bilgi edinebilmek için bu konuda geri bildirimde bulunmak isterim ...

Bir PHP uygulamanız yoksa, aşağıdakileri dikkate almayın:


1. İpucu: Memcache kullanarak oturumları 2 sunucuda paylaşmak istiyorsanız:

PHP memcache istemcisini kurduğunuzda "Aşağıdaki memcache oturumu işleyicisi desteğini etkinleştirilsin mi? " Seçeneğini Evet olarak işaretlediğinizden emin olun ve dosyanızı aşağıdakilere ekleyin :/etc/php.d/memcache.ini

session.save_handler = memcache

Web sunucusu 1'de (IP: 192.168.0.1):

session.save_path="tcp://192.168.0.1:11211"

Web sunucusu 2'de (IP: 192.168.0.2):

session.save_path="tcp://192.168.0.1:11211"

2. İpucu: Oturumu memcache kullanarak VE 2 yerine çalışma desteği olan 2 sunucuda paylaşmak istiyorsanız:

Aşağıdakileri /etc/php.d/memcache.inidosyanıza ekleyin :

memcache.hash_strategy = consistent
memcache.allow_failover = 1

Web sunucusu 1'de (IP: 192.168.0.1):

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

Web sunucusu 2'de (IP: 192.168.0.2):

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

Notlar:

  • Bu, orijinal soruda yaptığım başka bir hatayı vurgular - session.save_pathtüm sunucularda aynı kullanmıyordum .
  • Bu durumda "yerine çalışma", bir memcache arka plan programının başarısız olması durumunda, PHP memcache istemcisinin diğerini kullanmaya başlayacağı anlamına gelir. yani, mağazada oturumu başarısız olan herhangi biri oturumunu kapatmış olacak. Şeffaf yerine çalışma değil.

3. İpucu: Seansları memcache kullanarak paylaşmak istiyorsanız VE şeffaf yük devretme desteğine sahipseniz:

Aşağıdakileri 2'ye eklemeniz dışında, ipucu 2 ile aynı /etc/php.d/memcache.ini:

memcache.session_redundancy=2

Notlar:

  • Bu, PHP memcache istemcisinin oturumları 2 sunucuya yazmasını sağlar. Sen yazma n aynalar gönderildi ve başarısız öyleki (RAID-1 gibi) fazlalık olsun get'saynalara yeniden denenir. Bu, bir memcache arka plan arızası durumunda, kullanıcıların oturumlarını kaybetmemeleri anlamına gelecektir.
  • Yansıtılmış yazma işlemleri paralel olarak yapılır (blokaj yapmayan IO kullanarak), böylece hız performansı ayna sayısı arttıkça düşmemelidir. Ancak, memcache aynalarınız farklı makinelere dağıtılmışsa ağ trafiği artacaktır. Örneğin, localhost kullanma ve ağ erişiminden kaçınma artık% 50 şansı yok.
    • Görünüşe göre, yazma çoğaltmasındaki gecikme, önbellek eksikliği yerine eski verilerin alınmasına neden olabilir. Soru bunun uygulamanız için önemli olup olmadığıdır? Ne kadar sıklıkla oturum verisi yazıyorsunuz?
  • memcache.session_redundancyoturum artıklığı içindir, ancak memcache.redundancyfarklı bir yedeklilik düzeyine sahip olmak istiyorsanız, PHP uygulama kodunuz tarafından kullanılabilecek bir ini seçeneği de vardır .
  • PHP memcache istemcisinin yeni bir sürümüne (halen beta sürümünde) ihtiyacınız var - pecl'den 3.0.3 sürümü benim için çalıştı.

"Paylaşılan bir veritabanını kullanmanın yanı sıra ölçeklenemiyor" hakkında yorum yapabilir misiniz? Tipik bir master-slave DB kurulumundan ne kadar farklı olduğunu anlamıyorum. Teşekkürler!
Çocuk Baukema

Bu oldukça havalı bir dağılım olsa da, ext/memcache3.x versiyonunu kullandığınızda beklendiği gibi çalışmadığına dair söylentiler (aka hata raporları) mevcut . Biz de bu seçenekle oynuyoruz ve sunucu listesinde dolaşmaya ve kendime yazmaya karar verdim.
Till

3. ipucunda: eğer bir memcached ana bilgisayarı aşağı inerse ve sonra ortaya çıkarsa, saniye ana bilgisayarı aşağı iner. anladığım kadarıyla hiçbir oturum verisi geri yüklenmeyecek ve bir kısmı kaybedilecek, değil mi?
GioMac

28

Re: Yukarıdaki 3. İpucu (google üzerinden bununla karşılaşan herkes için), en azından şu an için çalışmanız memcache.session_redundancy = N+1için havuzunuzdaki N sunucular için kullanmanız gerektiği , en azından asgari eşiğin olduğu görünüyor. işe yarayan değer. (Debian ahırda üzerinde php 5.3.3 ile test edilmiştir, pecl Memcache'ı 3.0.6, iki memcached sunucular. session_redundancy=2En kısa zamanda ilk sunucuyu kapalı olarak başarısız olursave_path , session_redundancy=3cezayı çalışır.)

Bu, bu hata raporlarında yakalanmış görünüyor:


1
Yeterince upvote olamaz ..
fest

1
Kaydırdığım için memnunum. Sorun buydu.
Daren Schwenke

Bana göre belli değil, bu özellik sadece PECL memcache 3.x serisinde mevcut mu? Bunların hepsi pecl.php.net/package/memcache adresindeki Beta yazılımında listelenmiştir , oysa 2.2.7'de lideri gördüğüm sunucuyu öldürürsem her şey ölür.
Joe

Dürüst olmak gerekirse, buna baktığımdan beri yıllar geçti. Hatırladığım kadarıyla, bir 3.x özelliği (icbw) oldu. Bu eklentinin "beta" sürümlerini kullanan pek çok sistemi (bazıları oldukça yoğun trafik) kullandık ve bununla ilgili görünen herhangi bir sorun yaşamadık. YMMV, canlı yayına girmeden önce bir şeyleri test et, vb. :) PHP'de birkaç yıldır çalışmıyorum, bu nedenle trivia'nın bazı ince noktaları solmaya başlıyor.
Michael Jackson,

3

Yukarıda gösterilen php.ini ayarları ile birlikte aşağıdakilerin de ayarlandığından emin olun:

memcache.allow_failover = 1  
memcache.hash_strategy = 'consistent'

Sonra tam yerine çalışma ve müşteri tarafı fazlalık alırsınız. Bu yaklaşıma ilişkin uyarı, memcached eğer localhost'a indirgenmişse, php memcache istemcisi session.save_path içinde belirtilen havuzdaki bir sonraki sunucuyu denemeden önce her zaman bir okuma özniteliği olacaktır.

Bunun, web sunucunuzda çalışan php memcache istemcisinin genel ayarlarını etkilediğini unutmayın.


Her web sunucusunda farklı olduğu consistentdüşünüldüğünde karma stratejinin kullanılması mantıklı geliyor session.save_pathmu?
Tom,

1

memcached bu şekilde çalışmaz (yanılıyorsam lütfen beni düzeltin!)

Uygulamanızın fazla oturum oturumu depolaması olmasını istiyorsanız, her iki memcacated örneğinde girdileri değiştiren / ekleyen / silen bir şey oluşturmanız gerekir. memcached bunu yapmaz, sağladığı tek şey anahtar karma depolama alanıdır. Yani çoğaltma, senkronizasyon, hiçbir şey, nada.

Umarım bu konuda yanılmış değilimdir, ancak konuştuğumdan bu yana birkaç yıl önce memcached hakkında bildiğim bir şey var.


Yanlış olsaydın benim için faydalı olurdu. :-) phpslacker.com ( phpslacker.com/2009/03/02/php-session-clustering-with-memcache ) 'da memcached'in soruda açıklandığı şekilde çalışabileceğini gösteren bir makale var . Belki de memcache istemcisinin karma stratejiyi nasıl uyguladığına bağlı?
Tom,

1
memcache böyle çalışmaz, ancak php istediğiniz şekilde çalışabilir gibi görünüyor. Açıklandığı gibi php.ini dosyasını değiştirmek veya uygulamanızı değiştirmek zorunda kalacaksınız. Blogdan: İstediğiniz kümelenme nerede? Peki, doğrunun söylemediği hiçbir şey yok. Şimdiye kadar elimizde 2 sunucudan oluşan bir memcache havuzu var. PHP havuza yazacak şekilde yapılandırılmış. PHP, “session.save_path” ini yönergesi ile belirtilen sırada sunucu havuzuna okur / yazar. Çünkü PHP, havuzdan anahtar ile bir önbellek nesnesi isteyecektir. “Yük devretme” etkin olduğundan PHP, memcache sunucularının havuzunu tek tek sorgulayacaktır [...]
tore-

1

memcached kutudan çıkarılmaz ancak repcached (yamalı bir memcached) yapar. Ancak, eğer zaten mysql kullanıyorsanız, neden sadece usta-master çoğaltma ile çoğaltma işlevini kullanmıyor ve tam veri çoğaltmadan faydalanıyorsunuz.

C.


Bilgi için teşekkürler. Peşinde olduğum çoğaltma değil. Bu, oturum bulununcaya kadar sırayla her memcac üzerinde tepe yapmak istemek için bir durum. yani önce localhost'u kontrol ediyor, çünkü en hızlı ve ardından diğer sunucuyu kontrol ediyor.
Tom,

1
Tüm tanrılar adına NEDEN ???? Bu tamamen yanlış bir çözüm ... iyi düşünebildiğim herhangi bir sorun hakkında. Yalnızca 2 sunucuda bile çok verimsiz olmanın yanı sıra, daha fazla sunucu eklerseniz, aşamalı olarak daha da kötüleşir. Ve bu, çözümünüzün, uygulamada bir kümeye sunucu eklerken, tek bir sunucuya göre iki kat daha fazla kesintiye neden olduğu gerçeğini düşünmüyorsa, kesinti olasılığını azaltmalıdır. (Eğer DNS tabanlı round-
robin'i

Geri bildiriminiz için teşekkürler, evet, serbestçe oturum paylaşımında noob olduğumu kabul ediyorum! :-) Ancak, teklifimin neden bu kadar çirkin olduğunu hala anlamadım. Paylaşılan bir DB kullanmaktan daha verimli olacağını düşündüm ve ayrıca kesintileri daha az olası hale getireceğini düşündüm.
Tom,

Hayır, onları daha olası kılar. Verilerin bu şekilde birleştirilmesi, çok sayıda düğüme sahip olduğunuzda anlamlıdır, çünkü çoğaltma miktarını azaltırsınız, ancak bir tanesi kullanılabilirliği korumak için belirli sayıda havuzda çoğaltma işlemi gerçekleştirir. Repcached replikasyon ile mysqld replikasyon arasında bir fark görmek için performans konusunda çok seçici olmanız gerekir.
symcbean

Allow_failover = 1 kullandığım sürece, birden fazla aynanın LESS olasılığını azalttığını test ettim ve onayladım. Bir aynayı kapatabilir, yeniden başlatabilir ve diğerini kapatabilir, yeniden başlatabilir ve birincisini tekrar kapatabilirim - hepsi kapanmadan. Sanırım PHP memcache istemcisi sahnelerin arkasında bir sürü kandırmaca yapıyor.
Tom,
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.