{"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\/it\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","title":{"rendered":"Archiviazione efficace di centinaia di milioni di piccoli file. Soluzione self-hosted","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Archiviazione efficace di centinaia di milioni di piccoli file. Soluzione self-hosted\" src=\"\/wp-content\/uploads\/2020\/01\/39cbe3b73cf4a20dba7e9383f922704f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGentile comunit\u00e0, questo articolo sar\u00e0 dedicato alla memorizzazione e distribuzione efficace di centinaia di milioni di piccoli file. In questa fase, viene proposta una soluzione finale per i sistemi di file compatibili con POSIX, con supporto completo per il blocco, incluso quello cluster, e sembra che anche senza soluzioni temporanee.<\/p>\n<p>Pertanto, per questo scopo ho scritto il mio server specializzato.<br \/>\nDurante l'implementazione di questo compito sono riuscito a risolvere il problema principale e nel contempo ottenere un risparmio di spazio su disco e di memoria, che la nostra infrastruttura di file cluster consumava. In effetti, una tale quantit\u00e0 di file \u00e8 dannosa per qualsiasi sistema di file cluster. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>L'idea \u00e8 questa:<\/p>\n<p>In parole semplici, attraverso il server vengono caricati piccoli file, che vengono salvati direttamente in un archivio e letti allo stesso modo, mentre i file grandi vengono posizionati accanto. Schema: 1 cartella = 1 archivio, il che significa che abbiamo diversi milioni di archivi con piccoli file, invece di diverse centinaia di milioni di file. E tutto ci\u00f2 \u00e8 realizzato in modo completo, senza alcun script o distribuzione di file in archivi tar\/zip.<\/p>\n<p>Cercher\u00f2 di esprimermi in modo pi\u00f9 conciso, mi scuso in anticipo se il post sar\u00e0 denso.<\/p>\n<p>Tutto \u00e8 iniziato perch\u00e9 non riuscivo a trovare un server adatto nel mondo che potesse salvare i dati ricevuti tramite il protocollo HTTP direttamente negli archivi, evitando gli svantaggi tipici degli archivi comuni e degli oggetti di memorizzazione. La ragione della mia ricerca \u00e8 stata un cluster Origin di 10 server cresciuto enormemente, in cui si erano accumulati gi\u00e0 250.000.000 piccoli file, e la tendenza alla crescita non accennava a fermarsi.<\/p>\n<p><b>Per chi non ama leggere articoli e preferisce una documentazione pi\u00f9 semplice:<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">qui<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">qui<\/a><\/noindex>.<\/p>\n<p>E anche con Docker, al momento c'\u00e8 un'opzione solo insieme a nginx per sicurezza:<\/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>\nSuccessivamente:<\/p>\n<p>Se ci sono molti file, sono necessarie risorse significative, e la cosa pi\u00f9 frustrante \u00e8 che parte di esse va sprecata. Ad esempio, nell'utilizzare un file system a cluster (in questo caso, MooseFS) un file, indipendentemente dalla dimensione reale, occupa sempre almeno 64 KB. Ci\u00f2 significa che per file delle dimensioni di 3, 10 o 30 KB su disco servono 64 KB. Se ci sono un quarto di miliardo di file, perdiamo da 2 a 10 terabyte. Non \u00e8 possibile creare nuovi file all'infinito, poich\u00e9 anche in MooseFS c'\u00e8 un limite: non pi\u00f9 di 1 miliardo con una replica di ciascun file.<\/p>\n<p>Con l'aumentare del numero di file, \u00e8 necessaria molta memoria RAM per i metadati. Inoltre, i grandi dump di metadati frequenti contribuiscono all'usura degli SSD.<\/p>\n<p><b>Server wZD. Mettiamo ordine nei dischi.<\/b><\/p>\n<p>Il server \u00e8 scritto in linguaggio Go. Prima di tutto, dovevo ridurre il numero di file. Come farlo? Attraverso l'archiviazione, ma in questo caso senza compressione, poich\u00e9 i miei file sono immagini compresse. A soccorrere \u00e8 arrivato BoltDB, a cui ho dovuto rimuovere alcune carenze, come indicato nella documentazione.<\/p>\n<p>In totale, invece di un quarto di miliardo di file, nel mio caso sono rimasti solo 10 milioni di archivi Bolt. Se avessi potuto cambiare la struttura attuale di riempimento delle directory con i file, sarebbe stato possibile ridurre a circa 1 milione di file. <\/p>\n<p>Tutti i file piccoli vengono impacchettati in archivi Bolt, che ricevono automaticamente i nomi delle directory in cui si trovano, mentre tutti i file di grandi dimensioni rimangono accanto agli archivi, non ha senso impacchettarli, \u00e8 configurabile. Piccoli \u2014 archiviati, grandi \u2014 lasciati invariati. Il server funziona in modo trasparente con entrambi.<\/p>\n<p><b>Architettura e caratteristiche del server wZD.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Archiviazione efficace di centinaia di milioni di piccoli file. Soluzione self-hosted\" src=\"\/wp-content\/uploads\/2020\/01\/38e2c6ad50bffe6c2ced460f8dc3e65a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl server funziona sotto i sistemi operativi Linux, BSD, Solaris e OSX. Ho testato solo per l'architettura AMD64 su Linux, ma dovrebbe funzionare anche per ARM64, PPC64, MIPS64.<\/p>\n<p><b>Caratteristiche principali:<\/b><\/p>\n<ul>\n<li>Multithreading;<\/li>\n<li>Multi-server, offrendo tolleranza ai guasti e bilanciamento del carico;<\/li>\n<li>Massima trasparenza per l'utente o lo sviluppatore;<\/li>\n<li>Metodi HTTP supportati: GET, HEAD, PUT e DELETE;<\/li>\n<li>Gestione del comportamento durante la lettura e la scrittura tramite intestazioni client;<\/li>\n<li>Supporto per host virtuali configurabili in modo flessibile;<\/li>\n<li>Supporto per la verifica di integrit\u00e0 dei dati CRC durante la scrittura\/lettura;<\/li>\n<li>Buffer semi-dinamici per un consumo minimo di memoria e un'ottimizzazione delle prestazioni di rete;<\/li>\n<li>Compattazione dei dati in attesa;<\/li>\n<li>Inoltre, \u00e8 disponibile l'archiviatore multithreading wZA per la migrazione dei file senza fermare il servizio.<\/li>\n<\/ul>\n<p>\n<b>Esperienza reale:<\/b><\/p>\n<p>Ho sviluppato e testato un server e un archiviatore su dati in tempo reale per un periodo piuttosto lungo, e ora funziona con successo su un cluster che include 250.000.000 file di piccole dimensioni (immagini), situati in 15.000.000 directory su dischi SATA separati. Il cluster, composto da 10 server, funge da server Origin, posizionato dietro una rete CDN. Per la sua gestione, sono utilizzati 2 server Nginx + 2 server wZD.<\/p>\n<p>A coloro che decidono di utilizzare questo server, ha senso pianificare la struttura delle directory prima dell'uso, se applicabile. Preciso subito che il server non \u00e8 destinato a contenere tutto in un solo archivio Bolt.<\/p>\n<p><b>Test delle prestazioni:<\/b><\/p>\n<p>Pi\u00f9 piccolo \u00e8 il file archiviato, pi\u00f9 velocemente sono eseguite le operazioni GET e PUT su di esso. Confrontiamo il tempo totale di scrittura da parte di un client HTTP su file normali e su archivi Bolt, cos\u00ec come la lettura. Viene confrontato il lavoro con file di dimensioni 32 KB, 256 KB, 1024 KB, 4096 KB e 32768 KB.<\/p>\n<p>Durante l'uso degli archivi Bolt, viene verificata l'integrit\u00e0 dei dati di ogni file (viene utilizzato il CRC), e sia prima che dopo la scrittura avviene una lettura in tempo reale e un ricalcolo; questo naturalmente introduce dei ritardi, ma la cosa principale \u00e8 la sicurezza dei dati. <\/p>\n<p>Ho effettuato i test delle prestazioni su unit\u00e0 SSD, poich\u00e9 sui dischi SATA i test non mostrano differenze chiare.<\/p>\n<p><b>Grafici dei risultati dei test:<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Archiviazione efficace di centinaia di milioni di piccoli file. Soluzione self-hosted\" src=\"\/wp-content\/uploads\/2020\/01\/298ae08420f476ebb128d5254921973a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Archiviazione efficace di centinaia di milioni di piccoli file. Soluzione self-hosted\" src=\"\/wp-content\/uploads\/2020\/01\/a7b081be88d894b50942a98f5a666e0e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCome si pu\u00f2 vedere, per file di piccole dimensioni la differenza nel tempo di lettura e scrittura tra file archiviati e non archiviati \u00e8 ridotta.<\/p>\n<p>Una situazione completamente diversa si avr\u00e0 nel test di lettura e scrittura di file di dimensioni 32 MB:<\/p>\n<p><img decoding=\"async\" alt=\"Archiviazione efficace di centinaia di milioni di piccoli file. Soluzione self-hosted\" src=\"\/wp-content\/uploads\/2020\/01\/d908560a26df34c4253c5ed5bd879727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa differenza di tempo tra la lettura dei file \u00e8 nell'ordine dei 5-25 ms. Per quanto riguarda la scrittura, la situazione \u00e8 peggiore, la differenza \u00e8 di circa 150 ms. Tuttavia, in questo caso non \u00e8 necessario caricare file di grandi dimensioni, non ha semplicemente senso; possono vivere separatamente dagli archivi.<\/p>\n<p>*Tecnicamente, \u00e8 possibile utilizzare questo server anche per compiti che richiedono NoSQL.<\/p>\n<p><b>Principali metodi di lavoro con il server wZD:<\/b><\/p>\n<p>Caricamento di un file normale:<\/p>\n<pre><code class=\"bash\">curl -X PUT --data-binary @test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nCaricamento di un file in un archivio Bolt (se non viene superato il parametro server fmaxsize, che determina la dimensione massima del file che pu\u00f2 essere incluso nell'archivio; se viene superato, il file verr\u00e0 caricato normalmente accanto all'archivio):<\/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 del file (se sul disco e nell'archivio ci sono file con nomi identici, il file non compresso ha la priorit\u00e0 di default durante il download):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nDownload del file dall'archivio Bolt (forzato):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg -H &quot;FromArchive: 1&quot; http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>La descrizione di altri metodi \u00e8 disponibile nella documentazione.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wzd\/blob\/master\/README-RUS.md\">Documentazione wZD<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/eltaline\/wza\/blob\/master\/README-RUS.md\">Documentazione wZA<\/a><\/noindex><\/p>\n<p>Il server attualmente supporta solo il protocollo HTTP, mentre HTTPS non \u00e8 ancora funzionante. Anche il metodo POST non \u00e8 supportato (non \u00e8 ancora stato deciso se sia necessario o meno).<\/p>\n<p>Chi scaver\u00e0 nel codice sorgente trover\u00e0 una caramella, non tutti la amano, ma non ho legato il codice principale alle funzioni del framework web, tranne per il gestore delle eccezioni, quindi in futuro posso riscriverlo rapidamente su quasi qualsiasi motore.<\/p>\n<p><b>ToDo:<\/b><\/p>\n<ul>\n<li>Sviluppo di un proprio replicatore e distributore + geo per la possibilit\u00e0 di utilizzo in grandi sistemi senza sistemi di file cluster (Tutto da adulti)<\/li>\n<li>Possibilit\u00e0 di un recupero completo e inverso dei metadati in caso di perdita totale (nel caso di utilizzo del distributore)<\/li>\n<li>Protocollo nativo per la possibilit\u00e0 di utilizzare connessioni di rete permanenti e driver per diversi linguaggi di programmazione<\/li>\n<li>Maggiore utilizzo delle funzionalit\u00e0 NoSQL<\/li>\n<li>Compressioni di vari tipi (gzip, zstd, snappy) per file o valori all'interno degli archivi Bolt e per file normali<\/li>\n<li>Crittografia di vari tipi per file o valori all'interno degli archivi Bolt e per file normali<\/li>\n<li>Conversione video server ritardata, inclusa quella su GPU<\/li>\n<\/ul>\n<p>\nHo finito, spero che questo server possa essere utile a qualcuno, licenza BSD-3, copyright doppio, poich\u00e9 non ci sarebbe stata l'azienda in cui lavoro, non avrei scritto il server. Sono un sviluppatore singolo. Sar\u00f2 grato per bug trovati e richieste di funzionalit\u00e0.<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.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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Efficient storage of hundreds of millions of small files. Soluzione Self-Hosted | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/effektivnoe-hranenie-soten-millionov-malenkih-fajlov-self-hosted-reshenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/55408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=55408"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/55408\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=55408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=55408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=55408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}