{"id":55408,"date":"2020-01-20T00:00:00","date_gmt":"2020-01-19T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie"},"modified":"2020-02-18T14:03:31","modified_gmt":"2020-02-18T11:03:31","slug":"effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","title":{"rendered":"Skuteczne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie na w\u0142asnym serwerze","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Skuteczne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie na w\u0142asnym serwerze\" src=\"\/wp-content\/uploads\/2020\/01\/39cbe3b73cf4a20dba7e9383f922704f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSzanowna spo\u0142eczno\u015bci, ten artyku\u0142 b\u0119dzie po\u015bwi\u0119cony efektywnemu przechowywaniu i wydawaniu setek milion\u00f3w ma\u0142ych plik\u00f3w. Na tym etapie proponowane jest finalne rozwi\u0105zanie dla system\u00f3w plik\u00f3w zgodnych z POSIX, z pe\u0142nym wsparciem dla blokad, w tym klastrowych, i zdaje si\u0119, \u017ce tak\u017ce ju\u017c bez obej\u015b\u0107.<\/p>\n<p>Dlatego w tym celu napisa\u0142em w\u0142asny specjalistyczny serwer.<br \/>\nW trakcie realizacji tego zadania uda\u0142o si\u0119 rozwi\u0105za\u0107 podstawowy problem, a przy okazji osi\u0105gn\u0105\u0107 oszcz\u0119dno\u015b\u0107 miejsca na dysku i pami\u0119ci RAM, kt\u00f3r\u0105 bezlito\u015bnie poch\u0142ania\u0142 nasz klastrowy system plik\u00f3w. Tak naprawd\u0119 taka liczba plik\u00f3w jest szkodliwa dla ka\u017cdego klastrowego systemu plik\u00f3w. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Pomys\u0142 jest taki:<\/p>\n<p>M\u00f3wi\u0105c prosto, przez serwer przesy\u0142ane s\u0105 ma\u0142e pliki, kt\u00f3re s\u0105 bezpo\u015brednio zapisywane w archiwum i z niego odczytywane, a wi\u0119ksze pliki s\u0105 umieszczane obok. Schemat: 1 folder = 1 archiwum, co daje nam kilka milion\u00f3w archiw\u00f3w z ma\u0142ymi plikami, a nie kilka setek milion\u00f3w plik\u00f3w. A wszystko to zrealizowane jest w pe\u0142ni, bez \u017cadnych skrypt\u00f3w i uk\u0142adania plik\u00f3w w archiwa tar\/zip.<\/p>\n<p>Postaram si\u0119 stre\u015bci\u0107, z g\u00f3ry przepraszam, je\u015bli post b\u0119dzie zbyt obszerny.<\/p>\n<p>Wszystko zacz\u0119\u0142o si\u0119 od tego, \u017ce nie mog\u0142em znale\u017a\u0107 odpowiedniego serwera na \u015bwiecie, kt\u00f3ry m\u00f3g\u0142by zapisywa\u0107 dane otrzymane przez protok\u00f3\u0142 HTTP bezpo\u015brednio do archiw\u00f3w, aby unikn\u0105\u0107 wad charakterystycznych dla zwyk\u0142ych archiw\u00f3w i obiektowych magazyn\u00f3w. Powodem tych poszukiwa\u0144 by\u0142 rozro\u015bni\u0119ty do du\u017cych rozmiar\u00f3w klaster Origin sk\u0142adaj\u0105cy si\u0119 z 10 serwer\u00f3w, na kt\u00f3rym zgromadzi\u0142o si\u0119 ju\u017c 250 000 000 ma\u0142ych plik\u00f3w, a tendencja wzrostu nie zamierza\u0142a ust\u0119powa\u0107.<\/p>\n<p><b>Dla tych, kt\u00f3rzy nie przepadaj\u0105 za artyku\u0142ami, a ma\u0142a dokumentacja jest \u0142atwiejsza:<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">tutaj<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">tutaj<\/a><\/noindex>.<\/p>\n<p>I docker przy okazji, obecnie jest dost\u0119pna opcja tylko razem z nginx w razie potrzeby:<\/p>\n<pre><code class=\"bash\">docker run -d --restart=always -e host=localhost -e root=\\\/var\\\/storage \\n-v \\\/var\\\/storage:\\\/var\\\/storage --name wzd -p 80:80 eltaline\\\/wzd<\/code><\/pre>\n<p>\nDalej:<\/p>\n<p>Je\u015bli plik\u00f3w jest bardzo du\u017co, potrzebne s\u0105 znaczne zasoby, a co najgorsze, cz\u0119\u015b\u0107 z nich jest tracona. Na przyk\u0142ad, przy u\u017cyciu klastrowego systemu plik\u00f3w (w tym przypadku \u2013 MooseFS), plik, niezale\u017cnie od faktycznego rozmiaru, zajmuje zawsze minimum 64 KB. To oznacza, \u017ce dla plik\u00f3w o rozmiarze 3, 10 lub 30 KB na dysku wymagane jest 64 KB. Je\u015bli plik\u00f3w jest \u0107wier\u0107 miliarda, tracimy od 2 do 10 terabajt\u00f3w. Nie uda si\u0119 w niesko\u0144czono\u015b\u0107 tworzy\u0107 nowych plik\u00f3w, poniewa\u017c w MooseFS istnieje ograniczenie: nie wi\u0119cej ni\u017c 1 miliard przy jednej replikacji ka\u017cdego pliku.<\/p>\n<p>Wraz ze zwi\u0119kszeniem liczby plik\u00f3w, potrzebna jest du\u017ca ilo\u015b\u0107 pami\u0119ci RAM na metadane. Cz\u0119ste du\u017ce zrzuty metadanych sprzyjaj\u0105 zu\u017cywaniu dysk\u00f3w SSD.<\/p>\n<p><b>Serwer wZD. Porz\u0105dkujemy dyski.<\/b><\/p>\n<p>Serwer zosta\u0142 napisany w j\u0119zyku Go. Przede wszystkim musia\u0142em zmniejszy\u0107 liczb\u0119 plik\u00f3w. Jak to zrobi\u0107? Poprzez archiwizacj\u0119, ale w tym przypadku bez kompresji, poniewa\u017c moje pliki to po prostu sp\u0142aszczone obrazy. Z pomoc\u0105 przysz\u0142a BoltDB, kt\u00f3r\u0105 r\u00f3wnie\u017c musia\u0142em pozbawi\u0107 wad, co zosta\u0142o odzwierciedlone w dokumentacji.<\/p>\n<p>Ostatecznie, zamiast \u0107wier\u0107 miliarda plik\u00f3w, w moim przypadku pozosta\u0142o tylko 10 milion\u00f3w archiw\u00f3w Bolt. Gdybym mia\u0142 mo\u017cliwo\u015b\u0107 zmiany obecnej struktury wype\u0142niania katalog\u00f3w plikami, by\u0107 mo\u017ce uda\u0142oby si\u0119 zredukowa\u0107 liczb\u0119 do oko\u0142o 1 miliona plik\u00f3w. <\/p>\n<p>Wszystkie ma\u0142e pliki s\u0105 pakowane w archiwa Bolt, kt\u00f3re automatycznie przyjmuj\u0105 nazwy katalog\u00f3w, w kt\u00f3rych si\u0119 znajduj\u0105, a wszystkie du\u017ce pliki pozostaj\u0105 obok archiw\u00f3w, nie ma sensu ich pakowa\u0107, to jest konfigurowalne. Ma\u0142e \u2013 archiwizujemy, du\u017ce \u2013 pozostawiamy bez zmian. Serwer dzia\u0142a przejrzy\u015bcie zar\u00f3wno z jednymi, jak i z drugimi.<\/p>\n<p><b>Architektura i cechy serwera wZD.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Skuteczne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie na w\u0142asnym serwerze\" src=\"\/wp-content\/uploads\/2020\/01\/38e2c6ad50bffe6c2ced460f8dc3e65a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSerwer dzia\u0142a pod kontrol\u0105 system\u00f3w operacyjnych Linux, BSD, Solaris i OSX. Testowa\u0142em tylko na architekturze AMD64 pod Linux, ale powinien r\u00f3wnie\u017c pasowa\u0107 do ARM64, PPC64, MIPS64.<\/p>\n<p><b>G\u0142\u00f3wne funkcje:<\/b><\/p>\n<ul>\n<li>Wielow\u0105tkowo\u015b\u0107;<\/li>\n<li>Wieloserwerowo\u015b\u0107, zapewniaj\u0105ca odporno\u015b\u0107 na awarie i zr\u00f3wnowa\u017cenie obci\u0105\u017cenia;<\/li>\n<li>Maksymalna przejrzysto\u015b\u0107 dla u\u017cytkownika lub programisty;<\/li>\n<li>Obs\u0142ugiwane metody HTTP: GET, HEAD, PUT i DELETE;<\/li>\n<li>Zarz\u0105dzanie zachowaniem przy odczycie i zapisie przez nag\u0142\u00f3wki klienta;<\/li>\n<li>Wsparcie dla elastycznie konfigurowalnych host\u00f3w wirtualnych;<\/li>\n<li>Wsparcie dla integralno\u015bci danych CRC podczas zapisu\/odczytu;<\/li>\n<li>P\u00f3\u0142dynamiczne bufory dla minimalnego zu\u017cycia pami\u0119ci i optymalnej konfiguracji wydajno\u015bci sieci;<\/li>\n<li>Op\u00f3\u017aniona kompresja danych;<\/li>\n<li>Dodatkowo dost\u0119pny jest wielow\u0105tkowy archiwizator wZA do migracji plik\u00f3w bez przerywania us\u0142ug.<\/li>\n<\/ul>\n<p>\n<b>Rzeczywiste do\u015bwiadczenie:<\/b><\/p>\n<p>Opracowywa\u0142em i testowa\u0142em serwer oraz archiwizator na rzeczywistych danych przez do\u015b\u0107 d\u0142ugi czas, obecnie dzia\u0142a on z powodzeniem w klastrze obejmuj\u0105cym 250 000 000 ma\u0142ych plik\u00f3w (zdj\u0119\u0107) rozmieszczonych w 15 000 000 katalog\u00f3w na oddzielnych dyskach SATA. Klastr 10 serwer\u00f3w stanowi serwer Origin, umieszczony za sieci\u0105 CDN. W jego obs\u0142ug\u0119 zaanga\u017cowane s\u0105 2 serwery Nginx i 2 serwery wZD.<\/p>\n<p>Ci, kt\u00f3rzy zdecyduj\u0105 si\u0119 na korzystanie z tego serwera, powinni zaplanowa\u0107 struktur\u0119 katalog\u00f3w przed u\u017cyciem, je\u015bli to mo\u017cliwe. Od razu zaznaczam, \u017ce serwer nie jest przeznaczony do tego, aby zgra\u0107 wszystko do jednego archiwum Bolt.<\/p>\n<p><b>Testowanie wydajno\u015bci:<\/b><\/p>\n<p>Im mniejszy rozmiar skompresowanego pliku, tym szybciej przeprowadzane s\u0105 operacje GET i PUT. Por\u00f3wnamy ca\u0142kowity czas zapisu klientem HTTP w zwyk\u0142ych plikach oraz w archiwach Bolt, a tak\u017ce odczytu. Por\u00f3wnywana jest praca z plikami o rozmiarach 32 KB, 256 KB, 1024 KB, 4096 KB i 32768 KB.<\/p>\n<p>Przy pracy z archiwami Bolt sprawdzana jest integralno\u015b\u0107 danych ka\u017cdego pliku (u\u017cywane jest CRC), przed zapisem oraz po zapisie nast\u0119puje odczyt na \u017cywo i przeliczanie, co naturalnie wprowadza op\u00f3\u017anienia, ale najwa\u017cniejsze \u2014 bezpiecze\u0144stwo danych. <\/p>\n<p>Testy wydajno\u015bci przeprowadza\u0142em na dyskach SSD, poniewa\u017c na dyskach SATA testy nie pokazuj\u0105 wyra\u017anej r\u00f3\u017cnicy.<\/p>\n<p><b>Wykresy wynik\u00f3w test\u00f3w:<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Skuteczne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie na w\u0142asnym serwerze\" src=\"\/wp-content\/uploads\/2020\/01\/298ae08420f476ebb128d5254921973a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Skuteczne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie na w\u0142asnym serwerze\" src=\"\/wp-content\/uploads\/2020\/01\/a7b081be88d894b50942a98f5a666e0e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJak wida\u0107, dla ma\u0142ych plik\u00f3w r\u00f3\u017cnica w czasie odczytu i zapisu mi\u0119dzy plikami archiwizowanymi a niearchiwizowanymi jest niewielka.<\/p>\n<p>Inny obraz uzyskujemy ju\u017c w te\u015bcie odczytu i zapisu plik\u00f3w o rozmiarze 32 MB:<\/p>\n<p><img decoding=\"async\" alt=\"Skuteczne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie na w\u0142asnym serwerze\" src=\"\/wp-content\/uploads\/2020\/01\/d908560a26df34c4253c5ed5bd879727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00f3\u017cnica w czasie mi\u0119dzy odczytem plik\u00f3w wynosi od 5 do 25 ms. Z zapisami jest gorzej, r\u00f3\u017cnica wynosi oko\u0142o 150 ms. Jednak w tym przypadku nie ma potrzeby zgrywania du\u017cych plik\u00f3w, po prostu nie ma sensu, mog\u0105 one \u017cy\u0107 oddzielnie od archiw\u00f3w.<\/p>\n<p>*Technicznie mo\u017cna u\u017cywa\u0107 tego serwera tak\u017ce do zada\u0144 wymagaj\u0105cych NoSQL.<\/p>\n<p><b>G\u0142\u00f3wne metody pracy z serwerem wZD:<\/b><\/p>\n<p>\u0141adowanie zwyk\u0142ego pliku:<\/p>\n<pre><code class=\"bash\">curl -X PUT --data-binary @test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nPrzesy\u0142anie pliku do archiwum Bolt (je\u015bli nie przekroczono serwerowego parametru fmaxsize, kt\u00f3ry okre\u015bla maksymalny rozmiar pliku, jaki mo\u017ce by\u0107 dodany do archiwum; je\u015bli przekroczono, plik zostanie przes\u0142any jak zwykle obok archiwum):<\/p>\n<pre><code class=\"bash\">curl -X PUT -H &quot;Archive: 1&quot; --data-binary @test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nPobieranie pliku (je\u015bli na dysku i w archiwum s\u0105 pliki o tych samych nazwach, priorytet przy pobieraniu domy\u015blnie przypisany jest plikowi niezaarchiwizowanemu):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nPobieranie pliku z archiwum Bolt (wymuszone):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg -H &quot;FromArchive: 1&quot; http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>Opisy innych metod znajduj\u0105 si\u0119 w dokumentacji.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">Dokumentacja wZD<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">Dokumentacja wZA<\/a><\/noindex><\/p>\n<p>Serwer obecnie obs\u0142uguje tylko protok\u00f3\u0142 HTTP, z HTTPS nie dzia\u0142a jeszcze. Metoda POST r\u00f3wnie\u017c nie jest wspierana (jeszcze nie podj\u0119to decyzji, czy jest potrzebna czy nie).<\/p>\n<p>Kto pokopuje si\u0119 w kodzie \u017ar\u00f3d\u0142owym, znajdzie tam irysk\u0119, kt\u00f3rej nie wszyscy lubi\u0105, ale nie powi\u0105za\u0142em g\u0142\u00f3wnego kodu z funkcjami frameworka webowego, poza obs\u0142ug\u0105 przerwa\u0144, wi\u0119c w przysz\u0142o\u015bci mog\u0119 szybko przepisa\u0107 prawie na dowolny silnik.<\/p>\n<p><b>Do zrobienia:<\/b><\/p>\n<ul>\n<li>Rozw\u00f3j w\u0142asnego replikatora i dystrybutora + geo dla mo\u017cliwo\u015bci wykorzystania w du\u017cych systemach bez klastrowych FS (wszystko na powa\u017cnie)<\/li>\n<li>Mo\u017cliwo\u015b\u0107 pe\u0142nego odwrotnego przywracania metadanych w przypadku ich ca\u0142kowitej utraty (w przypadku korzystania z dystrybutora)<\/li>\n<li>Nattywny protok\u00f3\u0142 dla mo\u017cliwo\u015bci u\u017cycia sta\u0142ych po\u0142\u0105cze\u0144 sieciowych i sterownik\u00f3w do r\u00f3\u017cnych j\u0119zyk\u00f3w programowania<\/li>\n<li>Rozbudowane mo\u017cliwo\u015bci wykorzystania komponent\u00f3w NoSQL<\/li>\n<li>Kompresja r\u00f3\u017cnych typ\u00f3w (gzip, zstd, snappy) dla plik\u00f3w lub warto\u015bci wewn\u0105trz archiw\u00f3w Bolt i dla zwyk\u0142ych plik\u00f3w<\/li>\n<li>Szyfrowanie r\u00f3\u017cnych typ\u00f3w dla plik\u00f3w lub warto\u015bci wewn\u0105trz archiw\u00f3w Bolt i dla zwyk\u0142ych plik\u00f3w<\/li>\n<li>Op\u00f3\u017aniona serwerowa konwersja wideo, w tym na GPU<\/li>\n<\/ul>\n<p>\nTo wszystko, mam nadziej\u0119, \u017ce ten serwer komu\u015b si\u0119 przyda, licencja BSD-3, podw\u00f3jne prawa autorskie, poniewa\u017c gdybym nie mia\u0142 firmy, w kt\u00f3rej pracuj\u0119, nie napisa\u0142bym i serwera. Jestem jedynym deweloperem. B\u0119d\u0119 wdzi\u0119czny za znalezione b\u0142\u0119dy i propozycje funkcji.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/484312\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0423\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0438 \u0432\u044b\u0434\u0430\u0447\u0435 \u0441\u043e\u0442\u0435\u043d \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f POSIX \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0441 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0445, \u0438 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0434\u0430\u0436\u0435 \u0443\u0436\u0435 \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u043e \u0445\u043e\u0434\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55408","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0442\u0435\u043d \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. Self-Hosted \u0440\u0435\u0448\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-19T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:31+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Efektywne przechowywanie setek milion\u00f3w ma\u0142ych plik\u00f3w. Rozwi\u0105zanie Self-Hosted | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0442\u0435\u043d \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. Self-Hosted \u0440\u0435\u0448\u0435\u043d\u0438\u0435 | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-19T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:31+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55408","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:44:26","updated":"2022-09-30 03:35:08","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/55408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=55408"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/55408\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=55408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=55408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=55408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}