{"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 all'archiviazione e distribuzione efficiente di centinaia di milioni di piccoli file. In questa fase, viene proposto una soluzione finale per i file system compatibili con POSIX, con pieno supporto per il locking, inclusi quelli cluster, e sembra anche senza workaround.<\/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, contemporaneamente, a ottenere un risparmio di spazio su disco e memoria RAM, che la nostra file system cluster consumava in modo implacabile. Infatti, un numero cos\u00ec elevato di file \u00e8 dannoso per qualsiasi file system cluster. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>L'idea \u00e8 questa:<\/p>\n<p>In parole semplici, i piccoli file vengono caricati tramite il server, vengono salvati direttamente in un archivio e letti da esso, mentre i file pi\u00f9 grandi vengono collocati a fianco. Schema: 1 cartella = 1 archivio, quindi abbiamo diversi milioni di archivi con piccoli file, e non solo centinaia di milioni di file. E tutto questo \u00e8 realizzato in modo completo, senza script e senza distribuire file in archivi tar\/zip.<\/p>\n<p>Cercher\u00f2 di essere conciso, mi scuso in anticipo se il post risulter\u00e0 denso.<\/p>\n<p>Tutto \u00e8 iniziato quando non sono riuscito a trovare un server adatto nel mondo, capace di memorizzare i dati ricevuti tramite il protocollo HTTP direttamente in archivi, evitando i difetti associati ai tradizionali archivi e ai sistemi di storage oggettuali. La causa di questa ricerca \u00e8 stato un cluster Origin, cresciuto a dimensioni notevoli, composto da 10 server e che aveva accumulato gi\u00e0 250.000.000 di piccoli file, con una tendenza alla crescita che non accennava a fermarsi.<\/p>\n<p><b>Per chi non ama leggere articoli e troverebbe pi\u00f9 semplice una breve documentazione:<\/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 docker insieme, al momento \u00e8 disponibile solo con nginx all'interno, per ogni evenienza:<\/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>\nAvanti:<\/p>\n<p>Se i file sono molto numerosi, sono necessarie risorse significative e, il pi\u00f9 frustrante, parte di esse si perde inutilmente. Ad esempio, utilizzando un file system cluster (nel caso specifico, MooseFS), un file, indipendentemente dalle dimensioni effettive, occupa sempre almeno 64 KB. Quindi per file delle dimensioni di 3, 10 o 30 KB, sul disco \u00e8 necessario allocare 64 KB. Se ci sono 250 milioni di file, perdiamo da 2 a 10 terabyte. Creare nuovi file all'infinito non sar\u00e0 possibile, poich\u00e9 in MooseFS c'\u00e8 un limite: non pi\u00f9 di 1 miliardo per ogni replica di ciascun file.<\/p>\n<p>Man mano che il numero di file aumenta, \u00e8 necessaria molta memoria RAM per i metadati. Inoltre, frequenti grandi dump di metadati contribuiscono all'usura degli SSD.<\/p>\n<p><b>Server wZD. Facciamo ordine nei dischi.<\/b><\/p>\n<p>Il server \u00e8 scritto in 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. In aiuto \u00e8 venuto BoltDB, che ho dovuto anche ottimizzare, come indicato nella documentazione.<\/p>\n<p>Invece di un quarto di miliardo di file, nel mio caso sono rimasti solo 10 milioni di archivi Bolt. Se avessi la possibilit\u00e0 di modificare l'attuale struttura di riempimento delle directory con i file, si potrebbe ridurre fino a circa 1 milione di file. <\/p>\n<p>Tutti i file di piccole dimensioni vengono impacchettati in archivi Bolt, ricevendo automaticamente i nomi delle directory in cui si trovano, mentre i file di grandi dimensioni rimangono accanto agli archivi, non ha senso impacchettarli, questo \u00e8 configurabile. I piccoli file vengono archiviati, i grandi restano invariati. Il server funziona in modo trasparente sia con l'uno che con l'altro.<\/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 per garantire ridondanza 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 di lettura e scrittura tramite intestazioni client;<\/li>\n<li>Supporto per host virtuali configurabili in modo flessibile;<\/li>\n<li>Supporto CRC per l'integrit\u00e0 dei dati 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 con ritardo;<\/li>\n<li>In aggiunta, \u00e8 disponibile l'archiviatore multithread wZA per la migrazione dei file senza interrompere il servizio.<\/li>\n<\/ul>\n<p>\n<b>Esperienza reale:<\/b><\/p>\n<p>Ho sviluppato e testato il server e l'archiviatore su dati reali per un lungo periodo; attualmente, \u00e8 funzionante con successo su un cluster che include 250.000.000 di piccoli file (immagini), situati in 15.000.000 di directory su dischi SATA separati. Il cluster di 10 server funge da server Origin, collocato dietro una rete CDN. Per la sua gestione utilizziamo 2 server Nginx + 2 server wZD.<\/p>\n<p>Per coloro che decidono di utilizzare questo server, \u00e8 utile pianificare la struttura delle directory prima dell'uso, se applicabile. Preciso subito che il server non \u00e8 progettato per contenere tutto in un solo archivio Bolt.<\/p>\n<p><b>Test delle prestazioni:<\/b><\/p>\n<p>Minore \u00e8 la dimensione del file compresso, pi\u00f9 veloce sar\u00e0 l'esecuzione delle operazioni GET e PUT. Confrontiamo il tempo totale di scrittura del client HTTP in file normali rispetto agli 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'utilizzo degli archivi Bolt, viene verificata l'integrit\u00e0 dei dati di ciascun file (si utilizza CRC); prima e dopo la scrittura, viene eseguita una lettura on-the-fly e un ricalcolo, il che naturalmente introduce ritardi, ma la cosa pi\u00f9 importante \u00e8 la sicurezza dei dati. <\/p>\n<p>Ho effettuato test di prestazioni su unit\u00e0 SSD, poich\u00e9 i test su dischi SATA non mostrano differenze chiare.<\/p>\n<p><b>Grafici sui risultati del 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 dimensioni ridotte la differenza nel tempo di lettura e scrittura tra file compressi e non compressi \u00e8 minima.<\/p>\n<p>Gi\u00e0 durante il test di lettura e scrittura di file di dimensioni 32 MB otteniamo un quadro completamente diverso:<\/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 compresa tra 5 e 25 ms. Le cose si complicano con la scrittura, dove la differenza \u00e8 di circa 150 ms. Ma in questo caso non \u00e8 necessario caricare file di grandi dimensioni, non ha senso, possono esistere separatamente dagli archivi.<\/p>\n<p>*Tecnicamente \u00e8 possibile utilizzare questo server anche per compiti che richiedono NoSQL.<\/p>\n<p><b>I principali metodi di utilizzo del 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 archivio Bolt (se non supera il parametro del server fmaxsize, che definisce la dimensione massima del file che pu\u00f2 essere incluso nell'archivio; in caso contrario, 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>\nScaricamento di un file (se ci sono file con nomi identici sia sul disco che nell'archivio, al momento del download la priorit\u00e0 per impostazione predefinita viene data al file non archiviato):<\/p>\n<pre><code class=\"bash\">curl -o test.jpg http:\/\/localhost\/test\/test.jpg<\/code><\/pre>\n<p>\nScaricamento forzato di un file dall'archivio Bolt:<\/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, HTTPS non \u00e8 ancora operativo. Inoltre, non supporta il metodo POST (non \u00e8 ancora stato deciso se sia necessario o meno).<\/p>\n<p>Chi scaver\u00e0 nel codice sorgente trover\u00e0 un caramello, che non a tutti piace, ma non ho legato il codice principale alle funzioni del framework web, tranne che per il gestore delle interruzioni, quindi in futuro posso riscriverlo rapidamente su quasi qualsiasi motore.<\/p>\n<p><b>ToDo:<\/b><\/p>\n<ul>\n<li>Sviluppo di un replicatore e distributore personalizzato + geolocalizzazione per l'utilizzo in grandi sistemi senza file system clusterizzati (tutto in modo professionale)<\/li>\n<li>Possibilit\u00e0 di recupero completo e reversibile dei metadati in caso di perdita totale (in caso di utilizzo del distributore)<\/li>\n<li>Protocollo nativo per garantire connessioni di rete permanenti e driver per diversi linguaggi di programmazione<\/li>\n<li>Funzionalit\u00e0 avanzate per l'utilizzo delle componenti NoSQL<\/li>\n<li>Compressioni di diversi tipi (gzip, zstd, snappy) per file o valori all'interno di archivi Bolt e per file normali<\/li>\n<li>Crittografia di diversi tipi per file o valori all'interno di archivi Bolt e per file normali<\/li>\n<li>Conversione video server-side posticipata, inclusa quella su GPU<\/li>\n<\/ul>\n<p>\nHo finito, spero che questo server possa tornare utile a qualcuno, licenza BSD-3, copyright doppio, poich\u00e9 senza l'azienda in cui lavoro non avrei scritto il server. Sono lo sviluppatore unico. Apprezzer\u00f2 eventuali 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.0.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.0.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\udd47Archiviazione efficace di centinaia di milioni di piccoli file. 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}]}}