Session’ları Memcached’te Saklamak Ne Kadar Doğru?

Özellikle arkasında birden fazla web sunucusunun bulunduğu web projelerinde genellikle non-sticky session bilgilerini saklamak için Memcached kullanılır. Bu şekilde kullanıcıların, farklı web makinelerine düştüklerinde oturum bilgilerine erişilebilmesi amaçlanır.

Ama projenizde her şey yolunda giderken, bir anda kullanıcılardan kendi istekleri dışında “logout olma” şikayetleri gelmeye başladı. Hemen projenizin kodlarını incelediniz ancak anormal bir durum görünmüyor.

Muhtemelen Memcached kullanıcıların session bilgilerini siliyordur.

Peki ama nasıl?

Bu durumu örneklersek: 1. kullanıcı giriş yaptı ve session bilgileri Memcached‘e yazıldı. Ardından yüzlerce kullanıcı da giriş yaptı ve hafızada yer kalmadı. 1. kullanıcının session bilgileri silindi ve böylece logout oldu.

Memcached neden session bilgilerini sildi?

Memcached’e 64 MB (örnek değer) limit verdiniz ve bu 64 MB doldu. Memcached otomatik olarak kendi içerisinde LRU (Least Recently Used) algoritmasını uygulamaya başlayacaktır. Bu algoritma ile “son zamanlarda en az kullanılan” key’i hafızadan silecektir.

Bu senaryoda da bizim silinen key’imiz 1. kullanıcının session key’i oluyor.

Bir diğer durum ise Memcached persistent (kalıcı) bir veri saklamaması. Bundan dolayı sadece LRU algoritması ile değil herhangi bir sebepten dolayı Memcached kapanıp, yeniden açılırsa da (konfigürasyon değişikliği, işletim sisteminin yeniden başlatılması, donanım güncellemesi vs.) session bilgileri silinmiş olur. Doğal olarak kullanıcılar web sitesinden çıkış yapmış olur. Bu da kimi projeler için hoş olmayan sonuçlar doğurabilir.

Session kayıplarını önlemek için, genelde persistent şekilde veri saklayan RDBMS, NoSQL çözümler kullanmanız önerilir.

Bir yazıda hem session hem cache geçiyorsa sonuna şu gif’i koymamak olmaz :) : Patronun cache icin session kullandigini gordugumde ben

 
71 Kudos
Don't move
  1. Bu sorunu asmak için her web sunucusuna memcache koyup pool olarak kullanabilirsin.

    Tabi nosqlde bi çözüm olabilir. Fakat ram yetmiyor diye memcache i sorgulamak çok doğru değil.

    • Problem sadece RAM’in yetmemesi veya pooling yapılmaması değil ki. Kaldı ki pooling bu problemlerin önüne geçemez. Zaten pooling olayının datanın persistent saklanması ile uzaktan yakından alakası da bulunmuyor. Kısacası buradaki problem Memcached’in persistent saklama yapmamasından kaynaklanıyor.

  2. Oturumlar sebebiyle hdd’de yazma sayısının artması (siteyi ziyaret eden herkes için oturum oluşturmak zorunda olduğumuz durumlarda) sebebiyle okuma olmasa bile yazma sayılarını bir nebze azaltmak için memcached güzel bir düşünce…

    Ram konusunda da limiti 64mb yerine daha üst 512 falan ayarlamak da bir çözüm olabiliyor…

    Şahsen ben öyle yapmış durumdayım…

  3. 2 ay sonra gelen özür; sitedeki trafik bir anda artınca yönetici arkadaşları sitede login tutmak bile mümkün olmamaya başlayınca oturumları memcached üstünde tutmanın hatalı olduğunu bilfiil idrak etmiş ve aydınlanmış bulundum 😆

  4. Memcache kullanımı mantıklı ama kullanım şekli daha önemli bence, cacheler arasında seviye olması gerekiyor. Örneğin ilk önce memcache de session aranır orda yoksa bir altındaki inmemory cache çözümüne(NOSQL gibi) bakılır orda da yoksa bir alta konumlandırılan sql sunucusuna bakılır. Böylelikle bahsetmiş olduğunuz sorun efektif bir şekilde çözülmüş olur hemde performanslı ve dağıtık bir session mimariniz olur.

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>