Sunucularını dağıtma / ekleme ile nasıl başa çıkılacağı - Memcached

4 Cevap php

How do you handle replacing/adding/removing memcached nodes in your production applications? I will have a number of applications that are cloned and customized due to each customers need running on one and same webserver, so i'll guess that there will be a day when some of the nodes will be changed.

İşte memcached normaldir tarafından doldurulur nasıl:

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

Benim ilk fikir, $ servers dizi $ tutan fonksiyonunun sonraki kaçak bir güncelleştirme zorlamak için seçeneği ile, günde bir kez ya da bir şey yapmış, aynı zamanda önbelleğe, veritabanından doldurulur, ancak dosya tabanlı olmak üzere yapmaktır addservers diyoruz. Ancak, diskler oldukça yavaş depolama çünkü bu, bazı ek yükü ekleyebilirsiniz tahmin ediyorum ...

Sen ne düşünüyorsun?

4 Cevap

Bu kaynakta böyle şeyleri tanımlamak için her zaman iyidir. Verilen bir yapılandırma dosyasını okumak için parse_ini_file() ya da buna benzer bir şey kullanabilirsiniz. Gerçekten de, bu kaynağı aittir. INI dosyasında tanımlanan Ama eğer, birçok güvenlik gibi kod enjeksiyon gibi kaygılar ve PHP girişlerinizi tanımlayan aksine seviyor yok.

Aynı INI dosyası okuma olabilir, bir kaç uygulama vardır bu yana, tüm uygulamalar (örneğin, grup izinlerini kullanarak) erişimi ortak bir konuma koyabilirsiniz. Aslında bunu yaparken gerçekten tavsiye edilmez.

Bir yapılandırma dosyası kullan - onun parse_ini_file veya diğer bazı yapılandırma ayrıştırma düzeninden olmadığını. Herhangi bir değişiklik yüklemek için bu size ihtiyacınız vars tüm öncesi ayrıştırır, ama apache yeniden başlatmanız gerekir - Eğer zamanınız ayrıştırma konusunda endişeli iseniz, php ini yük yolu http://brian.moonspot.net/using-ini-files-for-php-application-settings bu yapılandırmaları koyabilirsiniz .

Dosyaları okumak yeterli kez (sürece makinenizde çok fazla dayak yok gibi) yapılandırma dosyası zaten bellek haritalı önbellek olacak, bu yüzden gerçekten çok hızlı olacak. Sen hızlı yükler php tefrika formu kullanarak optimize ve hatta APC kullanıcının önbelleğini kullanarak daha da optimize edebilirsiniz.

Son olarak, yeni memcache kütüphaneleri kullanmaya - onlar şimdi tutarlı karma algoritmalar kullanmak ve bireysel sunucuları ekleme / kaldırma yardımcı olacağız.

Eğer bu (Aktif mod) hemen güncellenmelidir istiyorsanız gereksinimlerine bağlı olarak bazı TTL (pasif mod) veya dinleyici desen çeşit sonra otomatik tahliyeyi destekleyen bir listesini kullanmak istiyorum. Eğer (özellikleri, vb veritabanı dosyası) birincil kaynak tutmak Wherever sürece TTL (yorum sizin belirtildiği gibi) yeterince büyük olduğunda gerekli ve ulaşılabilir olduğu gerçekten önemli değil.

Pasif bir yaklaşım için bazı bilinen anahtarı altında önbelleğe sunucuları listesini koyarak yeniden (Java örneğin EHCache) TTL destekleyen diğer bazı yerel önbelleğe alma kütüphanesi kullanabilirsiniz. Aktif bir yaklaşım için, örneğin, Java java.util.EventListener. O yüzden bu konuda tavsiye edemez PHP şeyi yaptık beri (BM) neyse ki pek çok yıldır.

Ben kuvvetle koduna yapılandırma verilerini koyarak karşı öneriyoruz. Dünyada ben hardcoding bir günahtır yaşıyorum.

Ayrıca tüm tuşların tam bir remap neden olmadan memcached havuzu için / sunucuları eklemek / kaldırmak için güçlü olmak için how last.fm is using consistent hashing algorithm bakmak isteyebilirsiniz.

Bildiğim kadarıyla udnerstood gibi, burada asıl endişe bu değişiklikleri çoğunlukla up-to-date tutmak yapılandırmasını önbelleğe nasıl.

Peki, burada en iyi seçenek açık bir veritabanında saklanması ve her 15 saniyede, diyelim ki, DB yenileniyor. , Uygulama üzerinde büyük bir yük olan bir 15 saniye hiçbir şey değişmeyecek kez DB sorgulama. Bu alanların sadece bir çift ihtiyaç olarak DB kendisinden veri yükleme oldukça hızlıdır.

Sadece yapılandırma güncelleme o önbellek anahtarını tasfiye, orada DB yüklenen yapılandırmayı önbelleğe, Cidden ayrı memcached :) kullanın - Burada işe yarayabilecek başka bir seçenektir.

Özetle: her zaman-tabanlı sona erme düzeni çalışacak. Simpliest çözüm - kendi bakımını (mağaza son yenileme zamanında ve her işlev çağrı kontrol); Biraz daha gelişmiş - memcached gibi bir şey kullanabilirsiniz.

update: oldukça iyi ölçekler olarak DB iyi çözümdür: Her konfigürasyon güncelleme 20 sunucu arasında yapılandırmaları kopyalamak zorunda değilsiniz.