Questa pagina descrive il funzionamento di Spanner con le chiavi principali e offre strategie di migrazione delle chiavi principali per i seguenti casi d'uso:
- Migrazione dei database delle chiavi UUID
- Migrazione di database a istanza singola con chiavi sequenziali
- Migrazione dei database delle chiavi sequenziali con il supporto del passaggio al nuovo sistema in tempo reale
- Migrazione dei database di chiavi sequenziali con dipendenze di logica dell'applicazione
Un approccio tipico alle chiavi primarie è l'utilizzo di chiavi surrogate come i numeri con incremento automatico. Queste chiavi principali offrono la flessibilità necessaria per ottimizzare le chiavi ora e in futuro, anche se la logica aziendale cambia. In un database a singola istanza con volume ridotto, le chiavi sequenziali hanno un buon rendimento. Tuttavia, in un sistema distribuito, le chiavi sequenziali non si adattano bene.
Chiavi primarie sequenziali in Spanner
In Spanner, ogni tabella ha una chiave primaria composta da una o più colonne della tabella. La chiave primaria della tabella identifica in modo univoco ogni riga in una tabella. Spanner utilizza la chiave primaria per distribuire gruppi di righe, chiamati split, tra i nodi di calcolo di un'istanza Spanner. Questo processo è chiamato suddivisione in parti dell'intervallo e consente a Spanner di eseguire in parallelo le query e di scalare.
Quando hai righe con chiavi principali i cui valori sono molto vicini, come le chiavi monotoniche con incremento automatico, tendono a trovarsi nella stessa suddivisione. In questo modo, si può creare un hotspot in cui la suddivisione può utilizzare tutte le risorse di calcolo e memoria disponibili. Un hotspot potrebbe comportare un aumento della latenza, con potenziali timeout e transazioni interrotte.
Per sfruttare la scalabilità di Spanner ed evitare gli hotspot, Spanner offre soluzioni integrate come alternative alle chiavi principali con incremento automatico.
Consigli per le chiavi principali
Il consiglio predefinito per le chiavi principali in Spanner è di utilizzare valori UUID (Universally Unique Identifier) versione 4 (UUIDv4). Gli UUID sono identificatori di 128 bit che utilizzano 122 bit di dati casuali. I valori UUIDv4 hanno una vasta gamma di valori e sono effettivamente univoci indipendentemente da dove vengono generati. Ciò li rende candidati ideali per le chiavi principali non hotspot in Spanner.
Ti consigliamo di utilizzare chiavi principali intere perché occupano meno spazio e riducono la complessità delle modifiche dell'applicazione che dovrai apportare. Puoi utilizzare una sequenza positiva con inversione dei bit per generare valori di chiavi principali univoci distribuiti uniformemente nello spazio di interi a 64 bit positivi.
Per saperne di più su come scegliere una chiave primaria per evitare hotspot, consulta le best practice per la progettazione degli schemi.
Strategie di migrazione
A seconda del caso d'uso e delle esigenze dell'applicazione, puoi implementare una strategia di migrazione della chiave primaria. Ognuna di queste strategie di migrazione:
- Assicurati l'accuratezza e la correttezza delle chiavi principali sottoposte a migrazione.
- Riduci al minimo le modifiche alle applicazioni a valle, ad esempio la modifica di tipi o valori della chiave primaria.
- Implementa le best practice di Spanner per prestazioni e scalabilità.
- Spanner modifica solo il metodo di generazione dei nuovi dati e non influisce sui dati esistenti.
Migrazione dei database delle chiavi UUID
Supponiamo che tu stia eseguendo la migrazione da un database che utilizza chiavi primarie UUID in Spanner. Configura le chiavi UUID esistenti come stringhe nel database di origine e importale in Spanner così come sono. I valori UUID, in particolare la versione 4, sono effettivamente univoci indipendentemente da dove vengono generati.
Puoi utilizzare la funzione GENERATE_UUID()
(GoogleSQL,
PostgreSQL) su Spanner per eseguire la migrazione dei database con chiavi UUID.
Per istruzioni sulla migrazione dei database delle chiavi UUID, consulta Eseguire la migrazione delle colonne delle chiavi UUID.
Migrazione di database a singola istanza con chiavi sequenziali
Supponiamo che tu stia eseguendo la migrazione da un database a istanza singola che utilizza chiavi monotoniche sequenziali, come
AUTO_INCREMENT
in MySQL, SERIAL
in PostgreSQL o il tipo IDENTITY
standard in SQL Server o Oracle.
Configura l'oggetto Spanner SEQUENCE
in modo da saltare i valori nell'intervallo delle chiavi esistenti e generare nuove chiavi con i bit invertiti. Le chiavi con inversione dei bit generate dall'oggetto Spanner SEQUENCE
sono sempre maggiori di zero e sono distribuite uniformemente nello spazio di interi positivi a 64 bit.
Per istruzioni su come eseguire la migrazione dei database con chiavi sequenziali, consulta Eseguire la migrazione delle chiavi primarie sequenziali generate automaticamente.
Migrazione di database di chiavi sequenziali con supporto del passaggio dal vivo
Supponiamo che tu stia eseguendo la migrazione da un database a singola istanza che utilizza chiavi monotoniche sequenziali a Spanner e supporti scenari di replica, ad esempio vuoi eseguire un passaggio dal vivo tra i sistemi di database.
Configura l'oggetto SEQUENCE
di Spanner per saltare l'intero intervallo di valori
delle chiavi esistenti nel database di origine e generare nuove chiavi con i bit invertiti
su Spanner. Le chiavi con i bit invertiti generate dall'oggetto Spanner
SEQUENCE
sono sempre maggiori di zero, ma non sono ordinate.
Per istruzioni sulla migrazione dei database che supportano il passaggio dal live, consulta Utilizzare Spanner e il database di origine.
Migrazione di database di chiavi sequenziali con dipendenze dalla logica dell'applicazione
Supponiamo che tu stia eseguendo la migrazione da un database che utilizza chiavi monotoniche sequenziali e che la logica della tua applicazione si basi sull'ordine della chiave principale per determinare la pertinenza o per ordinare i dati appena creati.
Crea una chiave composta che combini un valore distribuito in modo uniforme, ad esempio un ID shard o un hash, come primo componente e un numero sequenziale come secondo componente. In questo modo vengono conservati i valori delle chiavi ordinate senza causare un hotspot su larga scala.
Per istruzioni su come eseguire la migrazione dei database di chiavi sequenziali con dipendenze della logica di applicazione, consulta Eseguire la migrazione delle chiavi primarie.
Passaggi successivi
- Per visualizzare i flussi di lavoro di migrazione dettagliati, vedi Eseguire la migrazione delle chiavi primarie.