{"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\/pt\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","title":{"rendered":"Armazenamento eficiente de centenas de milh\u00f5es de pequenos arquivos. Solu\u00e7\u00e3o Self-Hosted","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Armazenamento eficiente de centenas de milh\u00f5es de pequenos arquivos. Solu\u00e7\u00e3o Self-Hosted\" src=\"\/wp-content\/uploads\/2020\/01\/39cbe3b73cf4a20dba7e9383f922704f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrezada comunidade, este artigo ser\u00e1 dedicado ao armazenamento e \u00e0 entrega eficientes de centenas de milh\u00f5es de pequenos arquivos. Neste est\u00e1gio, apresentamos uma solu\u00e7\u00e3o final para sistemas de arquivos compat\u00edveis com POSIX, com suporte completo a bloqueios, incluindo cluster, e parece que at\u00e9 mesmo sem gambiarras.<\/p>\n<p>Por isso, para esse fim, escrevi meu pr\u00f3prio servidor especializado.<br \/>\nAo longo da implementa\u00e7\u00e3o dessa tarefa, consegui resolver o problema principal, ao mesmo tempo que economizei espa\u00e7o em disco e mem\u00f3ria RAM, que nossa sistema de arquivos de cluster consumia desenfreadamente. Tal quantidade de arquivos \u00e9 prejudicial para qualquer sistema de arquivos de cluster. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>A ideia \u00e9 a seguinte:<\/p>\n<p>De forma simples, por meio do servidor, pequenos arquivos s\u00e3o carregados, s\u00e3o salvos diretamente em um arquivo de arquivamento, e assim tamb\u00e9m s\u00e3o lidos dele, enquanto arquivos grandes s\u00e3o armazenados ao lado. Esquema: 1 pasta = 1 arquivo de arquivamento, resultando em v\u00e1rios milh\u00f5es de arquivos de arquivamento com pequenos arquivos, em vez de v\u00e1rias centenas de milh\u00f5es de arquivos. E tudo isso \u00e9 implementado de forma completa, sem quaisquer scripts e sem a distribui\u00e7\u00e3o de arquivos em arquivos tar\/zip.<\/p>\n<p>Tentarei ser breve, pe\u00e7o desculpas antecipadamente se o post for extenso.<\/p>\n<p>Tudo come\u00e7ou porque n\u00e3o consegui encontrar um servidor adequado que pudesse armazenar dados recebidos via protocolo HTTP diretamente em arquivos de arquivamento, de modo que n\u00e3o houvesse as desvantagens t\u00edpicas dos arquivos de arquivamento comuns e dos armazenamentos de objetos. O motivo da busca foi o Origin, um cluster que cresceu para grandes propor\u00e7\u00f5es com 10 servidores, que j\u00e1 acumulou 250.000.000 pequenos arquivos, e a tend\u00eancia de crescimento n\u00e3o parecia ter fim.<\/p>\n<p><b>Para aqueles que n\u00e3o gostam de ler artigos e preferem uma documenta\u00e7\u00e3o mais simples:<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">aqui<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">aqui<\/a><\/noindex>.<\/p>\n<p>E docker junto, atualmente h\u00e1 a op\u00e7\u00e3o apenas com nginx dentro, por precau\u00e7\u00e3o:<\/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>\nPr\u00f3ximo:<\/p>\n<p>Se houver muitos arquivos, s\u00e3o necess\u00e1rios recursos significativos e, o mais frustrante, parte deles \u00e9 desperdi\u00e7ada. Por exemplo, ao usar um sistema de arquivos em cluster (neste caso, o MooseFS), cada arquivo, independentemente do tamanho real, ocupa sempre no m\u00ednimo 64 KB. Ou seja, para arquivos de 3, 10 ou 30 KB, no disco, cada um requer 64 KB. Se houver um quarto de bilh\u00e3o de arquivos, perdemos entre 2 a 10 terabytes. N\u00e3o conseguiremos criar novos arquivos indefinidamente, pois no MooseFS h\u00e1 uma limita\u00e7\u00e3o: n\u00e3o mais de 1 bilh\u00e3o, com uma r\u00e9plica de cada arquivo.<\/p>\n<p>\u00c0 medida que o n\u00famero de arquivos aumenta, \u00e9 necess\u00e1ria uma grande quantidade de mem\u00f3ria RAM para os metadados. Al\u00e9m disso, grandes dumps de metadados frequentes aceleram o desgaste dos SSDs.<\/p>\n<p><b>Servidor wZD. Organizando os discos.<\/b><\/p>\n<p>O servidor \u00e9 escrito na linguagem Go. Antes de tudo, eu precisava reduzir a quantidade de arquivos. Como fazer isso? Atrav\u00e9s da arquiva\u00e7\u00e3o, mas neste caso sem compress\u00e3o, pois meus arquivos s\u00e3o apenas imagens comprimidas. O BoltDB foi \u00fatil, embora eu tivesse que corrigir algumas defici\u00eancias, o que est\u00e1 refletido na documenta\u00e7\u00e3o.<\/p>\n<p>Assim, em vez de um quarto de bilh\u00e3o de arquivos, fiquei apenas com 10 milh\u00f5es de arquivos Bolt. Se eu tivesse a oportunidade de mudar a estrutura atual de preenchimento de diret\u00f3rios com arquivos, poderia reduzir para cerca de 1 milh\u00e3o de arquivos. <\/p>\n<p>Todos os pequenos arquivos s\u00e3o empacotados em arquivos Bolt, que automaticamente recebem os nomes das pastas em que est\u00e3o, enquanto todos os arquivos grandes permanecem pr\u00f3ximos aos arquivos, pois n\u00e3o h\u00e1 sentido em empacot\u00e1-los, isso \u00e9 personaliz\u00e1vel. Arquivamos os pequenos e deixamos os grandes inalterados. O servidor funciona de forma transparente com ambos.<\/p>\n<p><b>Arquitetura e caracter\u00edsticas do servidor wZD.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Armazenamento eficiente de centenas de milh\u00f5es de pequenos arquivos. Solu\u00e7\u00e3o Self-Hosted\" src=\"\/wp-content\/uploads\/2020\/01\/38e2c6ad50bffe6c2ced460f8dc3e65a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO servidor funciona sob os sistemas operacionais Linux, BSD, Solaris e OSX. Eu testei apenas para a arquitetura AMD64 sob Linux, mas ele deve funcionar tamb\u00e9m para ARM64, PPC64, MIPS64.<\/p>\n<p><b>Principais caracter\u00edsticas:<\/b><\/p>\n<ul>\n<li>Multithreading;<\/li>\n<li>Multi-servidor, garantindo resili\u00eancia e balanceamento de carga;<\/li>\n<li>M\u00e1xima transpar\u00eancia para o usu\u00e1rio ou desenvolvedor;<\/li>\n<li>M\u00e9todos HTTP suportados: GET, HEAD, PUT e DELETE;<\/li>\n<li>Gerenciamento de comportamento de leitura e escrita atrav\u00e9s de cabe\u00e7alhos do cliente;<\/li>\n<li>Suporte a hosts virtuais configur\u00e1veis de forma flex\u00edvel;<\/li>\n<li>Suporte de integridade de dados CRC ao gravar\/ler;<\/li>\n<li>Buffers semi-din\u00e2micos para consumo m\u00ednimo de mem\u00f3ria e otimiza\u00e7\u00e3o do desempenho da rede;<\/li>\n<li>Compacta\u00e7\u00e3o de dados adiada;<\/li>\n<li>Al\u00e9m disso, oferece-se o arquivador multithread wZA para migra\u00e7\u00e3o de arquivos sem interrup\u00e7\u00e3o do servi\u00e7o.<\/li>\n<\/ul>\n<p>\n<b>Experi\u00eancia real:<\/b><\/p>\n<p>Desenvolvi e testei o servidor e o arquivador em dados reais por um longo per\u00edodo, e agora ele funciona com sucesso em um cluster que inclui 250.000.000 de pequenos arquivos (imagens), localizados em 15.000.000 diret\u00f3rios em discos SATA separados. O cluster \u00e9 composto por 10 servidores atuando como servidor de origem, instalado atr\u00e1s da rede CDN. Para seu suporte, s\u00e3o utilizados 2 servidores Nginx + 2 servidores wZD.<\/p>\n<p>Para aqueles que decidirem usar este servidor, faz sentido planejar a estrutura de diret\u00f3rios antes do uso, se aplic\u00e1vel. Devo esclarecer que o servidor n\u00e3o foi projetado para empacotar tudo em um \u00fanico arquivo Bolt.<\/p>\n<p><b>Teste de desempenho:<\/b><\/p>\n<p>Quanto menor o tamanho do arquivo compactado, mais r\u00e1pidas s\u00e3o as opera\u00e7\u00f5es GET e PUT realizadas com ele. Vamos comparar o tempo total de grava\u00e7\u00e3o de um cliente HTTP em arquivos normais e em arquivos Bolt, assim como a leitura. Vamos comparar o desempenho com arquivos de tamanhos de 32 KB, 256 KB, 1024 KB, 4096 KB e 32768 KB.<\/p>\n<p>Ao trabalhar com arquivos Bolt, a integridade de dados de cada arquivo \u00e9 verificada (usando CRC), sendo feita a leitura no ato e recalculo ap\u00f3s a grava\u00e7\u00e3o, o que, naturalmente, traz atrasos, mas o principal \u00e9 a seguran\u00e7a dos dados. <\/p>\n<p>Realizei os testes de desempenho em unidades SSD, pois em discos SATA os testes n\u00e3o mostraram uma diferen\u00e7a clara.<\/p>\n<p><b>Gr\u00e1ficos dos resultados dos testes:<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Armazenamento eficiente de centenas de milh\u00f5es de pequenos arquivos. Solu\u00e7\u00e3o Self-Hosted\" src=\"\/wp-content\/uploads\/2020\/01\/298ae08420f476ebb128d5254921973a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Armazenamento eficiente de centenas de milh\u00f5es de pequenos arquivos. Solu\u00e7\u00e3o Self-Hosted\" src=\"\/wp-content\/uploads\/2020\/01\/a7b081be88d894b50942a98f5a666e0e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo pode ser visto, para arquivos pequenos a diferen\u00e7a de tempo de leitura e grava\u00e7\u00e3o entre arquivos compactados e n\u00e3o compactados \u00e9 pequena.<\/p>\n<p>Uma imagem completamente diferente \u00e9 obtida ao testar a leitura e grava\u00e7\u00e3o de arquivos de 32 MB:<\/p>\n<p><img decoding=\"async\" alt=\"Armazenamento eficiente de centenas de milh\u00f5es de pequenos arquivos. Solu\u00e7\u00e3o Self-Hosted\" src=\"\/wp-content\/uploads\/2020\/01\/d908560a26df34c4253c5ed5bd879727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA diferen\u00e7a de tempo entre a leitura dos arquivos est\u00e1 na faixa de 5-25 ms. A grava\u00e7\u00e3o \u00e9 mais problem\u00e1tica, a diferen\u00e7a \u00e9 de cerca de 150 ms. Mas neste caso, n\u00e3o \u00e9 necess\u00e1rio carregar grandes arquivos, n\u00e3o faz sentido, eles podem viver separadamente dos arquivos compactados.<\/p>\n<p>*Tecnicamente, este servidor tamb\u00e9m pode ser usado para tarefas que exigem NoSQL.<\/p>\n<p><b>M\u00e9todos principais de opera\u00e7\u00e3o com o servidor wZD:<\/b><\/p>\n<p>Carregamento de um arquivo normal:<\/p>\n<pre><code class=\"bash\">curl -X PUT --data-binary @test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nCarregamento de arquivo para o Bolt archive (se o par\u00e2metro do servidor fmaxsize, que determina o tamanho m\u00e1ximo do arquivo que pode ser inclu\u00eddo no archive, n\u00e3o for excedido; caso contr\u00e1rio, o arquivo ser\u00e1 carregado normalmente ao lado do archive):<\/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>\nDownload de arquivo (se houver arquivos com o mesmo nome no disco e no archive, durante o download, a prioridade padr\u00e3o \u00e9 dada ao arquivo n\u00e3o compactado):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nDownload for\u00e7ado de arquivo do Bolt archive:<\/p>\n<pre><code class=\"bash\">curl -o test.jpg -H &quot;FromArchive: 1&quot; http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>A descri\u00e7\u00e3o de outros m\u00e9todos est\u00e1 na documenta\u00e7\u00e3o.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">Documenta\u00e7\u00e3o wZD<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">Documenta\u00e7\u00e3o wZA<\/a><\/noindex><\/p>\n<p>O servidor atualmente suporta apenas o protocolo HTTP, o HTTPS ainda n\u00e3o est\u00e1 funcionando. O m\u00e9todo POST tamb\u00e9m n\u00e3o \u00e9 suportado (ainda n\u00e3o foi decidido se \u00e9 necess\u00e1rio ou n\u00e3o).<\/p>\n<p>Quem investigar o c\u00f3digo-fonte encontrar\u00e1 um caramelinho, que nem todos gostam, mas eu n\u00e3o liguei o c\u00f3digo principal \u00e0s fun\u00e7\u00f5es do framework web, exceto o manipulador de interrup\u00e7\u00f5es, ent\u00e3o posso reescrever rapidamente em quase qualquer motor no futuro.<\/p>\n<p><b>ToDo:<\/b><\/p>\n<ul>\n<li>Desenvolvimento de um replicador e distribuidor pr\u00f3prio + geolocaliza\u00e7\u00e3o para possibilitar o uso em grandes sistemas sem sistemas de arquivos clusterizados (tudo de forma s\u00e9ria).<\/li>\n<li>Possibilidade de recupera\u00e7\u00e3o reversa completa de metadados em caso de perda total (caso use o distribuidor).<\/li>\n<li>Protocolo nativo para possibilitar o uso de conex\u00f5es de rede permanentes e drivers para diferentes linguagens de programa\u00e7\u00e3o.<\/li>\n<li>Recursos avan\u00e7ados para o uso da componente NoSQL.<\/li>\n<li>Compress\u00e3o de diferentes tipos (gzip, zstd, snappy) para arquivos ou valores dentro de archives Bolt e para arquivos comuns.<\/li>\n<li>Criptografia de diferentes tipos para arquivos ou valores dentro de archives Bolt e para arquivos comuns.<\/li>\n<li>Convers\u00e3o de v\u00eddeo no servidor com atraso, inclusive utilizando GPU.<\/li>\n<\/ul>\n<p>\nIsso \u00e9 tudo, espero que este servidor seja \u00fatil para algu\u00e9m, licen\u00e7a BSD-3, copyright duplo, pois se n\u00e3o fosse pela empresa onde trabalho, eu n\u00e3o teria escrito este servidor. Sou o \u00fanico desenvolvedor. Agrade\u00e7o por bugs encontrados e solicita\u00e7\u00f5es de funcionalidades.<br \/>\n<br \/>Fonte: <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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Armazenamento eficiente de centenas de milh\u00f5es de arquivos pequenos. Solu\u00e7\u00e3o Self-Hosted | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/55408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=55408"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55408\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=55408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=55408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=55408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}