GridFS hızlı ve üretim için yeterince güvenilir mi?


86

Yeni bir web sitesi geliştiriyorum ve GridFS'yi tüm kullanıcı yüklemeleri için depolama alanı olarak kullanmak istiyorum, çünkü normal bir dosya sistemi depolamasına kıyasla birçok avantaj sunuyor.

Nginx tarafından sunulan GridFS ile karşılaştırmalar, nginx tarafından sunulan normal bir dosya sistemi kadar hızlı olmadığını göstermektedir.

Nginx ile kıyaslama

Dışarıda, GridFS'yi bir üretim ortamında kullanan veya yeni bir proje için kullanan biri var mı?


1
Bana benzer niyetleri olan gelecekteki arama yapanlar için görüntüleri mongodb'de depolamaya ilişkin bir blog yazısı: menge.io/2015/03/24/storing-small-images-in-mongodb (GridFS'yi basitçe dokümana ikili olarak atarak karşılaştırır veri)

İkili verileri MongoDB'de
Alexander Marquardt

Yanıtlar:


119

Şerefli trafik istatistiklerine sahip bir fiyat karşılaştırma web sitesinin parçası olan sunucularımızdan birinde işte gridfs kullanıyorum (günde yaklaşık 25 bin ziyaretçi). Sunucunun çok fazla ram, 2gigs'i yok ve işlemci bile gerçekten hızlı değil (Core 2 duo 1.8Ghz) ancak sunucunun bol depolama alanı var: raid 0 yapılandırmasında 10Tb (sata). Sunucunun yaptığı iş çok basit:

Fiyat karşılaştırıcımızdaki her ürünün bir resmi vardır (ürün veri tabanımıza göre yaklaşık 10 milyon ürün vardır) ve sunucuların görevi, resmi indirmek, yeniden boyutlandırmak, gridfs üzerinde depolamak ve ziyaretçilerin tarayıcısına teslim etmektir. .. ızgarada yoksa ... veya ... ızgarada zaten kayıtlıysa, ziyaretçilerin tarayıcısına teslim edin. Bu nedenle, bu bir 'geleneksel cdn şeması' olarak adlandırılabilir.

Çalıştığından beri bu sunucuda 4 milyon görüntü sakladık ve işledik. Yeniden boyutlandırma ve saklama işleri basit bir php betiği ile yapılır ... ama elbette bir python betiği veya java gibi bir şey daha hızlı olabilir.

Mevcut veri boyutu: 11,23 g

Mevcut depolama boyutu: 12,5 g

Endeksler: 5

Dizin boyutu: 849.65m

Güvenilirlik hakkında: Bu çok güvenilirdir. Sunucu yüklenmiyor, dizin boyutu tamam, sorgular hızlı

Hız hakkında: Elbette, yerel dosya depolama kadar hızlı değil mi, belki% 10 daha yavaş mı, ancak görüntünün işlenmesi gerektiğinde bile gerçek zamanlı olarak kullanılacak kadar hızlı mı, bizim durumumuzda bu çok php'ye bağlı. Bakım ve geliştirme süreleri de kısaltıldı: bir veya birden çok görüntüyü silmek çok kolay hale geldi: basit bir silme komutuyla db'yi sorgulamanız yeterli. Bir başka ilginç şey: eski sunucumuzu yerel dosya depolamayla yeniden başlattığımızda (binlerce klasörde milyonlarca dosya var), bazen saatlerce takılıyor çünkü sistem bir dosya bütünlüğü denetimi yapıyordu (bu gerçekten saatler sürdü ...). Gridfs ile artık bu sorunu yaşamıyoruz, görüntülerimiz artık büyük mongodb yığınlarında (2gb dosyalar) saklanıyor

Yani ... aklımda ... Evet, gridfs üretim için kullanılacak kadar hızlı ve güvenilir.


9
Herhangi birinin bir üretim web sitesinde birincil depolama alanı olduğu için raid 0'ı kullanacağına şaşırdım. İyi yedeklemelerde bile, depolama arızası olasılığını artırmak, gelişmiş performans için ödenmesi gereken oldukça yüksek bir bedeldir.
mikerobi

67
Raid 0 kullanıyoruz çünkü bizim özel durumumuzda görüntü verileri uçucu olabilir. Tüccar web sitesinden tekrar indireceğimiz için görüntünün kaybolup kaybolmaması önemli değil. Pragmatik olarak, sunucumuzun basit bir görüntü önbellek sunucusu olduğunu düşünebiliriz.
Manu Eidenberger

Ancak, arıza olasılığını aktif olarak artırıyorsunuz (ilk sürücü arıza faktörü, iş mili sayısıyla çarpılır). Raid 10, okumadan daha fazla yazmaya ihtiyacınız varsa veya yazmadan daha fazla okumaya ihtiyacınız varsa Raid 5/6 ideal olacaktır.
NeuroScr

9
@ManuEidenberger MongoDB belgesinde saklanmayı tercih eden görüntüleri depolamak için neden GridFS kullanıyorsunuz? Sanırım 16 MB belge boyutu sınırına ulaşmadınız. Görüntüyü bir MongoDB belgesinde BLOB olarak saklamak, MongoDB belgelerinin üzerinde GridFS katmanına ihtiyacınız olmadığından daha verimli olacaktır.
Arnaud Bouchez

1
@ ArnaudBouchez'in sorusunu da merak ediyorum. GridFS'i bir belgede ikili veri olarak saklamak yerine seçmenize neden olan bir fayda var mıydı, Manu? Teşekkürler!

12

Bahsedildiği gibi, sıradan bir dosya sistemi kadar hızlı olmayabilir, ancak size sıradan dosya sistemlerine göre avantaj sağlar. biraz hızdan vazgeçmeye değer olduğunu düşündüğüm sağlar.

Nihayetinde, parçalama ile, GridFS depolamasının, sıradan bir dosya sistemi ve tek bir düğüm yerine aslında daha hızlı bir seçenek haline geldiği bir noktaya ulaşabilirsiniz.


6

Yine de daha büyük DB'ler için onarımlarla ilgili uyarı - geliştirmekte olduğumuz yeni bir sistem, mongo temiz bir şekilde çıkmadı ve 7TB GridFS'i onarmak 130 saat sürecek gibi görünüyor.

Bu nedenle, OpenStack Swift veya Ceph'e geçmeye bakacağımı düşünüyorum. Yine de o zamana kadar iyiydi. Ve nginx-gridfs modülü tatlıdır.


Peki nasıl gittin?
Mukus

5

mdirolf'un nginx-gridfs modülü harika ve kurulumu oldukça kolay. Paint.ly'de üretimde tüm resimlere hizmet vermek için kullanıyoruz ve şu ana kadar herhangi bir problem yaşamadık.


3
paint.ly artık mevcut değil gibi görünüyor. :(
Marian

2

Ne yaptığınızı bilmiyorsanız gridfs kullanmanızı önermem. GridFS, dosyaları parçalara bölen ve dosyaları iki koleksiyonda saklayan soyutlama katmanıdır. Daha fazla dosya - daha fazla ek yük. Dosyaların oldukça aynı boyutta olmasını ve 32 milyonu aşmamasını bekliyorsanız - doğru yoldasınız. Gridfs üzerinde büyük dosyalar saklamaya çalışmayın. Neden?

  1. Farklı dillerdeki sürücüler, dosyanın küçük bir bölümünü okurken tüm dosyayı (örn. Yığınlar) okuyabilir.
  2. Dosyayı değiştirmek tüm parçaları etkileyebilir ve veritabanı yükünü artırabilir Dosya sisteminiz büyüyorsa, gridf'leri parçalamaya karar vermeniz gerekecektir. Dikkatli ol! Parçalama başlatılırken tutarlılık garanti edilmez!

Yüklenen projeyi okumayı düşünüyorsanız - dosyaları doğrudan dokümanlara yüklemeyi düşünün (16M veya daha küçük boyutta ise) veya başka bir clusterfs seçin ve dosya adını / inode'u mantığınıza bağlayın.

Bu yardımcı olur umarım.


4
GridFS'de oldukça yeniyim, anladığım kadarıyla GridFS, dosya sayısını iki katına çıkaran bir soyutlama katmanından daha fazlası. GridFS, MongoDB'nin çoğaltma ve parçalama özelliklerinden yararlanmanın basit bir yolunu sağlar. Başkalarının da dosyaların 2GB'lık yığınlarda saklandığından bahsettiğine inanıyorum ki bu, özellikle birinin çok büyük miktarda küçük resme sahip olması durumunda, toplam dosya sayısını azaltacağını tahmin ediyorum.

+1 Haklısın. Daha küçük dosyalar bile GridFS ile depolanmaktan fayda sağlamaz. Dosyanız bir MongoDB belgesinde saklanabiliyorsa (yani 16 MB boyut sınırının altında), dosyayı bir MongoDB belgesi içinde BLOB olarak saklamayı tercih edersiniz. MongoDB depolamasının üzerine GridFS kullanımının ek yükünü atlayacaktır. Bkz compose.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez
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.