{"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\/cs\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","title":{"rendered":"Efektivn\u00ed ulo\u017een\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Efektivn\u00ed ulo\u017een\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed\" src=\"\/wp-content\/uploads\/2020\/01\/39cbe3b73cf4a20dba7e9383f922704f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u00e1\u017een\u00e9 komunito, tento \u010dl\u00e1nek bude v\u011bnov\u00e1n efektivn\u00edmu ukl\u00e1d\u00e1n\u00ed a vyd\u00e1v\u00e1n\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. V t\u00e9to f\u00e1zi p\u0159edstavujeme kone\u010dn\u00e9 \u0159e\u0161en\u00ed pro souborov\u00e9 syst\u00e9my kompatibiln\u00ed s POSIX, s plnou podporou z\u00e1mk\u016f, v\u010detn\u011b clusterov\u00fdch, a podle v\u0161eho u\u017e i bez nucen\u00fdch \u0159e\u0161en\u00ed.<\/p>\n<p>Proto jsem k tomuto \u00fa\u010delu napsal sv\u016fj vlastn\u00ed specializovan\u00fd server.<br \/>\nB\u011bhem realizace t\u00e9to \u00falohy se poda\u0159ilo vy\u0159e\u0161it hlavn\u00ed probl\u00e9m a z\u00e1rove\u0148 dos\u00e1hnout \u00faspory diskov\u00e9ho prostoru a opera\u010dn\u00ed pam\u011bti, kterou ne\u00faprosn\u011b vy\u017eadoval n\u00e1\u0161 clusterov\u00fd souborov\u00fd syst\u00e9m. Takov\u00e9 mno\u017estv\u00ed soubor\u016f je zkr\u00e1tka \u0161kodliv\u00e9 pro jak\u00fdkoli clusterov\u00fd souborov\u00fd syst\u00e9m. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Idea je takov\u00e1:<\/p>\n<p>Jednodu\u0161e \u0159e\u010deno, skrze server se nahr\u00e1vaj\u00ed mal\u00e9 soubory, ty se ukl\u00e1daj\u00ed p\u0159\u00edmo do archivu a takt\u00e9\u017e se z n\u011bj \u010dtou, zat\u00edmco velk\u00e9 soubory se ukl\u00e1daj\u00ed vedle. Sch\u00e9ma: 1 slo\u017eka = 1 archiv, tak\u017ee m\u00e1me n\u011bkolik milion\u016f archiv\u016f s mal\u00fdmi soubory, a ne n\u011bkolik stovek milion\u016f soubor\u016f. A to v\u0161e je pln\u011b realizov\u00e1no, bez jak\u00fdchkoli skript\u016f a rozkl\u00e1d\u00e1n\u00ed soubor\u016f do tar\/zip arch\u00edv\u016f.<\/p>\n<p>Pokou\u0161\u00edm se to shrnout, p\u0159edem se omlouv\u00e1m, pokud bude p\u0159\u00edsp\u011bvek obs\u00e1hl\u00fd.<\/p>\n<p>V\u0161e za\u010dalo t\u00edm, \u017ee jsem nedok\u00e1zal naj\u00edt vhodn\u00fd server na sv\u011bt\u011b, kter\u00fd by mohl ukl\u00e1dat data z\u00edskan\u00e1 p\u0159es HTTP protokol p\u0159\u00edmo do archiv\u016f, aby se p\u0159ede\u0161lo nedostatk\u016fm typick\u00fdm pro b\u011b\u017en\u00e9 archivy a objektov\u00e1 \u00falo\u017ei\u0161t\u011b. D\u016fvodem pro hled\u00e1n\u00ed byl rozrostl\u00fd Origin cluster o 10 serverech, ve kter\u00e9m se ji\u017e nashrom\u00e1\u017edilo 250 000 000 mal\u00fdch soubor\u016f a trend r\u016fstu nebyl ochoten se zastavit.<\/p>\n<p><b>T\u011bm, kdo nemaj\u00ed r\u00e1di \u010dten\u00ed \u010dl\u00e1nk\u016f, a drobn\u00e1 dokumentace je jednodu\u0161\u0161\u00ed:<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">tady<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">tady<\/a><\/noindex>.<\/p>\n<p>A docker z\u00e1rove\u0148, te\u010f je k dispozici pouze s nginx uvnit\u0159 pro jistotu:<\/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>\nDal\u0161\u00ed:<\/p>\n<p>Pokud je soubor\u016f velmi mnoho, jsou pot\u0159ebn\u00e9 zna\u010dn\u00e9 zdroje, a co je nejhor\u0161\u00ed, \u010d\u00e1st z nich zbyte\u010dn\u011b miz\u00ed. Nap\u0159\u00edklad p\u0159i pou\u017eit\u00ed clusterov\u00e9ho souborov\u00e9ho syst\u00e9mu (v tomto p\u0159\u00edpad\u011b MooseFS) soubor, bez ohledu na skute\u010dnou velikost, v\u017edy zab\u00edr\u00e1 minim\u00e1ln\u011b 64 KB. To znamen\u00e1, \u017ee pro soubory o velikosti 3, 10 nebo 30 KB je na disku pot\u0159eba 64 KB. Pokud m\u00e1me \u010dtvrt miliardy soubor\u016f, ztr\u00e1c\u00edme 2 a\u017e 10 terabajt\u016f. Nov\u00e9 soubory nelze vytv\u00e1\u0159et do nekone\u010dna, proto\u017ee v MooseFS existuje omezen\u00ed: maxim\u00e1ln\u011b 1 miliarda p\u0159i jedn\u00e9 replikaci ka\u017ed\u00e9ho souboru.<\/p>\n<p>S r\u016fstem po\u010dtu soubor\u016f je pot\u0159eba hodn\u011b pam\u011bti RAM pro metadata. Tak\u00e9 \u010dast\u00e9 velk\u00e9 dumpy metadat p\u0159isp\u00edvaj\u00ed k opot\u0159eben\u00ed SSD \u00falo\u017ei\u0161\u0165.<\/p>\n<p><b>Server wZD. Ukl\u00edz\u00edme na disc\u00edch.<\/b><\/p>\n<p>Server je naps\u00e1n v jazyce Go. P\u0159edev\u0161\u00edm jsem pot\u0159eboval sn\u00ed\u017eit po\u010det soubor\u016f. Jak toho dos\u00e1hnout? Archivac\u00ed, ale v tomto p\u0159\u00edpad\u011b bez komprese, proto\u017ee moje soubory jsou pouze zkomprimovan\u00e9 obr\u00e1zky. Na pomoc p\u0159i\u0161la BoltDB, kterou bylo t\u0159eba zbavit nedostatk\u016f, co\u017e je uvedeno v dokumentaci.<\/p>\n<p>Celkem m\u00edsto \u010dtvrt miliardy soubor\u016f mi z\u016fstalo jen 10 milion\u016f Bolt archiv\u016f. Kdybych m\u011bl mo\u017enost zm\u011bnit aktu\u00e1ln\u00ed strukturu napl\u0148ov\u00e1n\u00ed adres\u00e1\u0159\u016f soubory, bylo by mo\u017en\u00e9 ji mo\u017en\u00e1 zkr\u00e1tit na p\u0159ibli\u017en\u011b 1 milion soubor\u016f. <\/p>\n<p>V\u0161echny mal\u00e9 soubory jsou baleny do Bolt archiv\u016f, kter\u00e9 automaticky z\u00edsk\u00e1vaj\u00ed n\u00e1zvy adres\u00e1\u0159\u016f, ve kter\u00fdch se nach\u00e1zej\u00ed, a v\u0161echny velk\u00e9 soubory z\u016fst\u00e1vaj\u00ed bl\u00edzko archiv\u016f, nem\u00e1 smysl je balit, to je nastaviteln\u00e9. Mal\u00e9 \u2013 archivujeme, velk\u00e9 \u2013 nech\u00e1v\u00e1me beze zm\u011bn. Server funguje transparentn\u011b s ob\u011bma typy.<\/p>\n<p><b>Architektura a vlastnosti serveru wZD.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Efektivn\u00ed ulo\u017een\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed\" src=\"\/wp-content\/uploads\/2020\/01\/38e2c6ad50bffe6c2ced460f8dc3e65a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nServer funguje pod opera\u010dn\u00edmi syst\u00e9my Linux, BSD, Solaris a OSX. Testoval jsem pouze pro architekturu AMD64 pod Linuxem, ale m\u011bl by vyhovovat i pro ARM64, PPC64, MIPS64.<\/p>\n<p><b>Hlavn\u00ed funkce:<\/b><\/p>\n<ul>\n<li>V\u00edcevl\u00e1knovost;<\/li>\n<li>Mnoho-serverovost, zaji\u0161\u0165uj\u00edc\u00ed vysokou dostupnost a vyv\u00e1\u017een\u00ed z\u00e1t\u011b\u017ee;<\/li>\n<li>Maxim\u00e1ln\u00ed transparentnost pro u\u017eivatele nebo v\u00fdvoj\u00e1\u0159e;<\/li>\n<li>Podporovan\u00e9 HTTP metody: GET, HEAD, PUT a DELETE;<\/li>\n<li>Spr\u00e1va chov\u00e1n\u00ed p\u0159i \u010dten\u00ed a z\u00e1pisu pomoc\u00ed klientsk\u00fdch hlavi\u010dek;<\/li>\n<li>Podpora flexibiln\u011b nastaviteln\u00fdch virtu\u00e1ln\u00edch hostitel\u016f;<\/li>\n<li>Podpora CRC integrity dat p\u0159i z\u00e1pisu\/\u010dten\u00ed;<\/li>\n<li>Polodynamick\u00e9 bufferov\u00e1n\u00ed pro minim\u00e1ln\u00ed spot\u0159ebu pam\u011bti a optim\u00e1ln\u00ed nastaven\u00ed s\u00ed\u0165ov\u00e9ho v\u00fdkonu;<\/li>\n<li>Odlo\u017een\u00e1 kompaktace dat;<\/li>\n<li>K dispozici je tak\u00e9 v\u00edcerozm\u011brn\u00fd archiva\u010dn\u00ed n\u00e1stroj wZA pro migraci soubor\u016f bez p\u0159eru\u0161en\u00ed slu\u017eby.<\/li>\n<\/ul>\n<p>\n<b>Skute\u010dn\u00e9 zku\u0161enosti:<\/b><\/p>\n<p>Dlouhou dobu jsem vyv\u00edjel a testoval server a archiva\u010dn\u00ed n\u00e1stroj na \u017eiv\u00fdch datech, nyn\u00ed \u00fasp\u011b\u0161n\u011b funguje na clusteru obsahuj\u00edc\u00edm 250 000 000 mal\u00fdch soubor\u016f (obr\u00e1zk\u016f) um\u00edst\u011bn\u00fdch ve 15 000 000 adres\u00e1\u0159\u00edch na odd\u011blen\u00fdch SATA disc\u00edch. Cluster ze 10 server\u016f slou\u017e\u00ed jako Origin server um\u00edst\u011bn\u00fd za CDN s\u00edt\u00ed. Pro jeho \u00fadr\u017ebu jsou pou\u017eity 2 servery Nginx + 2 servery wZD.<\/p>\n<p>Ti, kte\u0159\u00ed se rozhodnou pou\u017e\u00edt tento server, by m\u011bli p\u0159ed pou\u017eit\u00edm napl\u00e1novat strukturu adres\u00e1\u0159\u016f, pokud je to mo\u017en\u00e9. Okam\u017eit\u011b dod\u00e1v\u00e1m, \u017ee server nen\u00ed ur\u010den k tomu, aby v\u0161echno bylo ulo\u017eeno do 1 Bolt archivu.<\/p>\n<p><b>Testov\u00e1n\u00ed v\u00fdkonu:<\/b><\/p>\n<p>\u010c\u00edm men\u0161\u00ed je velikost archivovan\u00e9ho souboru, t\u00edm rychleji se prov\u00e1d\u011bj\u00ed operace GET a PUT. Porovn\u00e1me celkov\u00fd \u010das z\u00e1pisu HTTP klientem do oby\u010dejn\u00fdch soubor\u016f a do Bolt archiv\u016f, stejn\u011b jako \u010dten\u00ed. Porovn\u00e1 se pr\u00e1ce se soubory velikosti 32 KB, 256 KB, 1024 KB, 4096 KB a 32768 KB.<\/p>\n<p>P\u0159i pr\u00e1ci s Bolt archivy je kontrolov\u00e1na integrita dat ka\u017ed\u00e9ho souboru (pou\u017e\u00edv\u00e1 se CRC), p\u0159ed z\u00e1pisem a tak\u00e9 po z\u00e1pisu se prov\u00e1d\u00ed \u010dten\u00ed za chodu a p\u0159epo\u010det, co\u017e samoz\u0159ejm\u011b p\u0159in\u00e1\u0161\u00ed zpo\u017ed\u011bn\u00ed, ale hlavn\u011b \u2014 bezpe\u010dnost dat. <\/p>\n<p>Testy v\u00fdkonu jsem prov\u00e1d\u011bl na SSD \u00falo\u017ei\u0161t\u00edch, proto\u017ee na SATA disc\u00edch testy neukazuj\u00ed jasn\u00fd rozd\u00edl.<\/p>\n<p><b>Grafy podle v\u00fdsledk\u016f testov\u00e1n\u00ed:<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Efektivn\u00ed ulo\u017een\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed\" src=\"\/wp-content\/uploads\/2020\/01\/298ae08420f476ebb128d5254921973a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Efektivn\u00ed ulo\u017een\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed\" src=\"\/wp-content\/uploads\/2020\/01\/a7b081be88d894b50942a98f5a666e0e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJak vidno, pro mal\u00e9 soubory je rozd\u00edl v \u010dase \u010dten\u00ed a z\u00e1pisu mezi archivovan\u00fdmi a nearchivovan\u00fdmi soubory minim\u00e1ln\u00ed.<\/p>\n<p>U testu \u010dten\u00ed a z\u00e1pisu soubor\u016f o velikosti 32 MB z\u00edsk\u00e1me zcela jin\u00fd obraz:<\/p>\n<p><img decoding=\"async\" alt=\"Efektivn\u00ed ulo\u017een\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed\" src=\"\/wp-content\/uploads\/2020\/01\/d908560a26df34c4253c5ed5bd879727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRozd\u00edl v \u010dase mezi \u010dten\u00edm soubor\u016f je v rozmez\u00ed 5-25 ms. Se z\u00e1pisem je situace hor\u0161\u00ed, rozd\u00edl \u010din\u00ed p\u0159ibli\u017en\u011b 150 ms. V tomto p\u0159\u00edpad\u011b v\u0161ak nen\u00ed pot\u0159eba nahr\u00e1vat velk\u00e9 soubory, v tom prost\u011b nen\u00ed smysl, mohou existovat odd\u011blen\u011b od archiv\u016f.<\/p>\n<p>*Technicky lze tento server pou\u017e\u00edvat i pro \u00fakoly vy\u017eaduj\u00edc\u00ed NoSQL.<\/p>\n<p><b>Hlavn\u00ed metody pr\u00e1ce se serverem wZD:<\/b><\/p>\n<p>Nahr\u00e1n\u00ed oby\u010dejn\u00e9ho souboru:<\/p>\n<pre><code class=\"bash\">curl -X PUT --data-binary @test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nNahr\u00e1n\u00ed souboru do Bolt archivu (pokud nebyl p\u0159ekro\u010den serverov\u00fd parametr fmaxsize, ur\u010duje maxim\u00e1ln\u00ed velikost souboru, kter\u00fd m\u016f\u017ee b\u00fdt zahrnut do archivu; pokud je p\u0159ekro\u010den, soubor se nahr\u00e1v\u00e1 norm\u00e1ln\u011b vedle archivu):<\/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>\nStahov\u00e1n\u00ed souboru (pokud jsou na disku a v archivu soubory se stejn\u00fdmi n\u00e1zvy, p\u0159i stahov\u00e1n\u00ed m\u00e1 p\u0159ednost p\u0159\u00edstupn\u00fd soubor):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nStahov\u00e1n\u00ed souboru z Bolt archivu (n\u00e1siln\u011b):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg -H &quot;FromArchive: 1&quot; http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>Popis dal\u0161\u00edch metod je v dokumentaci.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">Dokumentace wZD<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">Dokumentace wZA<\/a><\/noindex><\/p>\n<p>Server zat\u00edm podporuje pouze protokol HTTP, s HTTPS zat\u00edm nefunguje. Tak\u00e9 nen\u00ed podporov\u00e1na metoda POST (je\u0161t\u011b nen\u00ed rozhodnuto, zda je pot\u0159ebn\u00e1 nebo ne).<\/p>\n<p>Kdo se pod\u00edv\u00e1 do zdrojov\u00e9ho k\u00f3du, najde tam bonb\u00f3n, ne ka\u017ed\u00fd ho m\u00e1 r\u00e1d, ale j\u00e1 jsem z\u00e1kladn\u00ed k\u00f3d nenav\u00e1zal na funkce webov\u00e9ho frameworku krom\u011b obsluhy p\u0159eru\u0161en\u00ed, tak\u017ee pozd\u011bji mohu rychle p\u0159epsat t\u00e9m\u011b\u0159 na jak\u00fdkoli engine.<\/p>\n<p><b>ToDo:<\/b><\/p>\n<ul>\n<li>V\u00fdvoj vlastn\u00edho replik\u00e1toru a distributora + geo pro mo\u017enost pou\u017eit\u00ed ve velk\u00fdch syst\u00e9mech bez clusterov\u00fdch FS (V\u0161e v\u00e1\u017en\u011b)<\/li>\n<li>Mo\u017enost \u00fapln\u00e9ho reverzn\u00edho obnoven\u00ed metadat p\u0159i jejich \u00fapln\u00e9 ztr\u00e1t\u011b (v p\u0159\u00edpad\u011b pou\u017eit\u00ed distributora)<\/li>\n<li>Nativn\u00ed protokol pro mo\u017enost pou\u017eit\u00ed trval\u00fdch s\u00ed\u0165ov\u00fdch p\u0159ipojen\u00ed a ovlada\u010de pro r\u016fzn\u00e9 programovac\u00ed jazyky<\/li>\n<li>Roz\u0161\u00ed\u0159en\u00e9 mo\u017enosti vyu\u017eit\u00ed slo\u017eky NoSQL<\/li>\n<li>Komprese r\u016fzn\u00fdch typ\u016f (gzip, zstd, snappy) pro soubory nebo hodnoty uvnit\u0159 Bolt archiv\u016f a pro b\u011b\u017en\u00e9 soubory<\/li>\n<li>\u0160ifrov\u00e1n\u00ed r\u016fzn\u00fdch typ\u016f pro soubory nebo hodnoty uvnit\u0159 Bolt archiv\u016f a pro b\u011b\u017en\u00e9 soubory<\/li>\n<li>Olo\u017een\u00e1 serverov\u00e1 video konverze, v\u010detn\u011b GPU<\/li>\n<\/ul>\n<p>\nTo je v\u0161e, douf\u00e1m, \u017ee tento server n\u011bkomu p\u0159ijde k u\u017eitku, licence BSD-3, dvoustup\u0148ov\u00fd copyright, proto\u017ee kdyby nebylo firmy, kde pracuji, nenapsal bych ani server. Jsem v\u00fdvoj\u00e1\u0159 v jednotn\u00e9m \u010d\u00edsle. Budu vd\u011b\u010dn\u00fd za nalezen\u00e9 chyby a \u017e\u00e1dosti o funkce.<br \/>\n<br \/>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Efektivn\u00ed ukl\u00e1d\u00e1n\u00ed stovek milion\u016f mal\u00fdch soubor\u016f. Self-Hosted \u0159e\u0161en\u00ed | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/55408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=55408"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/55408\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=55408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=55408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=55408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}