{"id":69568,"date":"2020-02-20T15:24:23","date_gmt":"2020-02-20T12:24:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/google-cloud-spanner-horoshij-plohoj-zloj"},"modified":"2020-03-03T16:14:50","modified_gmt":"2020-03-03T13:14:50","slug":"google-cloud-spanner-horoshij-plohoj-zloj","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner: buono, cattivo, brutto","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Ciao, Habrov\u010dani. Tradizionalmente continuiamo a condividere contenuti interessanti in vista dell'inizio di nuovi corsi. Oggi, appositamente per voi, abbiamo tradotto un articolo su Google Cloud Spanner, collegandolo al lancio del corso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u00abAWS per sviluppatori\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: buono, cattivo, brutto\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Inizialmente pubblicato su <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">blog di Lightspeed HQ<\/a><\/noindex>.<\/i><\/p>\n<p>Come azienda che offre molteplici soluzioni POS cloud per rivenditori, ristoratori e venditori online in tutto il mondo, Lightspeed utilizza diversi tipi di piattaforme di database per molteplici casi d'uso transazionali, analitici e di ricerca. Ognuna di queste piattaforme database ha i propri punti di forza e di debolezza. Di conseguenza, quando Google ha presentato sul mercato Cloud Spanner, con funzionalit\u00e0 promettenti mai viste prima nel mondo dei database relazionali, come la scalabilit\u00e0 orizzontale praticamente illimitata e un accordo sul livello di servizio (SLA) del 99,999%, non potevamo lasciarci sfuggire l'opportunit\u00e0 di averlo tra le mani!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPer fornire una panoramica completa della nostra esperienza con Cloud Spanner e dei criteri di valutazione che abbiamo utilizzato, tratteremo i seguenti argomenti:<\/p>\n<ol>\n<li>I nostri criteri di valutazione<\/li>\n<li>Cloud Spanner in breve<\/li>\n<li>La nostra valutazione<\/li>\n<li>Le nostre conclusioni<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner: buono, cattivo, brutto\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. I nostri criteri di valutazione<\/h2>\n<p>\nPrima di addentrarci nelle caratteristiche di Cloud Spanner, nelle sue somiglianze e differenze rispetto ad altre soluzioni sul mercato, parliamo prima dei principali casi d'uso che abbiamo considerato quando ci siamo posti la domanda su dove implementare Cloud Spanner nella nostra infrastruttura:<\/p>\n<ul>\n<li>Come alternativa a (prevalentemente) una tradizionale soluzione di database SQL<\/li>\n<li>Come soluzione OLTP con supporto OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Nota:<\/b> Per semplicit\u00e0 e comodit\u00e0 di confronto, questo articolo confronta Cloud Spanner con MySQL nel contesto delle soluzioni GCP Cloud SQL e Amazon AWS RDS.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Utilizzo di Cloud Spanner come alternativa a una tradizionale soluzione di database SQL<\/h4>\n<p>\nIn un ambiente <i>di database <\/i>tradizionali, quando il tempo di risposta delle query al database si avvicina o supera i valori soglia predefiniti dall'applicazione (principalmente a causa dell'aumento del numero di utenti e\/o delle richieste), ci sono diversi modi per ridurre il tempo di risposta a livelli accettabili. Tuttavia, la maggior parte di queste soluzioni richiede un intervento manuale.<\/p>\n<p>Ad esempio, il primo passo da compiere \u00e8 esaminare i diversi parametri del database relativi alle prestazioni e configurarli in modo che corrispondano al meglio ai modelli di utilizzo delle applicazioni. Se ci\u00f2 non fosse sufficiente, si pu\u00f2 optare per il scaling verticale o orizzontale del database.<\/p>\n<p>Il scaling verticale di un'applicazione comporta l'upgrade dell'istanza del server, di solito aggiungendo un numero maggiore di processori\/core, una maggiore quantit\u00e0 di memoria RAM, uno storage pi\u00f9 veloce, ecc. L'aggiunta di maggiori risorse hardware porta a un incremento delle prestazioni del database, misurato principalmente in transazioni al secondo e latenza delle transazioni per i sistemi OLTP. I sistemi di database relazionali (che utilizzano un approccio multithread), come MySQL, scalano bene verticalmente.<\/p>\n<p>Questo approccio ha alcuni svantaggi, ma il pi\u00f9 ovvio \u00e8 la dimensione massima del server disponibile sul mercato. Una volta raggiunto il limite dell'istanza del server pi\u00f9 grande, l'unica strada rimanente \u00e8 lo scaling orizzontale.<\/p>\n<p>Lo scaling orizzontale \u00e8 un approccio in cui vengono aggiunti server al cluster per aumentare idealmente le prestazioni in modo lineare con l'aggiunta di nuovi server. La maggior parte <i>di database <\/i>dei sistemi di database scalano male orizzontalmente o non scalano affatto. Ad esempio, MySQL pu\u00f2 scalare orizzontalmente per le operazioni di lettura aggiungendo lettori slave, ma non pu\u00f2 scalare orizzontalmente per le operazioni di scrittura.<\/p>\n<p>D'altro canto, grazie alla sua natura, Cloud Spanner pu\u00f2 scalare facilmente orizzontalmente con un intervento minimo.<\/p>\n<p>Database a servizio<i> deve essere valutato da diverse angolazioni. Come base, abbiamo preso il database nel cloud pi\u00f9 popolare: per Google, GCP Cloud SQL e per Amazon, AWS RDS. Nella nostra valutazione ci siamo concentrati sulle seguenti categorie:<\/i> Confronto delle funzionalit\u00e0: estensione di SQL, DDL, DML; librerie di connessione\/connector, supporto per le transazioni e cos\u00ec via.<\/p>\n<ul>\n<li>Supporto per lo sviluppo: semplicit\u00e0 di sviluppo e test.<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438: \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>Supporto all'amministrazione: gestione delle istanze \u2013 ad esempio, scaling up\/down e aggiornamento delle istanze; SLA, backup e ripristino; sicurezza\/accesso controllato.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Utilizzo di Cloud Spanner come soluzione OLTP con supporto OLAP<\/h4>\n<p>\nSebbene Google non affermi esplicitamente che Cloud Spanner sia progettato per l'elaborazione analitica, condivide alcune caratteristiche con altri meccanismi, come Apache Impala &amp; Kudu e YugaByte, progettati per carichi di lavoro OLAP.<\/p>\n<p>Anche se ci fosse solo una piccola possibilit\u00e0 che Cloud Spanner includesse un motore HTAP (elaborazione ibrida transazionale\/analitica) scalabile orizzontalmente con un set di funzioni OLAP (pi\u00f9 o meno) utilizzabile, riteniamo che sarebbe degno della nostra attenzione.<\/p>\n<p>Tenendo conto di ci\u00f2, abbiamo considerato le seguenti categorie:<\/p>\n<ul>\n<li>Caricamento dati, indici e supporto per partizionamento<\/li>\n<li>Prestazioni delle query e DML<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner in poche parole<\/h2>\n<p>\nGoogle Spanner \u00e8 un sistema di gestione di database relazionali (RDBMS) a cluster che Google utilizza per diversi propri servizi. Google l'ha reso accessibile al pubblico per gli utenti della Google Cloud Platform all'inizio del 2017.<\/p>\n<p>Ecco alcune delle caratteristiche di Cloud Spanner:<\/p>\n<ul>\n<li>Cluster RDBMS altamente coerente e scalabile: utilizza la sincronizzazione hardware del tempo per garantire la coerenza dei dati.<\/li>\n<li>Supporto per transazioni cross-tabella: le transazioni possono coprire pi\u00f9 tabelle - non sono necessariamente limitate a una sola tabella (a differenza di Apache HBase o Apache Kudu).<\/li>\n<li>Tabelle basate su chiavi primarie: tutte le tabelle devono avere una chiave primaria (PK) dichiarata, che pu\u00f2 consistere in pi\u00f9 colonne della tabella. I dati della tabella sono archiviati in ordine PK, rendendoli molto efficienti e veloci da cercare per PK. Come altri sistemi basati su PK, l'implementazione deve essere modellata con attenzione considerando casi d'uso predefiniti per raggiungere <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">le migliori prestazioni<\/a><\/noindex>.<\/li>\n<li>Tabelle alternative: le tabelle possono avere dipendenze fisiche tra di loro. Le righe della tabella secondaria possono essere abbinate alle righe della tabella principale. Questo approccio accelera la ricerca delle relazioni che possono essere definite nella fase di modellazione dei dati, ad esempio, nella co-locazione di clienti e delle loro fatture.<\/li>\n<li>Indici: Cloud Spanner supporta indici secondari. Un indice \u00e8 composto da colonne indicizzate e da tutte le colonne della chiave primaria. Se lo desidera, l'indice pu\u00f2 contenere anche altre colonne non indicizzate. L'indice pu\u00f2 alternarsi alla tabella principale per accelerare le query. Su di esso si applicano vari vincoli, come il numero massimo di colonne aggiuntive memorizzate nell'indice. Anche le query tramite indici possono non essere cos\u00ec dirette come in altri RDBMS.<\/li>\n<\/ul>\n<p>\n<i>\u00abCloud Spanner sceglie automaticamente l'indice solo in rari casi. In particolare, Cloud Spanner non seleziona automaticamente un indice secondario se la query richiede colonne non memorizzate in <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">indice <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Accordo sul livello di servizio (SLA): distribuzione in una sola regione con SLA del 99,99%; distribuzioni multiregionali con SLA del 99,999%. Anche se l'accordo sul livello di servizio \u00e8 solo un accordo e non una garanzia, credo che i dipendenti di Google abbiano dati precisi per fare un'affermazione cos\u00ec seria. (Per riferimento, 99,999% significa 26,3 secondi di inattivit\u00e0 del servizio al mese).<\/li>\n<li>Di pi\u00f9: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/\">https:\/\/cloud.google.com\/spanner\/<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Nota:<\/b> Il progetto Apache Tephra aggiunge supporto avanzato per le transazioni in Apache HBase (ora implementato anche in Apache Phoenix come beta).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>3. La nostra valutazione<\/h2>\n<p>\nQuindi, abbiamo letto le dichiarazioni di Google sui vantaggi di Cloud Spanner: quasi illimitata scalabilit\u00e0 orizzontale mantenendo alta coerenza e un SLA molto elevato. Sebbene questi requisiti siano estremamente difficili da raggiungere, il nostro obiettivo non era quello di smentirli. Invece, concentriamoci su altre cose che preoccupano la maggior parte degli utenti di database: la praticit\u00e0 e la facilit\u00e0 d'uso.<\/p>\n<h4>Abbiamo valutato Cloud Spanner come sostituto di Sharded MySQL.<\/h4>\n<p>\nGoogle Cloud SQL e Amazon AWS RDS, due tra i sistemi di gestione di database relazionali (OLTP) pi\u00f9 popolari nel mercato del cloud, offrono un ampio set di funzionalit\u00e0. Tuttavia, per scalare questi database oltre le dimensioni di un singolo nodo, \u00e8 necessario eseguire la partizione delle applicazioni. Questo approccio crea ulteriore complessit\u00e0 sia per le applicazioni che per l'amministrazione. Abbiamo esaminato come Spanner si integra nello scenario di unione di pi\u00f9 segmenti in un'unica istanza e quali funzionalit\u00e0 (se ci sono) potrebbero dover essere sacrificati.<\/p>\n<h4>Supporto SQL, DML e DDL, oltre a connettore e librerie?<\/h4>\n<p>\nIn primo luogo, quando si inizia con qualsiasi database, \u00e8 necessario creare un modello di dati. Se pensi di poter collegare JDBC Spanner al tuo strumento SQL preferito, scoprirai che puoi interrogare i tuoi dati usando questo, ma non puoi utilizzarlo per creare tabelle o effettuare modifiche (DDL) o operazioni di inserimento\/aggiornamento\/cancellazione (DML). Il JDBC ufficiale di Google non supporta n\u00e9 l'uno n\u00e9 l'altro.<\/p>\n<blockquote><p><i>\u00abAttualmente i driver non supportano le operazioni DML o DDL\u00bb.<\/i><br \/>\nDocumentazione Spanner<\/p><\/blockquote>\n<p>\nCon la console GCP la situazione non \u00e8 migliore: puoi inviare solo interrogazioni SELECT. Fortunatamente, esiste un driver JDBC supportato dalla comunit\u00e0 che include DML e DDL, comprese le transazioni. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. Sebbene questo driver sia estremamente utile, sorprende l'assenza di un driver JDBC ufficiale da parte di Google. Fortunatamente, Google offre un'ampia supporto per librerie client (basate su gRPC): C#, Go, Java, node.js, PHP, Python e Ruby.<\/p>\n<p>L'uso quasi obbligatorio di API personalizzate di Cloud Spanner (a causa della mancanza di DDL e DML in JDBC) porta a alcune limitazioni per le aree correlate del codice, come pool di connessione o framework di binding del database (ad es., Spring MVC). In generale, con JDBC puoi scegliere liberamente il tuo pool di connessione preferito (ad es., HikariCP, DBCP, C3PO, ecc.) che \u00e8 stato testato e funziona bene. Nel caso delle API personalizzate di Spanner, dobbiamo fare affidamento sui framework\/pool di binding\/sessioni che abbiamo creato noi stessi.<\/p>\n<p>La struttura orientata alla chiave primaria (PK) consente a Cloud Spanner di essere molto veloce nell'accesso ai dati tramite PK, ma porta anche a alcuni problemi con le interrogazioni.<\/p>\n<ul>\n<li>Non puoi aggiornare il valore della chiave primaria; devi prima rimuovere la registrazione con la PK originale e reinserirla con il nuovo valore. (Questo \u00e8 simile ad altre basi di dati \/ meccanismi di archiviazione orientati alla PK.)<\/li>\n<li>Qualsiasi operatore UPDATE e DELETE deve specificare la PK nella clausola WHERE, pertanto non possono esserci operatori DELETE all'istante \u2014 deve sempre esserci una sottoquery, ad esempio: UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>Mancanza di un'opzione di auto-incremento o simili, che definisce la sequenza per il campo PK. Affinch\u00e9 questo funzioni, il valore corrispondente deve essere creato dal lato dell'applicazione.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Indici secondari?<\/h4>\n<p>\nGoogle Cloud Spanner ha un supporto integrato per indici secondari. Questa \u00e8 una caratteristica molto interessante, che non sempre \u00e8 presente in altre tecnologie. Apache Kudu attualmente non supporta affatto indici secondari, mentre Apache HBase non supporta indici direttamente, ma pu\u00f2 aggiungerli tramite Apache Phoenix.<\/p>\n<p>Gli indici in Kudu e HBase possono essere modellati come una tabella separata con un diverso insieme di chiavi primarie, ma l'atomicit\u00e0 delle operazioni eseguite con la tabella padre e le relative tabelle indice deve essere gestita a livello di applicazione e non \u00e8 banale in una corretta implementazione.<\/p>\n<p>Come accennato nella panoramica di Cloud Spanner, i suoi indici possono differire dagli indici MySQL. Pertanto, \u00e8 opportuno fare particolare attenzione nella costruzione delle query e nel profiling, per garantire l'utilizzo dell'indice appropriato dove necessario.<\/p>\n<h4>Vista?<\/h4>\n<p>\nUn oggetto molto popolare e utile nel database \u00e8 la vista. Possono essere utili per un gran numero di casi d'uso; i miei due preferiti sono il livello di astrazione logica e il livello di sicurezza. Sfortunatamente, Cloud Spanner NON supporta le viste. Tuttavia, questo limita solo parzialmente, poich\u00e9 non c'\u00e8 granularit\u00e0 in termini di colonne per le autorizzazioni di accesso, dove le viste possono essere una soluzione accettabile.<\/p>\n<p>Nella documentazione di Cloud Spanner, nella sezione in cui vengono descritti in dettaglio le quote e le limitazioni (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), ci sono, in particolare, alcune che possono essere problematiche per alcune applicazioni: Cloud Spanner ha un limite massimo di 100 database per istanza di default. \u00c8 chiaro che questo pu\u00f2 rappresentare un serio ostacolo per un database pensato per scalare oltre i 100 database. Fortunatamente, dopo aver parlato con il nostro rappresentante tecnico di Google, abbiamo scoperto che questo limite pu\u00f2 essere aumentato praticamente a qualsiasi valore tramite il supporto di Google.<\/p>\n<h4>Supporto allo sviluppo?<\/h4>\n<p>\nCloud Spanner offre un supporto abbastanza compatibile per i linguaggi di programmazione con la sua API. Le librerie ufficialmente supportate includono C#, Go, Java, node.js, PHP, Python e Ruby. La documentazione \u00e8 abbastanza dettagliata, ma, come nel caso di altre tecnologie avanzate, la comunit\u00e0 \u00e8 relativamente piccola rispetto alle tecnologie di database pi\u00f9 popolari, il che pu\u00f2 comportare un aumento del tempo necessario per risolvere casi d'uso o problemi meno comuni.<\/p>\n<h4>Quindi, che dire del supporto per lo sviluppo locale?<\/h4>\n<p>\nNon abbiamo trovato un modo per creare un'istanza di Cloud Spanner in un ambiente locale. La cosa pi\u00f9 vicina che abbiamo ottenuto \u00e8 un'immagine Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, che in teoria \u00e8 simile, ma nella pratica \u00e8 molto diversa. Ad esempio, CockroachDB pu\u00f2 utilizzare PostgreSQL JDBC. Poich\u00e9 l'ambiente di sviluppo deve essere il pi\u00f9 vicino possibile all'ambiente di produzione, Cloud Spanner non \u00e8 ideale, poich\u00e9 \u00e8 necessario fare affidamento su un'istanza Spanner completa. Per risparmiare costi, puoi scegliere un'istanza per una sola regione.<\/p>\n<h4>Supporto per l'amministrazione?<\/h4>\n<p>\nCreare un'istanza di Cloud Spanner \u00e8 molto semplice. Devi solo scegliere tra la creazione di un'istanza multiregionale o di un'istanza per una sola regione, specificare la regione(e) e il numero di nodi. In meno di un minuto, l'istanza sar\u00e0 attiva e pronta per l'uso.<\/p>\n<p>Diverse metriche di base sono direttamente disponibili nella pagina Spanner della console di Google. Visualizzazioni pi\u00f9 dettagliate sono disponibili tramite Stackdriver, dove puoi anche impostare soglie per le metriche e politiche di avviso.<\/p>\n<h4>Accesso alle risorse?<\/h4>\n<p>\nMySQL offre impostazioni di autorizzazione\/ruoli utente ampie e molto dettagliate. \u00c8 facile configurare l'accesso a una specifica tabella o anche a solo un sottoinsieme delle sue colonne. Cloud Spanner utilizza lo strumento Google Identity &amp; Access Management (IAM), che consente di stabilire politiche e autorizzazioni solo a un livello molto elevato. L'opzione pi\u00f9 dettagliata \u00e8 l'autorizzazione a livello di database, che non si adatta alla maggior parte degli scenari di produzione. Questa limitazione ti costringe ad aggiungere ulteriori misure di sicurezza nel tuo codice, infrastruttura, o entrambi, per prevenire l'uso non autorizzato delle risorse Spanner.<\/p>\n<h4>Backup?<\/h4>\n<p>\nParlando in modo semplice, non ci sono backup in Cloud Spanner. Anche se le elevate richieste del Google SLA possono garantire che tu non perda dati a causa di guasti hardware o del database, da errori umani, difetti delle applicazioni, ecc. Conosciamo tutti la regola: l'alta disponibilit\u00e0 non sostituisce una ragionevole strategia di backup. Al momento, l'unico modo per eseguire il backup dei dati \u00e8 trasmetterli in streaming dal database a un ambiente di archiviazione separato.<\/p>\n<h4>Prestazioni delle query?<\/h4>\n<p>\nPer il caricamento dei dati e il test delle query abbiamo utilizzato Yahoo! Cloud Serving Benchmark. Nella tabella seguente \u00e8 riportato il carico di lavoro B YCSB con un rapporto di lettura del 95% e scrittura del 5%.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: buono, cattivo, brutto\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Il test di carico \u00e8 stato eseguito su un motore di calcolo (CE) n1-standard-32 (32 vCPU, 120 GB di memoria), e l'istanza di test non \u00e8 mai stata un collo di bottiglia nei test.<\/i><br \/>\n<i>** Il numero massimo di thread in un'istanza YCSB \u00e8 di 400. Era necessario eseguire sei istanze parallele di test YCSB per ottenere un totale di 2400 thread.<\/i><\/p>\n<p>Osservando i risultati dei test, in particolare la combinazione del carico sulla CPU e del TPS, vediamo chiaramente che Cloud Spanner si scala molto bene. Un carico elevato, generato da un gran numero di thread, \u00e8 compensato da un maggior numero di nodi nel cluster Cloud Spanner. Sebbene la latenza sembri piuttosto alta, soprattutto con 2400 thread, potrebbe essere necessario un nuovo test con 6 istanze pi\u00f9 piccole del motore di calcolo per ottenere numeri pi\u00f9 precisi. Ogni istanza eseguir\u00e0 un test YCSB invece di una grande istanza CE con 6 test paralleli. In questo modo, sar\u00e0 pi\u00f9 facile distinguere le latenze delle richieste di Cloud Spanner e le latenze aggiunte dalla connessione di rete tra Cloud Spanner e l'istanza CE in cui viene eseguito il test.<\/p>\n<h3>Come se la cava Cloud Spanner come OLAP?<\/h3>\n<p><\/p>\n<h4>Partizionamento?<\/h4>\n<p>\nDividere i dati in segmenti fisicamente e\/o logicamente indipendenti, chiamati partizioni, \u00e8 un concetto molto popolare presente nella maggior parte dei meccanismi OLAP. Le partizioni possono migliorare significativamente le prestazioni delle query e la manutenibilit\u00e0 del database. Un'ulteriore analisi delle partizioni meriterebbe un articolo (o articoli) a parte, quindi limitiamoci a menzionare l'importanza di avere uno schema di partizionamento e sub-partizionamento. La possibilit\u00e0 di suddividere i dati in partizioni e persino ulteriormente in sub-partizioni \u00e8 fondamentale per le prestazioni delle query analitiche.<\/p>\n<p>Cloud Spanner non supporta particolarmente le partizioni. Divide i dati interni in quelli che vengono chiamati <i>split<\/i>- sulla base di intervalli di chiave primaria. La suddivisione avviene automaticamente per bilanciare il carico nel cluster Cloud Spanner. Una funzionalit\u00e0 molto utile di Cloud Spanner \u00e8 la suddivisione del carico di base della tabella principale (la tabella che non \u00e8 intercalata con un'altra). Spanner determina automaticamente se contiene <i>split <\/i>dati letti pi\u00f9 frequentemente rispetto ai dati in altri <i>split<\/i>- e pu\u00f2 decidere di suddividere ulteriormente. In questo modo, pi\u00f9 nodi possono essere coinvolti nella query, aumentando inoltre l'ampiezza di banda.<\/p>\n<h4>Caricamento dei dati?<\/h4>\n<p>\nIl metodo Cloud Spanner per i dati voluminosi \u00e8 lo stesso di un normale caricamento. Per raggiungere le massime prestazioni, \u00e8 necessario seguire alcune raccomandazioni, tra cui:<\/p>\n<ul>\n<li>Ordina i tuoi dati in base alla chiave primaria.<\/li>\n<li>Dividili in 10*<i>numero di nodi<\/i> sezioni separate.<\/li>\n<li>Crea un insieme di task di lavoro che caricano i dati in parallelo.<\/li>\n<\/ul>\n<p>\nCon questo caricamento di dati, vengono utilizzati tutti i nodi di Cloud Spanner.<\/p>\n<p>Abbiamo utilizzato il carico di lavoro A YCSB per generare un insieme di dati di 10M righe.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: buono, cattivo, brutto\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Il test di carico \u00e8 stato eseguito su un motore computazionale n1-standard-32 (32 vCPU, 120 GB di memoria), e l'istanza di test non \u00e8 mai stata un collo di bottiglia nei test.<br \/>\n** La configurazione con 1 nodo non \u00e8 raccomandata per alcun carico di lavoro di produzione.<\/i><\/p>\n<p>Come accennato in precedenza, Cloud Spanner gestisce automaticamente gli split in base al loro carico, quindi i risultati migliorano dopo alcuni ripetizioni consecutive del test. I risultati presentati qui sono i migliori che abbiamo ottenuto. Guardando i numeri sopra, possiamo vedere come Cloud Spanner si scala (bene) con l'aumento del numero di nodi nel cluster. I numeri che emergono rappresentano latenze medie estremamente basse, che contrastano con i risultati di carichi di lavoro misti (95% in lettura e 5% in scrittura), come descritto nella sezione precedente.<\/p>\n<h4>Scalabilit\u00e0?<\/h4>\n<p>\nAumentare e diminuire il numero di nodi di Cloud Spanner \u00e8 un compito eseguibile con un clic. Se desideri caricare rapidamente i dati, puoi considerare di potenziare l'istanza al massimo (nel nostro caso erano 25 nodi nella regione US-EAST), e poi ridurre il numero di nodi adatti al tuo carico di lavoro normale, dopo che tutti i dati sono nel database, tenendo presente il limite di 2 TB\/nodo.<\/p>\n<p>Ci \u00e8 stato ricordato di questo limite anche con un database molto pi\u00f9 piccolo. Dopo diverse esecuzioni di test di carico, il nostro database aveva una dimensione di circa 155 GB, e riducendo a un'istanza di 1 nodo abbiamo ricevuto il seguente errore:<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: buono, cattivo, brutto\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSiamo riusciti a ridurre la scala da 25 a 2 istanze, ma ci siamo bloccati su due nodi.<\/p>\n<p>L'aumento e la riduzione del numero di nodi nel cluster Cloud Spanner possono essere automatizzati tramite REST API. Questo pu\u00f2 essere particolarmente utile per ridurre un carico eccessivo sul sistema durante le ore di punta.<\/p>\n<h4>Prestazioni delle query OLAP?<\/h4>\n<p>\nInizialmente prevedevamo di dedicare tempo significativo alla nostra valutazione di Spanner su questa parte. Dopo alcune SELECT COUNT, abbiamo subito capito che il test sarebbe stato breve e che Spanner NON sarebbe stato adatto come motore OLAP. Indipendentemente dal numero di nodi nel cluster, una semplice query per contare le righe in una tabella di 10 milioni di righe ha impiegato tra i 55 e i 60 secondi. Inoltre, qualsiasi query che richiedeva una maggiore quantit\u00e0 di memoria per memorizzare i risultati intermedi si \u00e8 conclusa con un errore OOM.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M valori distinti) -&gt; SpoolingHashAggregateIterator ha esaurito la memoria durante la nuova riga.<\/code><\/p>\n<p>Alcuni dati per le query TPC-H possono essere trovati nell'articolo di Todd Lipkon <noindex><a rel=\"nofollow\" href=\"https:\/\/kudu.apache.org\/2017\/10\/23\/nosql-kudu-spanner-slides.html\">Nosql-kudu-spanner-slides.html<\/a><\/noindex>, diapositive 42 e 43. Questi dati sono in linea con i nostri risultati (sfortunatamente).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: buono, cattivo, brutto\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. Le nostre conclusioni<\/h4>\n<p>\nData l'attuale stato delle funzionalit\u00e0 di Cloud Spanner, \u00e8 difficile immaginarlo come una semplice sostituzione delle attuali soluzioni OLTP, soprattutto quando le tue esigenze supereranno le sue capacit\u00e0. Sarebbe necessario dedicare un periodo di tempo significativo per costruire una soluzione tenendo conto delle carenze di Cloud Spanner.<\/p>\n<p>Quando abbiamo iniziato la valutazione di Cloud Spanner, ci aspettavamo che le sue funzionalit\u00e0 di gestione fossero al livello, o almeno non molto distanti, da altre soluzioni Google SQL. Ma siamo rimasti sorpresi dalla totale assenza di backup e dal controllo degli accessi ai risorse molto limitato. Per non parlare dell'assenza di viste, della mancanza di un ambiente di sviluppo locale, delle sequenze non supportate, di JDBC senza supporto per DML e DDL e cos\u00ec via.<\/p>\n<p>Quindi, dove andare per chi deve scalare un database transazionale? Sembra che attualmente non ci sia una soluzione unica sul mercato che si adatti a tutti i casi d'uso. Esistono molte soluzioni con codice sorgente chiuso e aperto (alcune delle quali vengono menzionate in questo articolo), ognuna delle quali ha i propri punti di forza e di debolezza, ma nessuna di esse offre un SaaS con SLA al 99,999% e un alto grado di coerenza. Se un alto livello di SLA \u00e8 il tuo obiettivo principale e non hai intenzione di creare una soluzione personalizzata per pi\u00f9 ambienti cloud, Cloud Spanner potrebbe rivelarsi la soluzione che stai cercando. Ma devi conoscere tutte le sue limitazioni.<\/p>\n<p>A onor del vero, va detto che Cloud Spanner \u00e8 stato reso accessibile solo nella primavera del 2017, quindi \u00e8 ragionevole aspettarsi che alcuni dei suoi attuali difetti possano eventualmente scomparire (speriamo), e quando ci\u00f2 accadr\u00e0, potrebbe cambiare le regole del gioco. Dopotutto, Cloud Spanner non \u00e8 solo un progetto secondario per Google. Google lo usa come base per altri prodotti Google. E quando Google ha recentemente sostituito Megastore in Google Cloud Storage con Cloud Spanner, ci\u00f2 ha permesso a Google Cloud Storage di diventare fortemente coerente per le liste degli oggetti a livello globale (il che non si applica ancora a <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">Amazon\u2019s<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">S3<\/a><\/noindex>).<\/p>\n<p>Quindi, c'\u00e8 ancora speranza\u2026 speriamo.<\/p>\n<p>Questo \u00e8 tutto. Come l'autore dell'articolo, anche noi continuiamo a sperare, e tu cosa ne pensi al riguardo? Scrivi nei commenti<\/p>\n<p><b>Invitiamo tutti gli interessati a visitare il nostro <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">un webinar gratuito<\/a><\/noindex> durante il quale parleremo in dettaglio del corso<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u00abAWS per sviluppatori\u00bb<\/a><\/noindex> di OTUS.<\/b><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/489012\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043c\u044b \u043f\u0440\u0435\u0432\u0435\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u043e Google Cloud Spanner, \u043f\u0440\u0438\u0443\u0440\u043e\u0447\u0438\u0432 \u0435\u0435 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u0443\u0440\u0441\u0430 \u00abAWS \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432\u00bb. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u043b\u043e\u0433\u0435 Lightspeed HQ. \u041a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 POS-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u0446\u0435\u0432, \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, Lightspeed \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69569,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69568","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\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\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\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\udd47Google Cloud Spanner: \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\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-02-20T12:24:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:50+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\udd47Google Cloud Spanner: il buono, il brutto, il cattivo | ProHoster","description":"Ciao, hubber. Tradizionalmente continuiamo a condividere materiale interessante in vista dell'inizio di nuovi corsi.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","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\udd47Google Cloud Spanner: \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","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-02-20T12:24:23+00:00","article:modified_time":"2020-03-03T13:14:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69568","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:20:25","updated":"2022-09-30 15:10:07","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\/69568","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=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}