Questo documento contiene informazioni che aiutano a pre-suddividere il database.
Spanner gestisce le suddivisioni del database e scala in risposta alle variazioni di carico e dimensione. Le suddivisioni e l'unione sono dinamiche e basate sul traffico. Quando una suddivisione riceve più traffico, Spanner lo suddivide in intervalli più piccoli e ridistribuisce le suddivisioni risultanti su altre risorse disponibili nell'istanza. Spanner unisce la suddivisione quando la suddivisione riceve costantemente meno traffico.
La suddivisione non è istantanea. Se la suddivisione e il ribilanciamento non riesce a stare al passo con il traffico, una suddivisione può potenzialmente utilizzare le risorse di calcolo e memoria disponibili. In questo caso, lo scheduler di lavoro di Spanner accoda ulteriori richieste, aumentando la latenza e portando potenzialmente a timeout e transazioni interrotte.
Pre-suddividendo il database, Spanner può essere pronto per un aumento prevedibile del traffico. Puoi pre-suddividere il database creando punti di suddivisione.
Valuta la possibilità di suddividere in anticipo il database nei seguenti scenari:
- Stai caricando per la prima volta un set di dati di grandi dimensioni in nuove tabelle e nuovi indici in un database Spanner, ad esempio un caricamento collettivo una tantum.
- Prevedi un aumento del carico del traffico in un database Spanner esistente nel prossimo futuro. Ad esempio, potresti dover supportare un evento di traffico elevato, come il lancio di un prodotto o una campagna di vendita.
Determinare il conteggio delle suddivisioni
Consigliamo di creare 10 punti di suddivisione per nodo. Poiché Spanner può suddividere e adattarsi rapidamente al traffico per le istanze più piccole, non è necessario pre-suddividere le istanze più piccole.
Determinare i punti di suddivisione
Considera quanto segue quando determini i punti di suddivisione per il tuo database:
Se il traffico è distribuito uniformemente nell'intervallo di chiavi, ad esempio quando utilizzi UUID o chiavi di sequenza invertite a bit, scegli punti di suddivisione che dividono in modo uniforme lo spazio della chiave post-traffico.
Se il tuo traffico è concentrato su un insieme di intervalli di chiavi noti, suddividi e isola questi intervalli di chiavi.
Se prevedi traffico sui tuoi indici, utilizza i punti di suddivisione sull'indice corrispondente.
Le tabelle con interleaving vengono suddivise se vengono aggiunti punti di suddivisione alla tabella padre. Se prevedi un traffico più elevato per la tabella con interleaving, assicurati di utilizzare i punti di suddivisione nella tabella con interleaving corrispondente.
Puoi allocare i punti di suddivisione agli oggetti dello schema in modo proporzionale al loro aumento del traffico.
Flusso di lavoro di esempio per la determinazione dei punti di suddivisione
Supponi che il database abbia le strutture delle tabelle definite dal seguente DDL:
CREATE TABLE UserInfo (
UserId INT64 NOT NULL,
Info BYTES(MAX),
) PRIMARY KEY (UserId);
CREATE TABLE UserLocationInfo (
UserId INT64 NOT NULL,
LocationId STRING(MAX) NOT NULL,
ActivityData BYTES(MAX),
) PRIMARY KEY (UserId, LocationId), INTERLEAVE IN PARENT UserInfo ON DELETE CASCADE;
CREATE INDEX UsersByLocation ON UserLocationInfo(LocationId);
UserId
è un hash generato casualmente nello spazio INT64
. Devi aggiungere
100 punti di suddivisione per distribuire uniformemente l'aumento previsto del traffico nella
tabella UserInfo
e nelle relative tabelle con interleaving. Poiché i punti di suddivisione sono
distribuiti in modo uniforme, devi trovare il numero di righe, ovvero offset
, tra
ogni punto di suddivisione:
offset
= valore massimo dell'intervallo UserId
/ 99
Quindi, i punti di suddivisione della tabella UserInfo
vengono determinati a partire dalla prima
riga di UserId
, ovvero UserId_first
. Per determinare l'ennesimo punto di suddivisione,
utilizza il seguente calcolo:
Punto di divisione N: UserId_first
+ (offset
* (N-1))
Ad esempio, il primo punto di suddivisione è UserId_first
+ (offset
* 0) e
il terzo punto di suddivisione è UserId_first
+ (offset
* 2).
Poiché la tabella UserLocationInfo
è con interleaving della tabella UserInfo
, è suddivisa anche in corrispondenza dei limiti UserId
. Potresti anche voler creare
punti di suddivisione nella tabella UserLocationInfo
della colonna LocationId
.
Tieni presente che LocationId
segue il formato $COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER
, ad esempio US_CA_SVL_MTL_1100_7
.
Per un UserId
, in base al prefisso della stringa LocationId
puoi
determinare le suddivisioni per inserire la tabella UserLocationInfo
per UserId
in 3
paesi diversi in 3 diverse suddivisioni:
- Punto di suddivisione 1: (1000, "CN")
- Punto di suddivisione 2: (1000, "FR")
- Punto di suddivisione 3: (1000, "US")
Puoi aggiungere nuovi punti di suddivisione utilizzando solo un prefisso e non è necessario che corrisponda al formato specificato per una colonna o un indice. In questo esempio, i punti di suddivisione non
corrispondono al formato specificato per LocationId
e utilizzano solo $COUNTRY
come
prefisso.
Se vuoi suddividere l'indice UsersByLocation
, puoi distribuire uniformemente i punti di suddivisione nella colonna LocationId
o isolare alcuni valori della colonna LocationId
che prevedi riceveranno un aumento del traffico:
- Punto di suddivisione 1: "CN"
- Punto di suddivisione 2: "US"
- Punto di suddivisione 3: "US_NYC"
Puoi suddividere ulteriormente l'indice utilizzando le parti principali della tabella indicizzata per le località che ricevono un volume di traffico ancora maggiore. Ad esempio, se prevedi che la località CN
riceverà un aumento del traffico, potresti introdurre i seguenti punti di suddivisione:
- Punto di suddivisione 1: "CN" e TableKey: (1000, "CN")
- Punto di suddivisione 2: "CN" e TableKey: (2000, "CN")
- Punto di suddivisione 3: "CN" e TableKey: (3000, "CN")
Scadenza del punto di suddivisione
Puoi impostare una scadenza per ogni punto di suddivisione. A seconda del caso d'uso, imposta i punti di suddivisione in modo che scadano dopo che l'aumento previsto del traffico si sarà interrotto.
La scadenza predefinita è di 10 giorni dal momento della creazione o dell'aggiornamento della suddivisione. La scadenza massima consentita è di 30 giorni dalla creazione o dall'aggiornamento della suddivisione.
Alla scadenza della suddivisione, Spanner assume la gestione della suddivisione e non puoi più visualizzarla. Spanner potrebbe unire la suddivisione a seconda del traffico.
Puoi anche aggiornare la scadenza di un punto di suddivisione prima che scada. Ad esempio, se l'aumento del traffico non è sceso, puoi aumentare il tempo di scadenza della suddivisione. Se non hai più bisogno di un punto di suddivisione, puoi impostarlo in modo che scada immediatamente. Per informazioni su come impostare la scadenza dei punti di suddivisione, consulta Come far scadere un punto di suddivisione.
Risultati del pre-splitting del database
Dopo l'aggiunta dei punti di suddivisione, è probabile che si verifichino i seguenti risultati:
Modifiche relative alla latenza: l'aggiunta di punti di suddivisione è un modo per simulare l'aumento del traffico sul database. Quando un database ha più suddivisioni, possono verificarsi aumenti permanenti della latenza di lettura e scrittura dovuti a un maggior numero di partecipanti alle transazioni e suddivisioni delle query. Puoi anche aspettarti un aumento dell'utilizzo di computing e query per richiesta di lettura o scrittura.
Efficacia dei punti di suddivisione: per determinare se i punti di suddivisione aggiunti sono utili, monitora il profilo di latenza per modifiche minime e il visualizzatore chiave per gli hotspot. Se noti degli hotspot, puoi far scadere i punti di suddivisione immediatamente e crearne di nuovi. Per ulteriori informazioni sui punti di suddivisione in scadenza, consulta Come far scadere un punto di suddivisione. Valuta la possibilità di introdurre un numero inferiore di suddivisioni nella prossima iterazione di aggiunta di suddivisioni e osserva il profilo di latenza.
Comportamento dei punti di suddivisione dopo l'aumento del traffico: i punti di suddivisione aggiunti devono essere rimossi una volta che l'aumento del traffico si è stabilizzato. La distribuzione divisa potrebbe non convergere alla posizione attuale prima dell'aumento del carico. Il database potrebbe stabilirsi su un profilo di latenza diverso a causa della variazione del traffico e della suddivisione necessaria per supportare il traffico.
Caso d'uso di esempio
Tieni presente che sei un amministratore di database presso un'azienda di videogiochi e che prevedi un aumento del traffico per il lancio di un nuovo gioco. Ti aspetti il traffico su nuove tabelle vuote.
Devi assicurarti che non ci siano interruzioni del servizio quando arriva il traffico, in modo che non ci sia alcun impatto osservabile sulla latenza o sulle percentuali di errore.
Considera la seguente strategia di pre-splitting generale per questo caso d'uso:
Identificare il numero di nodi necessari all'istanza per supportare l'aumento del traffico. Per informazioni su come identificare il numero di nodi, consulta Panoramica delle prestazioni. Se utilizzi il gestore della scalabilità automatica, imposta il parametro del limite massimo sul numero di nodi identificato. Inoltre, imposta il parametro del limite minimo su (numero di nodi identificato / 5).
Identifica le tabelle e gli indici con più traffico e che possono trarre il massimo vantaggio dall'utilizzo dei punti di suddivisione. Analizza i dati attuali e scegli se usare punti di suddivisione personalizzati o punti di suddivisione distribuiti uniformemente.
Crea i punti di suddivisione non prima di sette giorni e non oltre 12 ore prima dell'aumento previsto del traffico.
Verifica che le suddivisioni siano state create. Per visualizzare i punti di suddivisione creati in un'istanza, vedi Visualizzare i punti di suddivisione.
Precisazioni
Tieni presente le seguenti avvertenze durante la creazione dei punti di suddivisione:
Eliminazione di tabelle, indici e database: prima di eliminare una tabella, un indice o un database, devi assicurarti che tutti i punti di suddivisione aggiunti corrispondenti siano scaduti. A tale scopo, imposta la data di scadenza della suddivisione sull'ora attuale. Ciò è necessario per recuperare la quota a livello di istanza. Per ulteriori informazioni sui punti di suddivisione in scadenza, consulta Come far scadere un punto di suddivisione.
Backup e ripristino dei database: non viene eseguito il backup delle suddivisioni aggiunte. Devi creare suddivisioni su un database ripristinato.
Scalabilità automatica asimmetrica: se utilizzi la scalabilità automatica asimmetrica, il conteggio dei nodi utilizzato per determinare il conteggio dei punti di suddivisione è il numero minimo di nodi in tutte le regioni.
Aumento temporaneo delle metriche di utilizzo dello spazio di archiviazione: l'aggiunta di punti di suddivisione aumenta temporaneamente la metrica spazio di archiviazione totale del database fino a quando Spanner non completa la compattazione. Per maggiori informazioni, consulta Utilizzo dello spazio di archiviazione. Questo si verifica solo quando gli intervalli di chiavi esistenti vengono suddivisi ulteriormente e non quando vengono suddivisi nuovi intervalli di chiavi.
Devi creare i punti di suddivisione non prima di sette giorni e non oltre 12 ore prima dell'aumento previsto del traffico.
Limiti prima della suddivisione
Il pre-suddivisione del database presenta le seguenti limitazioni:
Non puoi presuddividere gli indici di ricerca. Devi solo presuddividere la tabella di base. Per maggiori informazioni, consulta la pagina relativa allo partizionamento orizzontale degli indici di ricerca.
Non puoi presuddividere gli indici vettoriali. Per maggiori informazioni sugli indici vettoriali, vedi Indice vettoriale.
Per saperne di più sulle quote per i punti di suddivisione, consulta Quote e limiti.