ext4'te dizin başına maksimum dosya


16

Tüm dosyaların md5 toplamlarına eşit dosya adlarıyla depolandığı bir dosya deposu içeren bir uygulamayı yönetiyorum. Tüm dosyalar tek bir dizinde saklanır. Şu anda binlerce var, ancak yakında sunucuda milyonlarca dosya olmalı. Geçerli sunucu, ext4 dosya sisteminde Ubuntu 11.10 çalıştırıyor.

Birisi bana bir dizine birçok dosya koymanın akıllıca olmadığını söyledi, çünkü bu arama süresinde ve güvenilirliğinde önemli bir artış yaratacaktır (tek bir dirinin işaret edebileceği maksimum dosyalar hakkında bir hikayesi vardı, bu da büyük bir bağlantılı listeye neden oldu). Bunun yerine, örneğin dosya adının alt dizeleri ile alt dizinler oluşturmayı önerdi. Ancak, bu benim uygulama bazı şeyler çok daha hantal hale getirecektir.

Bu hala doğru mu, yoksa modern dosya sistemlerinin (örneğin ext4) bununla başa çıkmanın ve doğal olarak ölçeklenmesinin daha etkili yolları var mı? Wikipedia'nın dosya sistemleri hakkında bazı ayrıntıları vardır, ancak dizin başına maksimum dosya veya arama süresi hakkında hiçbir şey söylemez.

Yanıtlar:


8

ext3Ve daha sonra dosya sistemleri destekleyen karma B-tree dizin indeksleme. Bu, yaptığınız tek işlem ekleme, silme ve ada göre erişim olduğu sürece çok iyi ölçeklenir. Ancak, yine de dizinleri bozmanızı tavsiye ederim. Aksi takdirde, araçlar için tehlikeli bir bubi tuzağı oluşturmak ( updatedb, ls, duve benzeri) dizin çok sayıda giriş varsa patlayabilir, dizinlerde diğer işlemleri gerçekleştirmek olduğunu.


8

Sorunun özü, istediğiniz bir dosya için dizin inode'u kazmaktır. Bazı dosya sistemleri bunu diğerlerinden daha iyi yapar. Bazıları milyarlara yakın ölçeklendirir, ancak sadece ... 20K dosyalarınız varsa bu dosyalara ulaşmak oldukça hızlıdır. Ayrıca, büyük dosya sayımları belirli araçlar için sorun yaratır ve sonuç olarak yedekleme / geri yüklemeyi çok daha zor hale getirebilir.

Olduğu gibi kendi gelişimimizde tam olarak aynı problemle karşılaştım (dosya adı olarak md5sum, ölçeklendirme). Geliştiricilerimize tavsiye ettiğim şey ipi parçalara ayırmak. 4'lü gruplar ile gittiler, ancak o zamanlar dosya sisteminde, birçoğunun performans açısından sorunlu olduğunu kanıtlamıştık, bu yüzden ilk 6 üçlüsü için 3'lü bir gruba ayrıldılar ve gerisini terminal dizinindeki dosya adı.

4 kişilik grup: 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
Grup 3:497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt

Bu, dizin boyutlarını küçük tutma avantajına sahiptir ve MD5sum oldukça rasgele olduğundan, dengeli dizin ağaçları oluşturur. Bu son dizinin birkaç dosyadan daha fazlasını alması pek olası değildir. Ve kodumuza çalışmak o kadar da zor değildi. Milyonlarca dosya projesi ile çalışıyoruz, bu nedenle ölçeklendirme bizim için çok önemliydi.


4
Bir saldırganın hesaplama kaynaklarına sahip olması durumunda, kasıtlı olarak aynı dizine inecek kötü amaçlı veriler oluşturabileceğine dikkat edin. İyi kaynaklara ve günümüz teknolojisine sahip bir saldırgan, aynı ilk 9 onaltılık haneye (ve böylece ilk üç dizin seviyesinde çarpışmaya) sahip olan karmaları her on dakikada bir oranında üretebilir. Ve elbette, bugün tam MD5 karmaları üretilebilir.
David Schwartz

5

Modern dosya sistemleri milyonlarca dosya için bile çok büyük dizinleri çok iyi işler. Ancak geleneksel araçlar bunu yapmaz. Örneğin, "ls" ile böyle büyük bir dizini listelemek normalde tüm dizini okuyacağı ve sıralayacağı için oldukça uzun zaman alacaktır (ancak sıralamayı önlemek için ls -f kullanabilirsiniz). Hepsi okunana kadar dosyaları göstermeye başlamaz. Adları bölmek bazı durumlarda yardımcı olur, ancak hiçbir şekilde yardımcı olmaz (örneğin, rsync çoğaltmasının yine de tüm ad ağacını toplaması gerekebilir).


-1

Bunun yerine bir SQL veritabanı kullanmanızı önerebilir miyim? Bu muhtemelen uygulamanızdaki algılanan zayıflığı bir güce dönüştürecektir.

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.