Dosya / Görüntü Çoğaltma

3 Cevap php

Ben basit bir sorum var ve birden fazla ana genelinde görüntüleri çoğaltmak için en iyi yol olduğu konusunda başkalarının deneyimlerini duymak istiyoruz.

Ben veritabanında görüntüleri depolamak ve daha sonra birden fazla ana üzerinden veritabanı çoğaltması kullanarak maksimum kullanılabilirlik neden olacağını tespit ettik.

Ben dosya sistemi ile sahip endişe (örneğin ben 5 sunucuları tüm görüntüler için aynı sunucu vurmak istemiyorum!) Görüntüleri senkronizasyon güçlüğüdür.

Şimdi, ben veritabanında görüntüleri saklamak sahip tek endişeleri ben veritabanı girişlerinin işaret 'sanal' görüntü bağlantılar istiyorsa apache yerine koymak olurdu veritabanı ve ekstra işlem isabet ekstra sorgularını. (Örneğin AddHandler)

Bildiğim kadarıyla benim anlayış gider gibi:

  • If you have a script serving up the images: Each image would require a database call.
  • If you display the images inline as binary data: Which could be done in a single database call.
  • To provide external / linkable images you would have to add a addHandler for the extension you wish to 'fake' and point it to your scripting language (e.g php, asp).

Ben bir şey kaçırmış olabilir, ama herkes daha iyi fikir olup olmadığını merak ediyorum?


Edit: Tom has suggested using mod_rewrite to save using an AddHandler, I have accepted as a proposed solution to the AddHandler issue; however I don't yet feel like I have a complete solution yet so please, please, keep answering ;)

Birkaç Apache üzerinde lighttpd kullanarak sürmüştür. Lighttpd için ISAPI modülleri Nasıl farklı?

3 Cevap

Eğer veritabanında görüntüleri depolamak varsa, size ekstra bir veritabanı isabet plus web sunucusu iyileştirmeleri hizmet doğuştan önbelleğe / dosyayı kaybetmek alır. Apache çok daha hızlı PHP onu yönetebilirsiniz daha statik bir görüntü hizmet edecektir.

Bizim büyük app ortamlarda, biz 4 kümelere kadar kullanabilirsiniz:

  • App sunucu küme
  • Web hizmeti / veri hizmeti küme
  • Statik kaynak (resim, belgeler, multi-medya) küme
  • Veritabanı küme

Bir statik kaynak sunucu işleyebilir ne kadar trafik şaşıracaksınız. Gerçekten (hiçbir uygulaması mantığı) işlem değil, çünkü bir tepki deli gibi optimize edilebilir. Eğer ayrı bir statik kaynak küme ile giderseniz, ayrıca mimari sadece bir bölümünü değiştirmek kendinizi açık bırakın. Örneğin, bazı testlerde lighttpd apache daha statik bilgi veren bile hızlıdır. Eğer ayrı bir küme varsa, sizin app ortamda başka bir şey değiştirmeden orada http sunucusunu değiştirebilirsiniz.

Ben 2-makine statik kaynak küme ile başlamak ve nasıl performans görmek istiyorum. Bu işlevleri ayıran bir başka avantajı - yalnızca ihtiyacınız nerede dışarı ölçekli olabilir. Bildiğim kadarıyla dosyaları senkronize olarak, kendi haddeleme karşısında mevcut file synchronization araçları bir göz atın. Eğer bir kod satırı yazmak zorunda kalmadan gereken nedir bir şeyler bulabilirsiniz.

Onları saklamak için karar yerden görüntüleri hizmet önemsiz bir sorundur; Ben bunu çözmek için nasıl tartışmak değildir.

Nerede bunları saklamak için karar yapmak için gereken gerçek karardır. Siz hedeflerinize ne düşünmek gerekir:

  • Donanım Fazlalık
  • Ucuz depolama sürü
  • Oku-ölçekleme
  • Yaz-ölçekleme

Son iki aynı değildir ve kesinlikle sorunlara neden olur.

Bu görüntü kütüphanesi boyutu elde edilebilir en büyük yüksek hızlı sunucu dereceli diskler olarak, yazma zamanda web sunucuları (diyelim ki, 200g koymak için mutluyuz diski geçmeyecek eminseniz , ben size) ve satıcı bağlı olarak, RAID1'e bundan daha fazla saklamak mümkün olmayacak kadar o zaman her üzerindeki tüm görüntüleri bir kopyasını koyarak çok iyi okuma-ölçeklendirme alabilirsiniz, 1U web sunucularını kullanmak istiyorsanız varsayalım web sunucusu.

Tabii ki bir yerde çok usta bir kopyasını tutmak istiyorsanız, ve zaman zaman bunları senkronize bir cini veya süreç var ve onlar senkronize kalır ve bu cini çalışır, ancak bu ayrıntıları olup olmadığını kontrol etmek izleme olabilir. Her web sunucusu üzerinde bir kopyasını tutmak okuma-ölçekleme mükemmel hemen hemen yapacaktır.

Her bir web sunucu her değişti / yeni dosyası yazmak zorunda olacak gibi ama her yerde bir kopyasını tutmak, yazma-ölçeklenebilirlik berbat olacak. Bu nedenle toplam yazma verim kümede yavaş tek bir web sunucusuna sınırlı olacaktır.

Birçok sunucular arasında da görüntü verilerinizi "Sharding" iyi bir okuma / yazma ölçeklenebilirlik verir, ama bir nontrivial bir egzersiz olacaktır. Ayrıca ucuz (imsi) depolama kullanmak için izin verebilir.

Tek bir merkezi sunucu (ya da aktif / pasif çifti ya da bir şey) pahalı IO donanım yiyerek yerde "ucuz" IO donanım kullanarak daha iyi yazma verim verecek, ancak daha sonra okuma-ölçeklenebilirlik ile sınırlı olacak.

Bir veritabanında görüntüleri olması mutlaka her biri için bir veritabanı çağrı anlamına gelmez; alındıktan zaman (geçici dosyalar örneğin) her ana ayrı ayrı bu önbelleğe olabilir. Kaynak görüntüler hala veritabanı ve sunucular arasında senkronize etmek kolay olacaktır.

Ayrıca, gerçekten http://server/image.php/param1/param2/param3.JPG gibi adresler yapmak ve $_SERVER['PATH_INFO'] ile parametrelerini okuyabilirsiniz güzel-Eğer adresler korurken bir PHP komut dosyası aracılığıyla bir görüntü sunmak için Apache işleyicileri eklemek gerekmez. Mod_rewrite kullanarak (eğer gerekirse) da URL 'image.php' kısmını kaldırmak olabilir.