2009-03-22 16 views
12

Jest kilka bardzo dobrych pytań na temat zarządzania plikami i przechowywania w dużym projekcie.Wskazówki dotyczące zarządzania dużą liczbą plików?

Storing Images in DB - Yea or Nay?
Would you store binary data in database or in file system?

Pierwszy posiadające kilka świetnych wgląd w moim projekcie Zdecydowałem się pójść drogą pliku i nie Szlaku DB.

Głównym problemem przeciwko używaniu systemu plików jest tworzenie kopii zapasowych. Ale w naszym systemie mamy świetny schemat tworzenia kopii zapasowych, więc nie martwię się o to.

Następna ścieżka to sposób przechowywania rzeczywistych plików. Zastanowiłem się nad ustawieniem lokalizacji plików na stałe i utworzeniem systemu katalogów wirtualnych w bazie danych. Więc linki do pliku nie zmieniają się.

System, który buduję, będzie miał jedno globalne zarządzanie plikami, więc wszystkie pliki będą dostępne dla wszystkich użytkowników. Ale wiele osób, które przeszły ścieżkę pliku, mówi o rozmiarze fizycznego katalogu (jeśli wszystkie pliki znajdują się w jednym katalogu)

Moje pytanie brzmi: jakie są wskazówki lub najlepsze metody postępowania przy tworzeniu folderów dla tych plików statycznych, lub gdybym w ogóle nie chodził po ścieżce katalogu wirtualnego.

(projekt jest na stosie LAMP (PHP) czy to pomaga w ogóle)

+1

może przyjrzeć: http://stackoverflow.com/questions/191845/how-to-store-images-in-your-filesystem – Jacco

+0

BTW nie jestem po prostu przechowywania obrazów, ja przechowywania wszelkiego rodzaju. –

+0

ale te same zasady/problemy obowiązują – Jacco

Odpowiedz

11

Jednym ze sposobów jest przypisać unikalny numer do każdego pliku i użyć go do wyszukania rzeczywistą lokalizację pliku. Następnie użyjesz tego numeru do dystrybucji plików w różnych katalogach w systemie plików. Na przykład można użyć coś takiego schematu:

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number/100) % 100
{2}: file_number

+0

Miałem coś podobnego na myśli, ale wciąż zastanawiałem się, kiedy liczby rosną, aby dodać do nich katalogi? Myślałem także o tworzeniu katalogów od daty utworzenia pliku (lub miesiąca), ale co jeśli jeden miesiąc jest bardzo ciężki dla plików. –

+0

Ta metoda prawdopodobnie rozprowadzałaby pliki bardziej równomiernie. Data i godzina mają tę wadę, że muszą przechowywać i wyszukiwać datę. Możesz sprawić, aby ta metoda była skalowalna poprzez zamontowanie niektórych katalogów pod innym serwerem. –

6

W celu uniknięcia tworzenia nadmiernej liczby zgłoszeń w jednym katalogu, może oprzeć tworzenie katalogów na fragmentach nazwy pliku. Na przykład, jeśli masz plik o nazwie d7f5ae9b7c5a.png, możesz chcieć go zapisać na nośniku/d7/f5/d7f5ae9b7c5a.png. Jeśli twoje nazwy plików są w systemie szesnastkowym, ograniczy to liczbę wpisów w jednym katalogu do 256 aż do ostatniego poziomu.

+0

Czy to działa dobrze w przypadku plików z akcentowanymi znakami lub spacjami? Ale prawdopodobnie zamierzam rozbierać/tłumaczyć te postacie, miła sugestia. –

+0

Jeśli użyjesz skrótu do nazwy pliku, to jedyne miejsce, w którym pojawią się znaki spoza ASCII, znajduje się w bazie danych i prawdopodobnie łatwiej będzie obsługiwać je w bazie danych niż w systemie plików. –

1

Zazwyczaj takie podejście:

mieć globalną zmienną ustawień dla aplikacji, które wskazuje do folderu, w którym przechowywane pliki. W bazie danych przechowuj względne ścieżki do plików (w stosunku do tego, do czego wskazuje zmienna ustawień).

Więc jeśli plik znajduje się w /www/uploads/image.jpg, twoje ustawienia zmienne wskazują na/www/uploads twój wiersz z bazą danych ma image.jpg. Jest to elastyczny sposób, który oddziela strukturę katalogów systemów od aplikacji.

Ponadto można dzielić pamięć plików w katalogach w oparciu o to, do których tabel bazy danych się odnoszą. Powiedzmy, że masz table user_reports i table user_photos. Przechowujesz pliki odnoszące się do user_reports w/www/uploads/user_reports.Jeśli masz dużą liczbę użytkowników, możesz zaimplementować fragmentację jeszcze dalej. Powiedzmy, że użytkownik przesyła plik 20.03.2009, plik nazywa się report.pdf, więc przechowujesz go w /www/uploads/user_reports/2009/03/20/report.pdf.

2
  1. Jeden użytkownik obraz ~ 100kb, więc niech mają 10 000 użytkowników w bazie danych, każdy użytkownik będzie miał w średnio 5 zdjęć, więc mamy 5 terabajtów DB, a każde wyjście obrazu będą realizowane za pośrednictwem DB i ten dodatkowy ruch DB zmniejszy ogólną wydajność serwera DB. ... możesz tego uniknąć, korzystając z klastra DB, ale załóżmy, że jest to kosztowne:

  2. Raport użytkownika o błędzie w aktywnej bazie danych, (w teście - wszystko działa poprawnie), w jaki sposób utworzyć zrzut, rozpakuj go na programistach maszyna? Ile czasu to zajmie?

  3. W jednej chwili możesz zdecydować się na umieszczenie obrazów w niektórych CDN, jakie będą zmiany w kodzie źródłowym?

+0

Nie używam bazy danych dla rzeczywistych danych obrazu. –

9

Jakiś czas temu natknąłem się na ten problem na stronie, na której przechowywano wiele plików. Pobraliśmy GUID (który jest również polem klucza podstawowego pliku) (np. BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) i zapisujemy plik taki jak ten:/B/C/C/BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301/nazwa_pliku.ext

To ma pewne zalety:

  • można skalować serwery plików na wielu serwerach (i przypisać konkretne katalogi do każdej z nich)
  • nie masz aby zmienić nazwę pliku
  • katalogów są gwarancją wyjątkowy

Mam nadzieję, że to pomoże!

1

Nie mogę powiedzieć wiele o tym, jak Apache i PHP zarządzają plikami, ale mogę powiedzieć coś o systemie plików ext3. ext3 nie ma problemów z dużą liczbą plików w tym samym katalogu. Przetestowałem to z nawet milionem plików. Przed utworzeniem katalogów upewnij się, że opcja dir_index jest włączona w systemie plików. Możesz sprawdzić, uruchamiając dump2fs i zmieniając tę ​​opcję, uruchamiając tune2fs. Hashowanie plików w drzewie podkatalogów może być nadal przydatne, ponieważ narzędzia wiersza poleceń nadal mogą mieć problemy z wyświetlaniem zawartości katalogu.

Powiązane problemy