oturumları işlemek için farklı veritabanları ... ben doğru olanı yapıyorum?

3 Cevap php

Benim oturumları işlemek için ayrı bir veritabanı kullanmak gerektiğini olup olmadığını bazı tavsiyeler için arıyorum.

Biz belirli bilgileri giriş ve onların hesabını güncellemek / kontrol etmek için birden fazla kullanıcı için bir web uygulaması yazıyoruz. Biz oturum bilgilerini depolamak için web sunucusu üzerinde dosya depolama yöntemi kullanmak istemiyordu, bu yüzden biz bir veritabanı (MySQL) kullanmaya karar verdi. Bu güzel çalışıyor, ancak bu üretimin içine alır zaman performansı hakkında merak ediyorum.

Şu anda, biz iki veritabanları (rst_sessions ve RST) var. Tüm tabloları webapp için saklanan nerede "RST" veritabanı ... hepsi tabloları bağlamak Tutarlılığına / yabancı anahtarları kullanarak MySQL InnoDB vardır. "RST_SESSIONS" veritabanı sadece tek bir tablo vardır ve tüm oturum bilgilerini orada saklanır alır.

İşte benim endişeleri biri. Ben "RST" karşı bir sorgu çalıştırmak istiyorsanız PHP kodu sonra ben php içeride gibi bu veritabanını seçmek zorunda ($ db-> ("RST") seçin) ... Ben sorgu I ile işim bittiğinde (select $ db-> ("RST_SESSIONS")) "RST_SESSIONS" veya başka bir özel bilgi set almaz oturumu yeniden seçmek zorunda. Yani, kod iki veritabanlarının seçilmesi ve yeniden seçmeden bir sürü yapıyor webapp atlatmamı. Bu söz sahibi kullanıcı tabanı (- 15,000 10,000) ile performans sorunları neden olabilir mi? Hepimizin seçerek önlemek için RST veritabanına RST_SESSIONS tabloyu hareket daha iyi olurdu?

Biz başlangıçta bu şekilde şeyler kurmak bir nedeni webapp veritabanı işlemleri ile müdahale etmedi bu yüzden ayrı bir veritabanı sunucusunda oturumları bilgi depolamak için muktedir oldu.

Yanlısı ve con hem yöntem ve biz performans için yapmak ne önerirsiniz bazıları nelerdir? Şimdiden teşekkürler.

3 Cevap

Eğer performansları endişe ediyorsanız, başka bir alternatif çözüm veritabanındaki oturumları saklamayın olurdu, ama memcached gibi bir şey kullanmak - memcached iletişim için PHP kütüphanesi zaten oturumları için bir işleyici sağlar.

Memcached kullanmanın avantajları bir çift:

  • No hit to the disk : everything is in RAM
    • Tabii ki, bu sunucu çöküyor oturumlarının kaybolur olacağı anlamına gelir; Bir kaza olur ama, muhtemelen jsut kaybeden oturumları başka sorunları var olacak, ve bu sık sık gerçekleşmesi olası değildir
  • Birçok web sitesi tarafından üretiminde kullanılan ve iyi çalışıyor (I'm using it for a couple of websites)
  • Daha iyi ölçeklenebilirlik: Eğer memcached küme için daha fazla RAM veya daha fazla CPU-güç gerekiyorsa, sadece birkaç sunucuyu eklemek
  • Ve ben eklemek istiyorum: Eğer memcached kullanmaya başladıktan sonra, ayrıca bir önbelleğe alma mekanizmasından olarak kullanabilirsiniz ;-)


Now, to answer to your specific questions :

Bunun yerine DB seçilmesi, ben iki farklı bağlantıları kullanabilirsiniz:

  • Adlı uygulama için kullanmak DB için bir,
  • Ve oturumları için kullanılan DB için diğeri.

Tabii ki, bu (it doubles the number of opened connections) sunucu üzerinde biraz daha fazla yük anlamına gelir, ama bu gerekli olur bir gün, başka bir sunucuya "oturum" veritabanını taşımak mümkün olacak, emin olun: ' sadece yeniden yapılandırmak bir bağlantı dizesi gerekecektir; uygulama zaten iki ayrı bağlantılarını kullanır gibi ve hala para cezası çalışacağız.

Onunla yaşamak, sadece veritabanına ikinci bir bağlantı açın. Bu şekilde hiç veritabanları arasında geçiş zorunda kalmazsınız. Tabii ki, şimdi iki kat daha fazla bağlantıları tüketmek ve sınırı çarpmak gerekebilir.

Ayrı bir veritabanında auth bilgi koymak için bazı öncelikli nedeni olmadığı sürece, neden veri kalanı ile koymak değil mi? Bunu uygun bir yerde her şey var bulabilirsiniz.

Eğer bir şema (veritabanı) adı örneğin ile sql sorguları içinde tablo adlarını geçerli olabilir ayrıca Bildirimi

SELECT ACTIVE
FROM RST_SESSIONS.SESSION
WHERE SID=*whatever*

Her ikisi de aynı sunucu üzerinde iseniz Bu, açıkça dbs geçmek için ihtiyaç dışarı alabilirsiniz.