fsckup #3 - cannot create directory, too many links

Projektując serwis WWW lub zlecając firmie zewnętrznej jego napisanie, rzadko kiedy przewidujemy, co się stanie, gdy wzrośnie nam ruch np. 10-krotnie, kiedy skończy sie nam miejsce na dysku, albo w jaki sposób będziemy przechowywać ciągle przybywające dane od użytkowników. Każdy z nas lubi adrenalinę i pracę w stresie, dlatego nie zastanawia się nad możliwymi problemami które mogą wystąpić w przyszłości. Czasami mamy nawet spokój przez kilka miesiący, a szczęśliwcy latami. Oczywiście są sytuacje, których nie da się przewidzieć, ale warto przynajmniej spróbować zastanowić się, co może spowodować problemy wraz ze wzrostem ruchu.

Problem pojawił się... ;-/ i nie ma za bardzo jak zwalić winy na twórce kodu ;-) albo jeszcze inaczej, nie zawsze chodzi o błędnie zaprojektowane rozwiązania zaimplementowane w kodzie serwisu, czasami problem występuje w połączeniu - problemy implementacji + błędna konfiguracja systemu, albo... źle dobrany filesystem. Takie mieszanki wybuchowe mają opóźniony zapłon, bo kto myśli o wyborze filesystemu... ;-)

No właśnie, filesystem... jaki wybrać? xfs? reiserfs? ext3? a może ext4? nie będę opisywał żadnego z nich, nie będę też robił żadnych testów wydajnościowych... ale poruszę ciekawą kwestię związaną z ograniczeniami w systemie ext3 (który jest jeszcze bardzo popularny). Dla przedstawienia sytuacji, wyobraźmy sobie serwis służący do składowania obrazków od użytkowników, serwis jest otwarty więc każdy może wrzucić swój plik, no i z czasem robi się tego naprawdę dużo...

Nasze obrazki składujemy w następujący sposób:

/obrazki/2010-03-24-11-54/obrazek_1.jpg
/obrazki/2010-03-25-13-27/obrazek_2.jpg
/obrazki/2010-03-25-13-31/obrazek_3.jpg
/obrazki/2010-03-26-21-52/obrazek_4.jpg

przynajmniej do czasu kiedy pojawi nam się komunikat:

# mkdir 2010-03-27-16-52
mkdir: nie można utworzyć katalogu `2010-03-27-16-52': Za dużo dowiązań

Zamierzeniem takiego rozwiązania było zapisywanie obrazków w katalogach zawierających datę, godzinę i minutę... wszystko jest fajnie, wyszukanie obrazka dodanego o konkretnej dacie nie stanowi żadnego problemu, ale po stworzeniu 32000 takich katalogów, uśmiech z twarzy nam zniknie... 32000 to magiczna liczba która niektórym powinna śnić się po nocach ;-) Jest to maksymalna ilość podkatalogów w jednym katalogu. Nie da się tego limitu zmienić bez zmiany filesystemu na inny, najszybszym rozwiązaniem teraz jest rozproszenie katalogów do wielu podkatalogów np. tak:

/obrazki_links/2010/03/24/11/54/obrazek_1.jpg
/obrazki_links/2010/03/25/13/27/obrazek_2.jpg
/obrazki_links/2010/03/25/13/31/obrazek_3.jpg
/obrazki_links/2010/03/26/21/52/obrazek_4.jpg

oraz dla zachowania spójności stworzenie linków symbolicznych:

ln -s /obrazki_links/2010/03/24/11/54/ /obrazki/2010-03-24-11-54
ln -s /obrazki_links/2010/03/25/13/27/ /obrazki/2010-03-25-13-27
itd...

Dodatkowo wspomnę, że maksymalny rozmiar pliku możliwy do utworzenia na partycji ext3 to 2TB, więc warto pamiętać również o tym.

Jako wniosek wyciągnijmy, żeby przed wdrożeniem zapoznać się z limitami systemu plików na którym powstanie rozwiązanie, bo późniejsze migrowanie zajmie nam zdecydowanie więcej czasu niż mkfs. ;-)