Esegui la migrazione di Spanner in un database in dialetto PostgreSQL

Questa pagina descrive le considerazioni chiave e i passaggi da seguire per eseguire la migrazione da Spanner a un altro database in dialetto PostgreSQL se vuoi spostare un'applicazione da Spanner o da Google Cloud. Puoi anche utilizzare le informazioni riportate in questa pagina se devi comprendere o dimostrare la fattibilità del trasferimento del database, ad esempio per la pianificazione di emergenza in caso di uscita in condizioni di stress.

L'interfaccia PostgreSQL di Spanner è la scelta migliore per le applicazioni che richiedono la possibilità di eseguire il deployment in un altro ambiente compatibile con PostgreSQL, all'interno di Google Cloudo altrove. Grazie alla sintassi familiare e ai client standard dell'ecosistema PostgreSQL, l'interfaccia PostgreSQL consente a sviluppatori e operatori di utilizzare le proprie conoscenze e competenze PostgreSQL esistenti.

Utilizza la stessa infrastruttura di rete, archiviazione distribuita, coordinamento delle transazioni ed elaborazione delle query del dialetto GoogleSQL. Se hai bisogno di un database che supporti la portabilità, non dovrai rinunciare ai vantaggi di scalabilità, coerenza o rapporto prezzo/prestazioni di Spanner quando selezioni l'interfaccia PostgreSQL.

Scopri di più sulle differenze tra i dialetti PostgreSQL e Google SQL in Spanner.

In linea generale, la procedura prevede i seguenti passaggi:

  1. Rimuovi le estensioni specifiche di Spanner dalle query e dalle istruzioni DDL.
  2. Esegui la migrazione dello schema
  3. Esegui la migrazione dei dati
  4. Esegui la migrazione dell'applicazione

Considerazioni specifiche di Spanner

L'interfaccia PostgreSQL di Spanner supporta le query PostgreSQL out of the box, pertanto la maggior parte delle query SQL eseguite su un database in dialetto PostgreSQL di Spanner ha lo stesso comportamento di altri database compatibili con PostgreSQL. Con questo approccio, il numero di modifiche SQL e di accesso ai dati necessarie per spostare un'applicazione da una piattaforma all'altra è probabilmente ridotto. In questo modo, il processo di porting è più rapido, semplice e meno soggetto a errori rispetto a un database con un dialetto GoogleSQL simile.

Oltre a un'ampia compatibilità con PostgreSQL, l'interfaccia PostgreSQL offre una serie di estensioni specifiche di Spanner. Se utilizzi queste estensioni nelle tue applicazioni, dovrai rimuoverle o mapparle manualmente alle funzionalità PostgreSQL. Alcuni esempi degni di nota sono riportati nelle Estensioni della sintassi delle query e nelle Estensioni per la gestione dello schema (DDL).

Estensioni della sintassi delle query

L'interfaccia PostgreSQL di Spanner fornisce un numero di estensioni specifiche di Spanner. La maggior parte utilizza il prefisso spanner. per l'identificazione. Nella tabella seguente sono elencate queste estensioni e le azioni che potresti dover intraprendere prima che la stessa applicazione possa essere eseguita su un database PostgreSQL.

Tipo di estensione Estensioni specifiche Azioni da eseguire prima della migrazione
Funzioni specifiche di Spanner Trova le funzioni con prefisso spanner. e rimuovi queste chiamate.
Estensioni di tipo Rimuovi la sintassi VECTOR LENGTH o valuta la possibilità di utilizzare pgvector.
Sintassi delle query Non è richiesta alcuna azione perché i suggerimenti sono rappresentati all'interno dei commenti.
Per informazioni dettagliate sulle considerazioni sul rendimento, consulta Migrazione delle query.
Stored procedure di sistema Rimuovi le chiamate a spanner.cancel_query().
Se vuoi, puoi sostituire le chiamate con un equivalente PostgreSQL.
Operazioni SET/SHOW Può essere ignorato perché PostgreSQL non ha parametri integrati che iniziano con spanner., pertanto l'impostazione di eventuali variabili con questo prefisso non ha alcun impatto sul comportamento previsto.

Estensioni di gestione dello schema (DDL)

Spanner offre una serie di estensioni relative alla gestione dei dati, come descritto nella pagina Data Definition Language (DDL).

Estensione Azioni da eseguire prima della migrazione
Tabelle interlacciate
Consentono di collocare in modo co-localizzato i dati correlati many-to-one nello spazio di archiviazione fisico, rendendo i join tra di essi molto più efficienti.
Rimuovi la clausola INTERLEAVE IN.
Timestamp di commit
Consente di memorizzare in modo atomico il timestamp di commit di una transazione in una colonna.
Sostituisci SPANNER.COMMIT_TIMESTAMP con un tipo di timestamp PostgreSQL e gestisci l'impostazione del timestamp nella tua applicazione o rimuovi la colonna.
Recupero point-in-time
Fornisce protezione contro eliminazioni o scritture accidentali.
Rimuovi eventuali istruzioni DDL che impostano spanner.version_retention_period.
Durata (TTL)
Richiede l'eliminazione automatica dei record in base alla data di creazione.
Rimuovi la clausola TTL INTERVAL. Valuta la possibilità di utilizzare un cron o un'attività pianificata per eliminare periodicamente i dati obsoleti. righe.
Opzioni di ottimizzazione
Consente di impostare opzioni per ridurre al minimo la potenziale regressione del rendimento quando cambiano le statistiche o l'ottimizzatore delle query.
Rimuovi le istruzioni DDL che impostano le opzioni dell'ottimizzatore.
Flusso di modifiche
Osserva e trasmette in streaming le modifiche ai dati di un database Spanner (inserimenti, aggiornamenti ed eliminazioni) quasi in tempo reale.
Rimuovi eventuali istruzioni DDL relative ai modifiche in tempo reale.
Leader predefinito
Ti consente di specificare il leader per il tuo database nelle configurazioni a due e più regioni.
Rimuovi eventuali istruzioni DDL che impostano spanner.default_leader.
Partizionamento geografico
Ti consente di segmentare ulteriormente e archiviare le righe nella tabella del database in diverse configurazioni di istanze.
Rimuovi eventuali istruzioni DDL relative al partizionamento geografico.
Sequenze
Spanner supporta solo la sequenza bit_reversed_positive.
Sostituisci bit_reversed_positive con una sequenza disponibile in PostgreSQL.

Migrazione dello schema

Puoi esportare uno schema di database in dialetto PostgreSQL in sintassi PostgreSQL. Per i database configurati per utilizzare l'interfaccia PostgreSQL, puoi farlo con psql utilizzando PGAdapter, il proxy sidecar che ti consente di utilizzare librerie client o driver PostgreSQL standard per connetterti a Spanner:

psql -v ON_ERROR_STOP=1 \
  --host "$PGADAPTER_HOST" \
  --port "$PGADAPTER_PORT" \
  --dbname "$SPANNER_DATABASE" \
  -qAtX \
  -c "show database ddl"

Puoi anche utilizzare il seguente comando gcloudper generare lo schema come script SQL compatibile con PostgreSQL:

gcloud spanner databases ddl describe databasename

Se il database utilizza estensioni dello schema specifiche di Spanner, come quelle descritte in Estensioni di gestione dello schema, vengono elencate quando esegui questo comando. Devi rimuoverli prima di eseguire la migrazione dello schema a PostgreSQL.

Migrazione dei dati

L'interfaccia PostgreSQL di Spanner supporta le estensioni COPY TO STDIN e STDOUT di PostgreSQL utilizzando PGAdapter. Questo è uno dei modi per caricare i dati in Spanner e viceversa. Scopri di più sul comando COPY nella documentazione dello strumento a riga di comando psql per Spanner.

Questo script esporta quantità minori di dati (consigliato per meno di 100 GB di dati) dall'interfaccia PostgreSQL di Spanner nel nuovo database PostgreSQL:

psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"

Per tabelle più grandi (superiori o uguali a 100 GB di dati), puoi avviare un'esportazione di Dataflow in un modello CSV.

Puoi eseguire migrazioni dei dati in tempo reale utilizzando il connettore Debezium Kafka per trasmettere in streaming gli aggiornamenti di Spanner in PostgreSQL. Puoi personalizzarlo ulteriormente se utilizzi l'API Spanner Change Streams per accedere direttamente agli stream Change Data Capture (CDC).

Migrazione delle query

L'interfaccia PostgreSQL per Spanner implementa gran parte della sintassi, delle funzioni e degli operatori di query PostgreSQL più comuni.

Se utilizzi i suggerimenti nelle query, non devi riscriverle perché i suggerimenti per le query su Spanner sono definiti in commenti compatibili con PostgreSQL:

SELECT s.FirstName, s.LastName,
 s.SingerInfo, a.AlbumTitle, a.Charts
FROM Singers AS s
LEFT OUTER JOIN/*@JOIN_METHOD=APPLY_JOIN*/ Albums AS a
 ON s.SingerId = a.SingerId;

Questi commenti vengono elaborati dal pianificatore delle query di Spanner, ma un database PostgreSQL li ignora, quindi puoi includerli o rimuoverli.

Per ottenere prestazioni ottimali nel nuovo ambiente, le query e lo schema del database (ad esempio gli indici) potrebbero richiedere l'ottimizzazione per il nuovo ambiente. Ti consigliamo di eseguire controlli di benchmark per confermare questa affermazione in modo empirico.

Migrazione di applicazioni

Per quanto riguarda la connettività dalle tue applicazioni, la strategia di migrazione dipende dalle scelte iniziali fatte durante la configurazione dell'applicazione per l'utilizzo di Spanner, ad esempio se utilizzi driver PostgreSQL, driver Spanner o librerie client Spanner. Questa sezione descrive le considerazioni per ogni opzione.

Driver PostgreSQL

Spanner supporta i client PostgreSQL comuni utilizzando PGAdaper, un proxy leggero che traduce il protocollo di comunicazione PostgreSQL nelle API di query gRPC di basso livello di Spanner. Se utilizzi uno di questi, il passaggio a un target PostgreSQL diverso comporta l'aggiornamento della stringa di connessione in modo che punti direttamente al nuovo database PostgreSQL anziché al proxy PGAdapter. Questo approccio offre buone prestazioni e una forte compatibilità, quindi è adatto quando la portabilità è una priorità. La maggior parte delle query eseguite sull'interfaccia PostgreSQL di Spanner funziona allo stesso modo in altri ambienti PostgreSQL. Tuttavia, il contrario non è necessariamente vero; PostgreSQL supporta sintassi e funzionalità che Spanner non supporta.

Driver di Spanner

Questi driver sono implementazioni specifiche di Spanner per linguaggi e framework di applicazioni comuni. Ad esempio, il driver JDBC (Java) di Spanner implementa la stessa API del driver JDBC di PostgreSQL, pertanto le applicazioni che utilizzano il driver JDBC di Spanner possono aggiornare il processo di compilazione per collegare il driver PostgreSQL integrato equivalente quando vogliono eseguire l'applicazione con PostgreSQL. Questa opzione è ideale se utilizzi già Spanner o se stai cercando una soluzione ad alte prestazioni che sfrutta le funzionalità di Spanner come l'API Mutations, che non verrebbe esposta utilizzando un driver PostgreSQL integrato. Se hai bisogno di compatibilità completa con i driver integrati e apprezzi la portabilità, ti consigliamo di utilizzare i driver integrati di PostgreSQL con PGAdapter per garantire un certo livello di portabilità delle applicazioni.

Per ulteriori informazioni, consulta Driver e ORM PostgreSQL.

Librerie client di Spanner

Spanner offre anche varie librerie client idiomatiche che forniscono accesso diretto a Spanner senza implementare o utilizzare un'interfaccia standardizzata PostgreSQL. Questi client forniscono il massimo accesso alle funzionalità specifiche di Spanner, ma non sono compatibili con l'API dei driver PostgreSQL. Queste opzioni offrono il livello più elevato di prestazioni delle funzionalità, ma sono meno portabili rispetto alle opzioni sopra menzionate.

Passaggi successivi